diff --git a/.gitignore b/.gitignore index 36ad4901..fe733f8b 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/README-EN.md b/README-EN.md new file mode 100644 index 00000000..11044f8f --- /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. +

+ +

+ + +License: GPL-3.0 +

+ +

+ Download v3.0.0 : + [Android] • + [iOS] • + [MacOS] • + [Windows] • + [Web] +

+ +

FlutterUnit App

+ +--- + + +### Env and Build + +#### Flutter Version + +``` +·]>> flutter --version +Flutter 3.32.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision be698c48a6 (2 days ago) • 2025-05-19 12:59:14 -0700 +Engine • revision 1881800949 (2 days ago) • 2025-05-19 10:54:07 -0700 +Tools • Dart 3.8.0 • DevTools 2.45.1 +``` + +#### 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 桌面版本组件界面 + +![](./doc/screens/macos-2.webp) + +#### Windows 桌面版本组件界面 + +![](./doc/screens/windows-1.png) + + +> 开源不易,请我喝咖啡 ~ + +![](./doc/ewm/coffee1.png) + + + +#### Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=toly1994328/FlutterUnit&type=Date)](https://star-history.com/#toly1994328/FlutterUnit&Date) + +### 一、组件的展示页面 + +#### 1. `300+组件收录` + +> Flutter源码中的可用的组件一共350个左右,纷繁复杂,也没有明确的分类标准 +FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。并`根据个人感觉进行评星 ` +`目前收录组件306个`,每个都有至少一个演示展现和代码展示。 + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6acf7b8a1d~tplv-t2oaga2asx-zoom-1.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad06db455~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad085632b~tplv-t2oaga2asx-image.image) | + +--- + +#### 2. 组件详情页 + +> `213个组件`全部都有详情页。对于重要的组件会详细展现 +一般都会有某个演示对应的组件和属性,尽量做到细致,如果有需要补充,欢迎联系我。 +`最重要的是: 所有的演示展现都是Flutter的组件形成的,而非图片,这就意味着可操作性更高。` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad8ba98f1~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6afb3841c4~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6afb590185~tplv-t2oaga2asx-image.image) | +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b0ad26b14~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b13d3fb5b~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b15efec19~tplv-t2oaga2asx-image.image)| + +--- + +#### 3. 组件的可操作性 + +> 对一些操作交互的组件或有可操作性的某些组件,`提供操作演示` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b177c5b67~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b21cc116a~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b2486b5a5~tplv-t2oaga2asx-image.image)| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b34887a94~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b3ca09b47~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b3d4e0253~tplv-t2oaga2asx-image.image)| + +--- + +#### 4. 相关组件的关联切换 +> `相关组件通过link to 可以进行切换, 满足你的探索欲。` +如果有的关联未加入,欢迎联系我,对我来说,加个数字就行了。 + +| . | . | . | +|------|------------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b4a4d6005~tplv-t2oaga2asx-image.image)|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b5066fbf0~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b5359b695~tplv-t2oaga2asx-image.image)| + + +--- + +#### 5. 代码的查看和分享 +> 激动人心的是,你可以通过右侧的图标`展开/隐藏 实现下面效果的代码` +并且`支持分享`,如果你想亲自体验,so,easy ! 而且`代码高亮样式可以自定义`。 + + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b6badc1bb~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b6e75653c~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b72cdd78f~tplv-t2oaga2asx-image.image)| + +--- + + +### 二、全局配置 + +#### 1. 颜色主题 +> 只提供八种颜色,可在`右滑菜单页`的`我的主题`配置,`可以拓展` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c2e937170~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c3253c4ec~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c4f97f74d~tplv-t2oaga2asx-image.image) | + +--- + + +#### 2.字体配置 + +> 支持全局字体设置,`可以拓展` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c5448cb6c~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c55542837~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c5bec6c56~tplv-t2oaga2asx-image.image)| +--- + + +#### 3.item样式设置 + +> 支持item样式设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案` + +| . | . | . | +|------|------------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c7d4b5988~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c8935dfe1~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c8f90d6ec~tplv-t2oaga2asx-image.image)| +--- + +#### 4.代码面板风格设置 + +> 支持代码风格设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案` + +| . | . | +|------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cac86d591~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cac7d5bc7~tplv-t2oaga2asx-image.image)| +![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cb75e5450~tplv-t2oaga2asx-image.image)|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cd88c7ff9~tplv-t2oaga2asx-image.image)| + +--- + + + +### 三、搜索与收藏功能 + + +#### 1.搜索功能 + +> 由于Flutter中Widget比较杂乱,不太好分类,所以搜索是非常重要的 +另外可以根据星级进行过滤,支持多选。目前正在考虑根据功能分类,之后会有所完善。 + + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c1a355ad3~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c211dfc99~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c28562ec5~tplv-t2oaga2asx-image.image) | + +--- + +#### 2.收藏功能 + +| 添加收藏集 | 修改收藏集 | 删除收藏集 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b7979f4ae~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b97f00113~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ba47f3fd2~tplv-t2oaga2asx-image.image) | + +| 长按右菜单滑页 | 长按左菜单滑页 | 详情内长按展示收藏菜单 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6beb370b8b~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6befe43cd2~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6bfd3cd42f~tplv-t2oaga2asx-image.image) | + +| 删除与数据同步 | 组件加入收藏集 | 收藏集支持多选 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ba47ab64c~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6badf6ee28~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6bb380c7f5~tplv-t2oaga2asx-image.image) | + +> `FlutterUnit 2.0 `目前基本就是这么多功能,可以在Github中下载打包后的apk玩玩 +希望能对你的Flutter学习有所帮助。 + +--- diff --git a/README.md b/README.md index 7fca74a3..9e430602 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,65 @@ +

+ + FlutterUnit
+
+ ⭐️ 全平台 Flutter 探索应用 ⭐️
+

+ +

+FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flutter 带来的创造力。 +

+ +

+ + +License: GPL-3.0 +

+ +

+ 下载 App: + [Android] • + [iOS] • + [MacOS] • + [Windows] • + [Web] +

+ +

FlutterUnit App

+ +--- + +### 环境与构建 + +#### Flutter 版本 + +``` +·]>> flutter --version +Flutter 3.32.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision be698c48a6 (2 days ago) • 2025-05-19 12:59:14 -0700 +Engine • revision 1881800949 (2 days ago) • 2025-05-19 10:54:07 -0700 +Tools • Dart 3.8.0 • DevTools 2.45.1 +``` + +#### 构建应用 + +``` +·]>> 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://juejin.cn/book/7212822723330834487) - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) - 🔥 [掘金小册 -《Flutter 手势探索 - 执掌天下》](https://juejin.cn/book/6896378716427911181) @@ -14,27 +74,6 @@ - [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41) - [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point) -### FlutterUnit 下载体验: 复制链接,在浏览器下载~ - -| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | -|------|------------|------|------------| -| 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](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《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)| - ---- - -> 当前Flutter 版本 - -``` -Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision b06b8b2710 (10 days ago) • 2023-01-23 16:55:55 -0800 -Engine • revision b24591ed32 -Tools • Dart 2.19.0 • DevTools 2.20.1 -``` - --- #### MacOS 桌面版本组件界面 @@ -46,6 +85,15 @@ Tools • Dart 2.19.0 • DevTools 2.20.1 ![](./doc/screens/windows-1.png) +> 开源不易,请我喝咖啡 ~ + +![](./doc/ewm/coffee1.png) + + + +#### Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=toly1994328/FlutterUnit&type=Date)](https://star-history.com/#toly1994328/FlutterUnit&Date) ### 一、组件的展示页面 diff --git a/analysis_options.yaml b/analysis_options.yaml index 2fdeaeb0..d54e87f3 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -10,21 +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 file_names: false - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +analyzer: +# exclude: +# - modules/widget_system/widgets/** + + + diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index b3a3b1d7..00000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,70 +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 33 - - 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 - multiDexEnabled true - archivesBaseName = "FlutterUnit.apk" - } - - 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 00000000..d73f8c2d --- /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 00000000..e9ffa01a --- /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 932ba74d..67873441 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ - + + + + @@ -28,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 00000000..8dd52f79 --- /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 b1545c3d..b09da0bc 100644 Binary files a/assets/flutter.db and b/assets/flutter.db differ diff --git a/assets/fonts/BalooBhai2-Regular.ttf b/assets/fonts/BalooBhai2-Regular.ttf index e69de29b..21a94309 100644 Binary files a/assets/fonts/BalooBhai2-Regular.ttf and b/assets/fonts/BalooBhai2-Regular.ttf differ diff --git a/assets/fonts/CHOPS.ttf b/assets/fonts/CHOPS.ttf new file mode 100644 index 00000000..137e1db1 Binary files /dev/null and b/assets/fonts/CHOPS.ttf differ diff --git a/assets/fonts/ComicNeue-Regular.ttf b/assets/fonts/ComicNeue-Regular.ttf index e69de29b..cbfed157 100644 Binary files a/assets/fonts/ComicNeue-Regular.ttf and b/assets/fonts/ComicNeue-Regular.ttf differ diff --git a/assets/fonts/Inconsolata-Regular.ttf b/assets/fonts/Inconsolata-Regular.ttf index e69de29b..18a07080 100644 Binary files a/assets/fonts/Inconsolata-Regular.ttf and b/assets/fonts/Inconsolata-Regular.ttf differ diff --git a/assets/fonts/IndieFlower-Regular.ttf b/assets/fonts/IndieFlower-Regular.ttf index e69de29b..1070aacd 100644 Binary files a/assets/fonts/IndieFlower-Regular.ttf and b/assets/fonts/IndieFlower-Regular.ttf differ diff --git a/assets/fonts/Neucha-Regular.ttf b/assets/fonts/Neucha-Regular.ttf index e69de29b..a9b91580 100644 Binary files a/assets/fonts/Neucha-Regular.ttf and b/assets/fonts/Neucha-Regular.ttf differ diff --git a/assets/iconfont/iconfont.ttf b/assets/iconfont/iconfont.ttf deleted file mode 100644 index 5860038f..00000000 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 00000000..f112440c 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 426ab0cc..3d4102c0 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 00000000..34298068 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 00000000..1d21f46f 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 00000000..79859859 Binary files /dev/null and b/assets/images/coffee_zfb.webp differ diff --git a/assets/images/widgets/Autocomplete.svg b/assets/images/widgets/Autocomplete.svg new file mode 100644 index 00000000..653b4f5a --- /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 00000000..e4f8b66d --- /dev/null +++ b/assets/images/widgets/Banner.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Card.svg b/assets/images/widgets/Card.svg new file mode 100644 index 00000000..b69099b8 --- /dev/null +++ b/assets/images/widgets/Card.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Card.webp b/assets/images/widgets/Card.webp deleted file mode 100644 index 9f8452a4..00000000 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 00000000..cea4cbee --- /dev/null +++ b/assets/images/widgets/Chip.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Chip.webp b/assets/images/widgets/Chip.webp deleted file mode 100644 index 1be3bfa8..00000000 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 00000000..eafafcb4 --- /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 00000000..be18043d --- /dev/null +++ b/assets/images/widgets/Container.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Container.webp b/assets/images/widgets/Container.webp deleted file mode 100644 index 0cc509a9..00000000 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 00000000..7a3f6fdd --- /dev/null +++ b/assets/images/widgets/FilterChip.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/FloatingActionButton.svg b/assets/images/widgets/FloatingActionButton.svg new file mode 100644 index 00000000..dfe23295 --- /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 00000000..6a82787f --- /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 00000000..8d3a0001 --- /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 00000000..2d7f6874 --- /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 00000000..dd64950c --- /dev/null +++ b/assets/images/widgets/Icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/CHOPS.TTF b/assets/images/widgets/Image.svg similarity index 100% rename from assets/fonts/CHOPS.TTF rename to assets/images/widgets/Image.svg diff --git a/assets/images/widgets/InputChip.svg b/assets/images/widgets/InputChip.svg new file mode 100644 index 00000000..b739a7ae --- /dev/null +++ b/assets/images/widgets/InputChip.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/InputChip.webp b/assets/images/widgets/InputChip.webp deleted file mode 100644 index c6bb7883..00000000 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 00000000..4e10e658 --- /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 00000000..7ace688c --- /dev/null +++ b/assets/images/widgets/MaterialButton.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/PageView.svg b/assets/images/widgets/PageView.svg new file mode 100644 index 00000000..5dc3a701 --- /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 00000000..0dd5f661 --- /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 00000000..baddde13 --- /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 00000000..5f690258 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 00000000..2b327a5d --- /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 00000000..f9299096 --- /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 00000000..0a44c72c Binary files /dev/null and b/assets/images/wxgzh.webp differ diff --git a/assets/version.json b/assets/version.json index 79dcc07a..231c882a 100644 --- a/assets/version.json +++ b/assets/version.json @@ -1,3 +1,3 @@ { - "dbVersion": 2 + "dbVersion": 4 } \ No newline at end of file diff --git a/desiredFileName.txt b/desiredFileName.txt new file mode 100644 index 00000000..9e26dfee --- /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 00000000..fa0b357c --- /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/ewm/coffee1.png b/doc/ewm/coffee1.png new file mode 100644 index 00000000..dbbf38bc Binary files /dev/null and b/doc/ewm/coffee1.png differ diff --git a/doc/screens/preview.webp b/doc/screens/preview.webp new file mode 100644 index 00000000..79cf8b00 Binary files /dev/null and b/doc/screens/preview.webp differ diff --git a/doc/version/3.1.0.md b/doc/version/3.1.0.md new file mode 100644 index 00000000..d551bad2 --- /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 00000000..9afbc216 --- /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/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/ios/Podfile b/ios/Podfile index 1e8c3c90..88359b22 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 d163a216..42719a09 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,4 +1,41 @@ PODS: + - 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 - Flutter (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) @@ -9,6 +46,10 @@ PODS: - Flutter - r_upgrade (0.0.1): - Flutter + - 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): @@ -16,10 +57,15 @@ PODS: - sqflite (0.0.2): - Flutter - FMDB (>= 2.7.5) + - SwiftyGif (5.4.4) - url_launcher_ios (0.0.1): - Flutter + - webview_flutter_wkwebview (0.0.1): + - Flutter DEPENDENCIES: + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) @@ -28,12 +74,22 @@ DEPENDENCIES: - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - sqflite (from `.symlinks/plugins/sqflite/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 + - ReachabilitySwift + - SDWebImage + - SwiftyGif EXTERNAL SOURCES: + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" Flutter: :path: Flutter package_info_plus: @@ -50,18 +106,28 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/sqflite/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" SPEC CHECKSUMS: - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a + DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + file_picker: ce3938a0df3cc1ef404671531facef740d03f920 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 + package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7 + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 r_upgrade: 44d715c61914cce3d01ea225abffe894fd51c114 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 + SDWebImage: 1c39de67663e5eebb2f41324d5d580eeea12dd4c + share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028 shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + 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 6b87be1b..4d990781 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -76,7 +76,6 @@ 8124494143C478106CBB5535 /* Pods-Runner.release.xcconfig */, 64130BD95C8A67B133F535A6 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -200,10 +199,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -231,6 +232,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -340,7 +342,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -355,15 +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; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DISABLE_PUSH_NOTIFICATIONS=1", + ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@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"; @@ -417,7 +429,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -466,7 +478,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -483,15 +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; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DISABLE_PUSH_NOTIFICATIONS=1", + ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@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; @@ -505,15 +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; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DISABLE_PUSH_NOTIFICATIONS=1", + ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@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/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada47..eba2268a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf03..5768d4c4 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd96..a1610c71 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b0..157d749a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 4cde1211..62e62180 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index d0ef06e7..adab1c1e 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index dcdc2306..5e5dba9f 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd96..a1610c71 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8f..0e166cfa 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index a6d6b860..9394bba7 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png new file mode 100644 index 00000000..157d749a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b860..9394bba7 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164..09b0e89e 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d3..f4f8b8c4 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 6a84f41e..91e929a3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index d0e1f585..95decc3b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 58fd58cf..cf0fae5e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +26,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -43,5 +47,9 @@ UIViewControllerBasedStatusBarAppearance + NSPhotoLibraryUsageDescription + FlutterUnit 申请访问相册,以提升您的图片选择功能的体验 + NSPhotoLibraryAddUsageDescription + FlutterUnit 申请访问相册,以支持您保存图片到相册 diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 00000000..7312142f --- /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 a47f7e00..00000000 --- a/lib/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/temp/ \ No newline at end of file diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart deleted file mode 100644 index 90319835..00000000 --- a/lib/app/bloc_wrapper.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:app_update/app_update.dart'; -import 'package:authentication/authentication.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/painter_system/bloc/gallery_unit/bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.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; - - const BlocWrapper({Key? key, required this.child}) : super(key: key); - - @override - _BlocWrapperState createState() => _BlocWrapperState(); -} - -class _BlocWrapperState extends State { - final WidgetRepository repository = const WidgetDbRepository(); - - final CategoryBloc categoryBloc= CategoryBloc(repository: CategoryDbRepository()); - final AuthRepository authRepository = HttpAuthRepository(); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - // 全局 bloc : 维护应用存储状态、更新、认证 - BlocProvider(create: (_) => AppBloc(AppStateRepository())..initApp()), - BlocProvider(create: (_) => UpdateBloc()), - BlocProvider(create: (_) => AuthBloc(repository: authRepository)..add(const AppStarted())), - - BlocProvider(create: (_) => WidgetsBloc(repository: repository)), - BlocProvider(create: (_) => categoryBloc), - BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), - BlocProvider(create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), - BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), - ], child: widget.child); - } - - @override - void dispose() { - categoryBloc.close(); - LocalDb.instance.closeDb(); - super.dispose(); - } -} diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart deleted file mode 100644 index 9b03759c..00000000 --- a/lib/app/flutter_unit.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; - -import 'package:flutter_unit/app/router/unit_router.dart'; -import 'package:flutter_unit/app/views/splash/standard_unit_splash.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: 主程序 - -class FlutterUnit extends StatelessWidget { - const FlutterUnit({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocBuilder(builder: (_, state) { - return BlocProvider( - create: (_) => ColorChangeCubit(Cons.tabColors[0]), - child: DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp( - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - onGenerateRoute: UnitRouters.generateRoute, - localizationsDelegates: GlobalMaterialLocalizations.delegates, - supportedLocales: const [ - Locale('zh', 'CN'), - ], - themeMode: ThemeMode.light, - // themeMode: ThemeMode.dark, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), - // theme: ThemeData( - // primarySwatch: state.themeColor, - // fontFamily: state.fontFamily, - // ), - home: const StandardUnitSplash(), - ), - ), - ); - }); - } -} diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart deleted file mode 100644 index 0b9b82c3..00000000 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.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:components/toly_ui/toly_ui.dart'; -import 'package:flutter_unit/code_gen/code_gen_page.dart'; - -import 'package:flutter_unit/painter_system/gallery_unit.dart'; -import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/widget_panel.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../point_system/views/desk_ui/desk_point_page.dart'; -import '../home_drawer.dart'; -import 'unit_rail_navigation.dart'; - -class UnitDeskNavigation extends StatefulWidget { - - const UnitDeskNavigation(); - - @override - _UnitDeskNavigationState createState() => _UnitDeskNavigationState(); - -} - -class _UnitDeskNavigationState extends State { - late PageController _controller; //页面控制器,初始0 - int _currentIndex = 0; - - @override - void initState() { - super.initState(); - _controller = PageController(); - - // ActionUnit.searchAction.onSearch = () { - // Navigator.of(context).pushNamed(UnitRouter.search); - // }; - } - - @override - void dispose() { - _controller.dispose(); //释放控制器 - super.dispose(); - } - - // 构建悬浮按钮工具 - // Widget wrapOverlayTool({required Widget child}) => Builder( - // builder: (ctx) => OverlayToolWrapper( - // child: child, - // )); - - @override - Widget build(BuildContext context) { - return Scaffold( - drawer: const HomeDrawer(), - endDrawer: const HomeRightDrawer(), - body: Row( - children: [ - UnitRailNavigation( - selectedIndex: _currentIndex, - onItemClick: _onItemClick, itemData: { - //底栏图标 - "组件集录": TolyIcon.icon_layout, "收藏集录": TolyIcon.icon_star, - "绘制集录": Icons.palette, "代码生成": TolyIcon.icon_fast, - "要点集录": TolyIcon.icon_bug, - }, - ), - // _buildLeftNav(), - Expanded( - child: PageView( - physics: const NeverScrollableScrollPhysics(), - //使用PageView实现页面的切换 - controller: _controller, - children: const [ - DeskWidgetPanel(), - CollectPageAdapter(), - GalleryUnit(), - CodeGenPage(), - DeskPointPage(), - ], - ), - ), - ], - ), - ); - } - - void _onItemClick(int value) { - _currentIndex = value; - _controller.jumpToPage(_currentIndex); - setState(() { - - }); - } -} - - diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/app/navigation/desk_ui/unit_rail_navigation.dart deleted file mode 100644 index ca4dc363..00000000 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ /dev/null @@ -1,302 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class UnitRailNavigation extends StatelessWidget { - final ValueChanged onItemClick; - final int selectedIndex; - final Map itemData; - - const UnitRailNavigation( - {Key? key, - required this.onItemClick, - required this.selectedIndex, - required this.itemData}) - : super(key: key); - - List get info => itemData.keys.toList(); - List get icons => itemData.values.toList(); - - @override - Widget build(BuildContext context) { - // NavigationRail - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.only(top: 20), - alignment: Alignment.topCenter, - margin: const EdgeInsets.only(right: 1), - width: 120, - decoration: const BoxDecoration(color: Color(0xff2C3036), boxShadow: [ - BoxShadow(color: Colors.grey, offset: Offset(1, 0), blurRadius: 2) - ]), - child: Column( - children: [ - Wrap( - direction: Axis.vertical, - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - CircleImage( - image: AssetImage('assets/images/icon_head.webp'), - size: 60, - ), - Text( - '张风捷特烈', - style: TextStyle(color: Colors.white70), - ) - ], - ), - buildIcons(), - const Divider( - color: Colors.white, - height: 1, - endIndent: 20, - ), -// SizedBox(height: 60,), - Expanded( - flex: 5, - child: Center( - //const Size(120, 35) - child: Column( - mainAxisSize: MainAxisSize.min, - children: info - .asMap() - .keys - .map((int index) => _UnitRailMenu( - onTap: () {onItemClick.call(index);}, - selected: selectedIndex == index, - width: 120, - height: 35, activeColor: Theme.of(context).primaryColor, inactiveColor: - Colors.white.withAlpha(33), icon: icons[index],label: info[index], - )) - .toList(), - ) - - // RightNavBar( - // itemData: Cons.iconMap, - // onItemClick: onItemClick, - // color: Theme.of(context).primaryColor, - // ), - ), - ), - Expanded( - child: Container(), - flex: 1, - ), - const Divider( - indent: 20, - color: Colors.white, - height: 1, - ), - Builder( - builder: (ctx) => FeedbackWidget( - onPressed: () => Scaffold.of(ctx).openDrawer(), - child: const Padding( - padding: EdgeInsets.only(bottom: 20, top: 20), - child: Icon( - Icons.settings, - color: Colors.white, - ), - ), - ), - ), - ], - ), - ), - ); - ; - } - - Widget buildIcons() { - return Padding( - padding: const EdgeInsets.only(bottom: 20, top: 20), - child: Wrap( - spacing: 5, - children: [ - FeedbackWidget( - onPressed: () => _launchURL("http://blog.toly1994.com/"), - child: const Icon( - TolyIcon.icon_item, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => - _launchURL("https://github.com/toly1994328/FlutterUnit"), - child: const Icon( - TolyIcon.icon_github, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => - _launchURL("https://juejin.im/user/5b42c0656fb9a04fe727eb37"), - child: const Icon( - TolyIcon.icon_juejin, - color: Colors.white, - ), - ), - ], - ), - ); - } - - _launchURL(String url) async { - if (await canLaunch(url)) { - await launch(url); - } else { - debugPrint('Could not launch $url'); - } - } -} - -class RightNavBar extends StatefulWidget { - final Color color; - final Map itemData; - final ValueChanged onItemClick; - final Size itemSize; - - RightNavBar({ - this.color = Colors.blue, - required this.itemData, - required this.onItemClick, - this.itemSize = const Size(120, 35), - }); - - @override - _RightNavBarState createState() => _RightNavBarState(); -} - -class _RightNavBarState extends State { - int _position = 0; - - List get info => widget.itemData.keys.toList(); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: info - .map((e) => _buildChild(context, info.indexOf(e), widget.color)) - .toList(), - ); - } - - Widget _buildChild(BuildContext context, int i, Color color) { - var active = i == _position; - - return GestureDetector( - onTap: () => _tapTab(i), - child: Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - width: widget.itemSize.width, - child: UnconstrainedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - color: active ? widget.color : Colors.white.withAlpha(33), - borderRadius: const BorderRadius.only( - topRight: Radius.circular(20), - bottomRight: Radius.circular(20))), - width: active - ? widget.itemSize.width * 0.95 - : widget.itemSize.width * 0.85, - height: widget.itemSize.height, - child: Wrap( - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - widget.itemData[info[i]], - size: active ? 24 : 20, - color: active ? Colors.white : Colors.white70, - ), - Text( - info[i], - style: TextStyle( - color: active ? Colors.white : Colors.white70, - ), - ), - ], - ), - ), - ), - )); - } - - _tapTab(int i) { - setState(() { - _position = i; - if (widget.onItemClick != null) { - widget.onItemClick(_position); - } - }); - } -} - -class _UnitRailMenu extends StatelessWidget { - final VoidCallback onTap; - final bool selected; - final Color activeColor; - final Color inactiveColor; - final double width; - final double height; - final IconData icon; - final String label; - - const _UnitRailMenu({ - Key? key, - required this.onTap, - required this.selected, - required this.width, - required this.activeColor, - required this.inactiveColor, - required this.height, - required this.icon, - required this.label, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - width: width, - child: UnconstrainedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - color: selected ? activeColor : inactiveColor, - borderRadius: const BorderRadius.only( - topRight: Radius.circular(20), - bottomRight: Radius.circular(20))), - width: selected ? width * 0.95 : width * 0.85, - height: height, - child: Wrap( - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - icon, - size: selected ? 24 : 20, - color: selected ? Colors.white : Colors.white70, - ), - Text( - label, - style: TextStyle( - fontSize: 12, - color: selected ? Colors.white : Colors.white70, - ), - ), - ], - ), - ), - ), - )); - } -} diff --git a/lib/app/navigation/pure_bottom_bar.dart b/lib/app/navigation/pure_bottom_bar.dart deleted file mode 100644 index b799b3e0..00000000 --- a/lib/app/navigation/pure_bottom_bar.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; - - - -class PureBottomBar extends StatefulWidget { - final int initPosition; - - // item 点击事件 - final IndexTapCallback? onItemTap; - - // item 长按事件 - final IndexLongTapCallback? onItemLongTap; - const PureBottomBar({Key? key, this.onItemTap,this.onItemLongTap,this.initPosition=0}) : super(key: key); - - @override - State createState() => _PureBottomBarState(); -} - -class _PureBottomBarState extends State { - List get bottomBar => const['组件','绘制', '收藏','我的']; - - List get bottomBarIcon => const[ - TolyIcon.icon_layout, - TolyIcon.dingzhi1, - TolyIcon.icon_collect, - TolyIcon.yonghu, - ]; - int _position = 0; - - @override - void initState() { - super.initState(); - _position = widget.initPosition; - - } - - @override - Widget build(BuildContext context) { - - return Wrap( - children: [ - // Divider(height: 1,), - BottomNavigationBar( - backgroundColor: Colors.white, - onTap: (position) { - // checkTokenExpires(); - _position = position; - - widget.onItemTap?.call(_position); - setState(() { - - // _controller.jumpToPage(_position); - }); - }, - currentIndex: _position, - - elevation: 3, - // fixedColor: themeColor.activeColor, - type: BottomNavigationBarType.fixed, - iconSize: 22, - selectedItemColor: Theme.of(context).primaryColor, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), - showUnselectedLabels: true, - showSelectedLabels: true, - // backgroundColor: themeColor.itemColor, - items: bottomBar.asMap().keys.map((index) => BottomNavigationBarItem(label: bottomBar[index], icon: Icon(bottomBarIcon[index]))).toList(), - ), - ], - ); - } -} diff --git a/lib/app/navigation/unit_drawer_header.dart b/lib/app/navigation/unit_drawer_header.dart deleted file mode 100644 index 0d557292..00000000 --- a/lib/app/navigation/unit_drawer_header.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -class UnitDrawerHeader extends StatelessWidget { - final Color color; - - - const UnitDrawerHeader({Key? key, required this.color}) : super(key: key); - - @override - Widget build(BuildContext context) { - return DrawerHeader( - padding: const EdgeInsets.only(top: 10, left: 15), - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/wy_300x200_filter.webp'), - fit: BoxFit.cover), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - FlutterLogo( - size: 35, - ), - Text( - 'Flutter Unit', - style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(1, 1), - blurRadius: 3) - ]), - ), - ], - ), - const SizedBox( - height: 15, - ), - Text( - 'The Unity Of Flutter, The Unity Of Coder.', - style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ - Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) - ]), - ), - const SizedBox( - height: 5, - ), - Text( - 'Flutter的联合,编程者的联合。', - style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ - Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) - ]), - ), - const SizedBox( - height: 10, - ), - Row( - children: const [ - Spacer( - flex: 5, - ), - Text( - '—— 张风捷特烈', - style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ - Shadow( - color: Colors.orangeAccent, - offset: Offset(.5, .5), - blurRadius: 1) - ]), - ), - Spacer( - flex: 1, - ), - ], - ), - ], - ), - ); - } -} diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart deleted file mode 100644 index c10be2ca..00000000 --- a/lib/app/navigation/unit_navigation.dart +++ /dev/null @@ -1,172 +0,0 @@ -import 'dart:io'; - -import 'package:app_config/app_config.dart'; -import 'package:app_update/app_update.dart'; -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/painter_system/gallery_unit.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - -import 'package:old_fancy_mobile_ui/home_page/fancy_home_page.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_panel/standard_home_page.dart'; - -import 'pure_bottom_bar.dart'; -import 'desk_ui/unit_desk_navigation.dart'; - -/// create by 张风捷特烈 on 2020-04-11 -/// contact me by email 1981462002@qq.com -/// 说明: 主题结构 左右滑页 + 底部导航栏 - -class UnitNavigation extends StatelessWidget { - const UnitNavigation({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => LayoutBuilder(builder: (_, c) { - if (c.maxWidth > 500) { - return UnitDeskNavigation(); - } - return UnitPhoneNavigation(); - }), - ); - } -} - -class UnitPhoneNavigation extends StatefulWidget { - const UnitPhoneNavigation({Key? key}) : super(key: key); - - @override - _UnitPhoneNavigationState createState() => _UnitPhoneNavigationState(); -} - -class _UnitPhoneNavigationState extends State { - //页面控制器,初始 0 - final PageController _controller = PageController(); - int position = 0; - - // 禁止 PageView 滑动 - final ScrollPhysics _neverScroll = const NeverScrollableScrollPhysics(); - - @override - void initState() { - super.initState(); - if (Platform.isAndroid) { - BlocProvider.of(context) - .add(const CheckUpdate(appName: 'FlutterUnit')); - } - } - - @override - void dispose() { - _controller.dispose(); //释放控制器 - super.dispose(); - } - - /// extendBody = true 凹嵌透明,需要处理底部 边距 - @override - Widget build(BuildContext context) { - AppStyle style = context.read().state.appStyle; - bool isStandard = style == AppStyle.standard; - return Scaffold( - extendBody: true, - endDrawer: const HomeRightDrawer(), - floatingActionButtonLocation: - isStandard ? null : FloatingActionButtonLocation.centerDocked, - floatingActionButton: isStandard ? null : _buildSearchButton(context), - body: PageView( - physics: _neverScroll, - controller: _controller, - children: [ - if (style == AppStyle.fancy) const FancyHomePage(), - if (style == AppStyle.standard) const StandardHomePage(), - GalleryUnit(), - CollectPageAdapter(), - UserPage(), - ], - ), - bottomNavigationBar: _buildBottomNav(context, style), - ); - } - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - // 主页搜索按钮 - // 由于 按钮 颜色需要随 点击头部栏 状态而改变, - // 使用 BlocBuilder 构建 - Widget _buildSearchButton(BuildContext context) { - return BlocBuilder(builder: (_, state) { - return FloatingActionButton( - shape: const StadiumBorder(), - elevation: 2, - backgroundColor: isDark ? state.color : state.color, - child: const Icon(Icons.search), - onPressed: () => Navigator.of(context).pushNamed(UnitRouter.search), - ); - }); - } - - // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, - // 使用 BlocBuilder 构建 - Widget _buildBottomNav(BuildContext context, AppStyle style) { - switch (style) { - case AppStyle.standard: - return Stack( - children: [ - PureBottomBar( - initPosition: position, - onItemTap: _onTapBottomNav, - onItemLongTap: _onItemLongTap, - ), - const Positioned(right: 26, top: 8, child: UpdateRedPoint()) - ], - ); - case AppStyle.fancy: - return BlocBuilder( - builder: (context, state) { - return UnitBottomBar( - initPosition: position, - color: state.color, - onItemTap: _onTapBottomNav, - onItemLongTap: _onItemLongTap, - ); - }, - ); - } - } - - // 点击底部按钮事件,切换页面 - void _onTapBottomNav(int index) { - _controller.jumpToPage(index); - position = index; - if (!isDark) { - late Color color; - if (index != 0) { - color = Theme.of(context).primaryColor; - } else { - color = - Cons.tabColors[context.read().state.family.index]; - } - context.read().change(color); - } - - if (index == 2) { - BlocProvider.of(context).add(const EventLoadLikeData()); - } - } - - // 两侧 - void _onItemLongTap(BuildContext context, int index) { - if (index == 0) { - Scaffold.of(context).openDrawer(); - } - if (index == 3) { - Scaffold.of(context).openEndDrawer(); - } - } -} diff --git a/lib/app/plateform_adapter/window/windows_adapter.dart b/lib/app/plateform_adapter/window/windows_adapter.dart deleted file mode 100644 index 59e8a27e..00000000 --- a/lib/app/plateform_adapter/window/windows_adapter.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:window_manager/window_manager.dart'; - -class WindowsAdapter { - - static Future setSize() async { - if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { - //仅对桌面端进行尺寸设置 - await windowManager.ensureInitialized(); - WindowOptions windowOptions = const WindowOptions( - size: Size(900,600), - minimumSize: Size(900,600), - center: true, - backgroundColor: Colors.transparent, - skipTaskbar: false, - titleBarStyle: TitleBarStyle.hidden, - ); - windowManager.waitUntilReadyToShow(windowOptions, () async { - await windowManager.setTitleBarStyle(TitleBarStyle.hidden,windowButtonVisibility: false); - await windowManager.show(); - await windowManager.focus(); - }); - } - } - -} - - -class DragToMoveAreaNoDouble extends StatelessWidget { - final Widget child; - - const DragToMoveAreaNoDouble({ - Key? key, - required this.child, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GestureDetector( - behavior: HitTestBehavior.translucent, - onPanStart: (details) { - windowManager.startDragging(); - }, - child: child, - ); - } -} \ No newline at end of file diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart deleted file mode 100644 index 4d3f505a..00000000 --- a/lib/app/router/unit_router.dart +++ /dev/null @@ -1,144 +0,0 @@ -// ignore_for_file: constant_identifier_names - -import 'dart:io'; - -import 'package:app_config/app_config.dart'; -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/navigation/unit_navigation.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/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/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/widget_ui/desk_ui/widget_detail/widget_detail_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/category_detail.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/search_page/search_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/widget_detail_page.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -class UnitRouters { - static const String widget_detail = '/widget_detail'; - - static const String detail = 'detail'; - static const String search = 'search_bloc'; - - - 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 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 UnitRouter.nav: - if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - return NoAnimRouter(child: UnitNavigation()); - } - return Left2RightRouter(child: UnitNavigation()); - - // 组件详情页 - case widget_detail: - Widget child; - if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - child = DeskWidgetDetailPageScope( model: settings.arguments as WidgetModel, - ); - }else{ - child = WidgetDetailPageScope( - model: settings.arguments as WidgetModel, - ); - } - - return Right2LeftRouter( - child: child); - - case search: - return Right2LeftRouter(child: const SearchPageProvider()); - case collect: - return Right2LeftRouter(child: const CollectPageAdapter()); - - case setting: - return Right2LeftRouter(child: const SettingPage()); - case data_manage: - return Right2LeftRouter(child: const DataManagePage()); - case font_setting: - return Right2LeftRouter(child: const FontSettingPage()); - case theme_color_setting: - return Right2LeftRouter(child: const ThemeColorSettingPage()); - case code_style_setting: - return Right2LeftRouter(child: const CodeStyleSettingPage()); - case item_style_setting: - return Right2LeftRouter(child: const ItemStyleSettingPage()); - - case version_info: - return Right2LeftRouter(child: const VersionInfo()); - - case issues_point: - return Right2LeftRouter(child: const IssuesPointScope()); - case login: - return Right2LeftRouter(child: const LoginPage()); - - case register: - return Right2LeftRouter(child: const RegisterPage()); - - case attr: - return Right2LeftRouter(child: const AttrUnitPage()); - case bug: - return Right2LeftRouter(child: const BugUnitPage()); - case layout: - return Right2LeftRouter(child: const LayoutUnitPage()); - case about_app: - return Right2LeftRouter(child: const AboutAppPage()); - case about_me: - return Right2LeftRouter(child: const AboutMePage()); - - case point_detail: - return Right2LeftRouter(child: const 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 2f174108..00000000 --- a/lib/app/utils/Toast.dart +++ /dev/null @@ -1,32 +0,0 @@ -// import 'package:flutter/material.dart'; -// -// class Toast { -// static toast(BuildContext context, String msg, -// {duration = const Duration(milliseconds: 600), -// Color? color, -// SnackBarAction? action}) { -// -// ScaffoldMessenger.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/color_utils.dart b/lib/app/utils/color_utils.dart deleted file mode 100644 index 3e245dd4..00000000 --- a/lib/app/utils/color_utils.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'random_provider.dart'; - - - -class ColorUtils { - static Color randomColor({ - int limitA = 120, - int limitR = 0, - int limitG = 0, - int limitB = 0, - }) { - Random random = RandomProvider.random; - int a = limitA + random.nextInt(256 - limitA); //透明度值 - int r = limitR + random.nextInt(256 - limitR); //红值 - int g = limitG + random.nextInt(256 - limitG); //绿值 - int b = limitB + random.nextInt(256 - limitB); //蓝值 - return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 - } - - - /// 使用方法: - /// var color1=ColorUtils.parse("#33428A43"); - /// var color2=ColorUtils.parse("33428A43"); - /// var color3=ColorUtils.parse("#428A43"); - ///var color4=ColorUtils.parse("428A43"); - /// - static Color parse(String code) { - Color result =Colors.red; - int value = 0 ; - if (code.contains("#")) { - try { - value = int.parse(code.substring(1), radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 1 + 6://6位 - result = Color(value + 0xFF000000); - break; - case 1 + 8://8位 - result = Color(value); - break; - default: - result =Colors.red; - } - }else { - try { - value = int.parse(code, radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 6: - result = Color(value + 0xFF000000); - break; - case 8: - result = Color(value); - break; - default: - result =Colors.red; - } - } - return result; - } - - static String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - diff --git a/lib/app/utils/convert.dart b/lib/app/utils/convert.dart deleted file mode 100644 index 711d1dad..00000000 --- a/lib/app/utils/convert.dart +++ /dev/null @@ -1,52 +0,0 @@ - -import 'package:db_storage/db_storage.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:widget_repository/widget_repository.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){ - 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/toly_utils.dart b/lib/app/utils/toly_utils.dart deleted file mode 100644 index ea48a992..00000000 --- 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/version/version_shower.dart b/lib/app/views/about/version/version_shower.dart deleted file mode 100644 index 3c20a2cd..00000000 --- a/lib/app/views/about/version/version_shower.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:package_info_plus/package_info_plus.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/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart deleted file mode 100644 index 95662317..00000000 --- a/lib/app/views/data_manage/data_manage_page.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:flutter_unit/app/utils/Toast.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; - -import 'package:authentication/views/authentic_widget.dart'; -import 'package:utils/utils.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:path/path.dart' as path; -import 'package:sqflite/sqflite.dart'; -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2021/2/26 -/// contact me by email 1981462002@qq.com -/// 说明: -/// - -class DataManagePage extends StatelessWidget { - const DataManagePage({Key? key}) : super(key: key); - - @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(const Divider()), - AuthenticWidget.just(ListTile( - trailing: Icon( - TolyIcon.download, - color: Theme.of(context).primaryColor, - ), - title: const Text('同步收藏集数据'), - onTap: () => _doSync(ctx), - )), - AuthenticWidget.just(const Divider()), - ListTile( - trailing: Icon( - Icons.refresh, - color: Theme.of(context).primaryColor, - ), - title: const Text('收藏集数据重置'), - // trailing: _nextIcon(context), - onTap: () => _recallDatabase(ctx), - ), - const 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(const EventLoadCategory()); - BlocProvider.of(context).add(const 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); - - TaskResult result = - await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); - - if (result.success) { - Toast.toast(context, '数据集备份成功!'); - } else { - Toast.toast(context, '数据集备份失败!'); - } - } - - void _doSync(BuildContext context) async { - TaskResult result = await CategoryApi.getCategoryData(); - - if (result.success) { - // 说明请求成功 - if (result.data != null) { - //说明有后台备份数据,进行同步操作 - CategoryRepository repository = - BlocProvider.of(context).repository; - await repository.syncCategoryByData( - result.data!.data, result.data!.likeData); - BlocProvider.of(context).add(const EventLoadCategory()); - BlocProvider.of(context).add(const 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/setting/app_style_setting.dart b/lib/app/views/setting/app_style_setting.dart deleted file mode 100644 index bd2e9445..00000000 --- a/lib/app/views/setting/app_style_setting.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -/// create by 张风捷特烈 on 2020-04-10 -/// contact me by email 1981462002@qq.com -/// 说明: - - -void showAppStyleSelectDialog(BuildContext context) { - List data = Cons.kAppStyleStringMap.values.toList(); - showCupertinoModalPopup( - context: context, - builder: (context) => AppThemeSettingDialog( - data: data, - )); -} - -class AppThemeSettingDialog extends StatelessWidget { - final List data; - - - const AppThemeSettingDialog({Key? key,required this.data}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Material( - child: SizedBox( - height: 350, - width: MediaQuery.of(context).size.width, - child: Column( - children: [ - const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - '选择应用风格样式', - style: - TextStyle(fontWeight: FontWeight.bold, fontSize: 16), - ), - ), - const Divider(height: 1,), - Expanded( - child: ListView.builder( - padding: EdgeInsets.zero, - itemBuilder: _buildItem, - itemCount: data.length, - ), - ) - ], - ), - // color: Colors.orange, - ), - ); - } - - Widget _buildItem(BuildContext context, int index) { - AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; - AppStyle style = BlocProvider.of(context).state.appStyle; - bool checked = style == locale; - Color color = Theme.of(context).primaryColor; - return ListTile( - title: Text(data[index]), - onTap: () => _onSelect(context, index), - trailing: checked ? Icon(Icons.check, size: 20, color: color) : null, - ); - } - void _onSelect(BuildContext context, int index) { - AppStyle appStyle = Cons.kAppStyleStringMap.keys.toList()[index]; - BlocProvider.of(context).changeAppStyle(appStyle); - Navigator.of(context).pop(); - } -} diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart deleted file mode 100644 index cea5e08f..00000000 --- a/lib/app/views/setting/font_setting.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - - -/// create by 张风捷特烈 on 2020-04-10 -/// contact me by email 1981462002@qq.com -/// 说明: - -class FontSettingPage extends StatelessWidget { - const FontSettingPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: '字体设置 - font setting'), - body: BlocBuilder( - builder: (_, state) => _buildFontCell( - context, Cons.kFontFamilySupport, state.fontFamily)), - ); - } - - Widget _buildFontCell( - BuildContext context, List fontFamilySupport, String fontFamily) { - return GridView.count( - padding: const EdgeInsets.only(top: 20, left: 10, right: 10), - shrinkWrap: true, - crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: 1.5, - children: fontFamilySupport - .map((e) => FeedbackWidget( - a: 0.95, - duration: const Duration(milliseconds: 200), - onPressed: () { - BlocProvider.of(context).switchFontFamily(e); - }, - child: Card( - child: GridTile( - header: Container( - padding: const EdgeInsets.only(left: 10, right: 5), - height: 30, - color: fontFamily == e - ? Colors.blue.withAlpha(88) - : Colors.grey.withAlpha(88), - child: Row( - children: [ - Text(e, - style: TextStyle( - color: Colors.black, - fontFamily: e, - )), - const Spacer(), - if (fontFamily == e) Circle(color: Theme.of(context).primaryColor,) - ], - ), - ), - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Colors.blueAccent.withAlpha(22), - Colors.blueAccent.withAlpha(22), - Theme.of(context).primaryColor.withAlpha(88) - ])), - alignment: const Alignment(0, 0.4), - child: Text( - '张风捷特烈\n@toly1994', - style: TextStyle(fontFamily: e, fontSize: 16), - )), - ), - ))) - .toList(), - ); - } -} diff --git a/lib/app/views/setting/item_style_setting.dart b/lib/app/views/setting/item_style_setting.dart deleted file mode 100644 index f543aadb..00000000 --- a/lib/app/views/setting/item_style_setting.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; - -/// create by 张风捷特烈 on 2020-04-10 -/// contact me by email 1981462002@qq.com -/// 说明: item样式切换支持 - -class ItemStyleSettingPage extends StatelessWidget { - const ItemStyleSettingPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: 'item样式设置'), - body: BlocBuilder(builder: (_, state) { - return _buildCell(context, state.itemStyleIndex); - }), - ); - } - - List get items=> HomeItemSupport.itemSimples(); - - Widget _buildCell(BuildContext context, int index) { - return ListView.builder( - itemCount: items.length, - itemBuilder: (_, i) => Padding( - padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), - child: FeedbackWidget( - a: 0.95, - duration: const Duration(milliseconds: 200), - onPressed: () { - BlocProvider.of(context).changeItemStyle(i); - }, - child: Stack( - children: [ - items[i], - if (index == i) - Positioned( - left: 25, - top: 15, - child: Circle( - color: Theme.of(context).primaryColor, - radius: 10, - child: const Icon( - Icons.check, - color: Colors.white, - size: 15, - ), - ), - ) - ], - )), - )); - } -} diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart deleted file mode 100644 index 0190342c..00000000 --- a/lib/app/views/setting/setting_page.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/overlay_tool_wrapper.dart'; - - -import 'app_style_setting.dart'; - -class SettingPage extends StatelessWidget { - - const SettingPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - const Widget divider = Divider(height: 1); - - return Scaffold( - backgroundColor: Colors.white, - appBar: const UnitAppbar(title:'应用设置'), - body: ListView( - children: [ - Container( height: 15,color: UnitColor.scaffoldBgLight), - - ListTile( - leading: Icon( - Icons.style, - color: Theme.of(context).primaryColor, - ), - title: const Text('应用整体风格', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - Cons.kAppStyleStringMap[state.appStyle]! - , style: const TextStyle(fontSize: 14) - ), - ), - onTap: (){ - showAppStyleSelectDialog(context); - }, - ), - divider, - ListTile( - leading: Icon( - Icons.palette, - color: Theme.of(context).primaryColor, - ), - title: const Text('主题色设置', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - Cons.kThemeColorSupport[state.themeColor]!, - style: TextStyle(color: state.themeColor,fontSize: 14), - ), - ), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.theme_color_setting), - ), - divider, - ListTile( - leading: Icon( - Icons.translate, - color: Theme.of(context).primaryColor, - ), - title: const Text('字体设置', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - state.fontFamily - ), - ), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.font_setting), - ), - divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), - ListTile( - leading: Icon( - TolyIcon.icon_item, - color: Theme.of(context).primaryColor, - ), - title: const Text('条目样式设置', style: TextStyle(fontSize: 16),), - subtitle: const Text('仅华丽样式下可用',style:TextStyle(fontSize: 14),), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.item_style_setting), - ), - divider, - ListTile( - leading: Icon( - TolyIcon.icon_code, - color: Theme.of(context).primaryColor, - ), - title: const Text('代码高亮样式', style: TextStyle(fontSize: 16)), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.code_style_setting), - ), - divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), - _buildShowBg(context), - divider, - _buildShowOver(context), - divider, - // _buildShowTool(context), - // divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), - ListTile( - leading: Icon( - Icons.info, - color: Theme.of(context).primaryColor, - ), - title: const Text('版本信息', style: TextStyle(fontSize: 16)), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.version_info), - ), - ], - ), - ); - } - - - - Widget _buildShowBg(BuildContext context) => - BlocBuilder( - builder: (_, state) => SwitchListTile( - value: state.showBackGround, - secondary: Icon( - TolyIcon.icon_background, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示背景', style: TextStyle(fontSize: 16)), - onChanged: (show) { - BlocProvider.of(context).switchShowBg(show); - }, - )); - - Widget _buildShowOver(BuildContext context) => - BlocBuilder( - builder: (_, state) => SwitchListTile( - value: state.showPerformanceOverlay, - secondary: Icon( - TolyIcon.icon_show, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示性能浮层', style: TextStyle(fontSize: 16)), - onChanged: (show) { - BlocProvider.of(context).switchShowOver(show); - }, - )); - - Widget _buildShowTool(BuildContext context) => - BlocBuilder( - builder: (_, state) => SwitchListTile( - value: state.showOverlayTool, - secondary: Icon( - TolyIcon.icon_layout, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示浮动工具', style: TextStyle(fontSize: 16)), - onChanged: (show) { - if(show){ - OverlayToolWrapper.of(context).showFloating(); - }else{ - OverlayToolWrapper.of(context).hideFloating(); - } - BlocProvider.of(context).switchShowTool(show); - }, - )); - - - Widget _nextIcon(BuildContext context) => - Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); -} diff --git a/lib/app/views/setting/theme_color_setting.dart b/lib/app/views/setting/theme_color_setting.dart deleted file mode 100644 index a917d743..00000000 --- a/lib/app/views/setting/theme_color_setting.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -/// create by 张风捷特烈 on 2020-04-10 -/// contact me by email 1981462002@qq.com -/// 说明: - -class ThemeColorSettingPage extends StatelessWidget { - const ThemeColorSettingPage({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title:'主题色设置'), - body: BlocBuilder( - builder: (_, state) => _buildCell( - context, Cons.kThemeColorSupport.keys.toList(), state.themeColor)), - ); - } - - Widget _buildCell( - BuildContext context, List themeColorSupport, MaterialColor color) { - return GridView.count( - padding: const EdgeInsets.only(top: 20, left: 10, right: 10), - shrinkWrap: true, - crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: 1.5, - children: themeColorSupport - .map((MaterialColor c) => FeedbackWidget( - a: 0.95, - duration: const Duration(milliseconds: 200), - onPressed: () => BlocProvider.of(context).switchThemeColor(c), - child: GridTile( - header: Container( - decoration: BoxDecoration( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10),topRight: Radius.circular(10)), - color: color == c - ? Colors.blue.withAlpha(88): - Colors.grey.withAlpha(55), - ), - padding: const EdgeInsets.only(left: 10, right: 5), - height: 30, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Spacer(), - Text(colorString(c), - style: const TextStyle( - color: Colors.white, - )), - const Spacer(), - if (color == c) const Padding( - padding: EdgeInsets.only(right:8.0), - child: Circle(color: Colors.white,radius: 7,), - ) - ], - ), - ), - child: Container( - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(10)), - gradient: LinearGradient(colors: [ - c.shade50, - c.shade100, - c.shade200, - c.shade300, - c.shade400, - c.shade500, - c.shade600, - c.shade700, - c.shade800, - c.shade900, - ])), - alignment: const Alignment(0,0.35), - child: Text( - '${Cons.kThemeColorSupport[c]}', - style: const TextStyle(fontSize: 18,color: Colors.white,fontWeight: FontWeight.bold), - )), - ))) - .toList(), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/lib/app/views/splash/standard_unit_splash.dart b/lib/app/views/splash/standard_unit_splash.dart deleted file mode 100644 index 44308f8a..00000000 --- a/lib/app/views/splash/standard_unit_splash.dart +++ /dev/null @@ -1,136 +0,0 @@ -import 'dart:math'; - -import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:utils/utils.dart'; - -import 'package:widget_module/blocs/blocs.dart'; - -import 'dart:ui' as ui; - -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页 - -class StandardUnitSplash extends StatefulWidget { - const StandardUnitSplash({Key? key}) : super(key: key); - - @override - _StandardUnitSplashState createState() => _StandardUnitSplashState(); -} - -class _StandardUnitSplashState extends State - with TickerProviderStateMixin { - static const int _minCost = 1500; - - int _recorder = 0; - - final Paint paint = Paint() - ..style = PaintingStyle.stroke - ..shader = ui.Gradient.linear( - const Offset(0, 0), - const Offset(22, 0), - [Colors.red, Colors.yellow, Colors.blue, Colors.green], - [1 / 4, 2 / 4, 3 / 4, 1], - TileMode.mirror, - Matrix4.rotationZ(pi / 4).storage, - ); - - @override - void initState() { - super.initState(); - _recorder = DateTime.now().millisecondsSinceEpoch; - } - - @override - Widget build(BuildContext context) { - final Size winSize = MediaQuery.of(context).size; - return AnnotatedRegion( - value: const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarIconBrightness: Brightness.dark), - child: Material( - child: BlocListener( - listener: _listenStart, - child: Column( - children: [ - const Spacer(), - Expanded( - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Stack( - children: [ - Text( - "U", - style: TextStyle( - fontSize: 26, - height: 1, - fontWeight: FontWeight.bold, - foreground: paint), - ), - const FlutterLogo(size: 60), - ], - ), - const SizedBox( - height: 20, - ), - _buildFlutterUnitText(winSize.height, winSize.width), - ], - )), - Expanded( - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - Positioned( - bottom: 15, - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - Text("Power By 张风捷特烈", - style: UnitTextStyle.splashShadows), - Text("· 2021 · @编程之王 ", - style: UnitTextStyle.splashShadows), - ], - )), - ], - )) - ], - )), - ), - ); - } - - Widget _buildFlutterUnitText(double winH, double winW) { - return FlutterUnitText( - text: StrUnit.appName, - color: Theme.of(context).primaryColor, - ); - } - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - HttpUtil.instance.rebase(PathUnit.baseUrl); - int cost = DateTime.now().millisecondsSinceEpoch - _recorder; - BlocProvider.of(context) - .add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - - // 启动耗时小于 _minCost 时,等待 delay 毫秒 - int delay = cost < _minCost ? _minCost - cost : 0; - Future.delayed(Duration(milliseconds: delay)).then((value) { - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - }); - } -} diff --git a/lib/code_gen/bloc/state.dart b/lib/code_gen/bloc/state.dart deleted file mode 100644 index e7bac1b9..00000000 --- a/lib/code_gen/bloc/state.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/code_gen/model/class.dart'; - -class ClassGenBloc extends Cubit{ - - ClassGenBloc():super(Class(fields: [], name: '')); - - - -} \ No newline at end of file diff --git a/lib/code_gen/desk_widget_top_bar.dart b/lib/code_gen/desk_widget_top_bar.dart deleted file mode 100644 index ae4e3de4..00000000 --- a/lib/code_gen/desk_widget_top_bar.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - -import '../widget_ui/desk_ui/widget_panel/window_buttons.dart'; - - - -class DeskCodeGenTopBar extends StatefulWidget { - final ValueChanged onTabPressed; - final VoidCallback onTapGen; - - const DeskCodeGenTopBar({Key? key,required this.onTabPressed, required this.onTapGen}) : super(key: key); - - @override - State createState() => _DeskCodeGenTopBarState(); -} - -class _DeskCodeGenTopBarState extends State with SingleTickerProviderStateMixin { - late TabController tabController; - - static const List _tabs = ['IconFont', '数据类' , '状态管理', 'Json 解析',]; - - @override - void initState() { - super.initState(); - tabController = TabController(length: _tabs.length, vsync: this); - } - - @override - Widget build(BuildContext context) { - Color themeColor = Theme.of(context).primaryColor; - - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), - height: 64, - color: Colors.white, - child: Row( - children: [ - SizedBox( - width: 350, - child: TabBar( - onTap: widget.onTabPressed, - indicatorSize: TabBarIndicatorSize.label, - labelPadding: const EdgeInsets.symmetric(horizontal: 6), - isScrollable: false, - indicator: RoundRectTabIndicator( - borderSide: BorderSide(color: themeColor, width: 3), - ), - labelStyle: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - controller: tabController, - labelColor: themeColor, - indicatorWeight: 3, - unselectedLabelColor: Colors.grey, - indicatorColor: themeColor, - tabs: - _tabs.map((String name) => Tab(text: name)).toList(), - ), - ), - Spacer(), - - const SizedBox(width: 20,), - WindowButtons(), - ], - ), - ), - ); - } -} diff --git a/lib/code_gen/icon_font_gen/gen_message_action.dart b/lib/code_gen/icon_font_gen/gen_message_action.dart deleted file mode 100644 index 8059423e..00000000 --- a/lib/code_gen/icon_font_gen/gen_message_action.dart +++ /dev/null @@ -1,36 +0,0 @@ - -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; - - - -class GenMessageAction extends StatelessWidget { - final VoidCallback onGen; - const GenMessageAction({Key? key, required this.onGen}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded(child: Text( - '使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。', - style: TextStyle( - color: Theme.of(context).primaryColor,fontWeight: FontWeight.bold),)), - ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - shape: const StadiumBorder() - ), - onPressed:onGen, child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 4, - children: [ - Icon(TolyIcon.icon_fast,size: 16,), - const Text('生成代码',style: TextStyle(height: 1,fontSize: 12),), - ], - )), - ], - ); - } -} diff --git a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart b/lib/code_gen/icon_font_gen/icon_font_class_parser.dart deleted file mode 100644 index 9faa67ae..00000000 --- a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'package:archive/archive_io.dart'; - -import 'icon_font_gen_config.dart'; -import 'package:path/path.dart' as path; - -class IconFontClassParser{ - - void gen(IconFontGenConfig config){ - final inputStream = InputFileStream(config.srcZip); - // 将压缩包有用资源解压到目标文件 - final archive = ZipDecoder().decodeBuffer(inputStream); - for (var file in archive.files) { - if (file.isFile) { - if (file.name.endsWith('.ttf')) { - final outputStream = OutputFileStream(config.ttfDistPath); - file.writeContent(outputStream); - outputStream.close(); - } - if (file.name.endsWith('.json')) { - dynamic data = file.content; - String jsonContent = utf8.decode(data); - String resultCode = parser(jsonContent,config.fontFamily); - File distFile = File(config.distFilePath); - if(!distFile.existsSync()){ - distFile.createSync(recursive: true); - } - distFile.writeAsStringSync(resultCode); - setYaml(config); - } - } - } - } - - String parser(String input,String fontFamily){ - dynamic map = json.decode(input); - List glyphs = map['glyphs'] as List; - String code = ''; - for(int i=0;i lines = pubspecFile.readAsLinesSync(); - - RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); - bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); - - if(!hasFonts){ - // 当前没有 fonts 节点,需要添加到 flutter 节点下 - int index = lines.indexWhere((e) => e.startsWith('flutter:')); - List fonts = [ - ' fonts:', - ' - family: $familyName', - ' fonts:', - ' - asset: $fontAssetsDist', - ]; - - lines.insertAll(index+1, fonts); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - // 存在 fonts 节点,查询 family ,有没有当前字体图标 - bool hasTargetFamily = false; - RegExp regExp = RegExp(r'^ +- family: +(\w+)'); - - for(int i=0;i e.startsWith(fontsRegex)); - List fonts = [ - ' - family: $familyName', - ' fonts:', - ' - asset: $fontAssetsDist', - ]; - lines.insertAll(index+1, fonts); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - } - - // // 修改 pubspec.yaml - // void setYaml(IconFontGenConfig config){ - // String fontFamily = config.fontFamily; - // String assets = config.assetsDist.replaceAll('\\', '/'); - // - // final String filePath = path.join(config.projectPath,'pubspec.yaml'); - // File pubspecFile = File(filePath); - // final String pubspec = pubspecFile.readAsStringSync(); - // final doc = loadYaml(pubspec); - // final modifiableDoc = getModifiableNode(doc); - // - // YamlList? fontsList = doc['flutter']['fonts'] as YamlList?; - // if(fontsList == null){ - // // 新文件,没有配置 fonts 节点 - // modifiableDoc['flutter']['fonts'] = YamlMap.wrap({ - // 'family': fontFamily, - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'$assets/iconfont.ttf'})]) - // }); - // }else{ - // final modifiableList = getModifiableNode(fontsList); - // modifiableList.removeWhere((e) => e['family'] == fontFamily); - // modifiableList.add( - // YamlMap.wrap({ - // 'family': fontFamily, - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'$assets/iconfont.ttf'})]) - // }) - // ); - // modifiableDoc['flutter']['fonts'] = modifiableList; - // } - // final targetYaml = toYamlString(modifiableDoc); - // pubspecFile.writeAsStringSync(targetYaml); - // } - -} \ No newline at end of file diff --git a/lib/components/top_bar/desk_simple_top_bar.dart b/lib/components/top_bar/desk_simple_top_bar.dart deleted file mode 100644 index f13766b8..00000000 --- a/lib/components/top_bar/desk_simple_top_bar.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../app/plateform_adapter/window/windows_adapter.dart'; -import '../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; - -class SimpleDeskTopBar extends StatelessWidget { - final Widget? leading; - - const SimpleDeskTopBar({super.key, this.leading}); - - @override - Widget build(BuildContext context) { - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), - height: 64, - color: Colors.white, - child: Row( - children: [ - if (leading != null) leading!, - const Spacer(), - const SizedBox( - width: 20, - ), - const WindowButtons(), - ], - ), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index 289530cb..44222857 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,16 +1,3 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -import 'app/plateform_adapter/window/windows_adapter.dart'; -import 'app/bloc_wrapper.dart'; -import 'app/flutter_unit.dart'; - - -void main() { - WidgetsFlutterBinding.ensureInitialized(); - //滚动性能优化 1.22.0 - GestureBinding.instance.resamplingEnabled = true; - runApp(const BlocWrapper(child: FlutterUnit())); - WindowsAdapter.setSize(); -} +import 'src/starter/fx_application.dart'; +void main(List args) => const FxApplication().run(args); diff --git a/lib/painter_system/desk_ui/desk_gallery_unit.dart b/lib/painter_system/desk_ui/desk_gallery_unit.dart deleted file mode 100644 index 62b582bb..00000000 --- a/lib/painter_system/desk_ui/desk_gallery_unit.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'dart:convert'; - -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - -import '../../point_system/views/desk_ui/desk_point_page.dart'; -import '../gallery_detail_page.dart'; - -/// create by 张风捷特烈 on 2020/11/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -class DeskGalleryUnit extends StatefulWidget { - const DeskGalleryUnit({Key? key}) : super(key: key); - - @override - _DeskGalleryUnitState createState() => _DeskGalleryUnitState(); -} - -class _DeskGalleryUnitState extends State { - final ValueNotifier factor = ValueNotifier(0); - - @override - void dispose() { - factor.dispose(); - super.dispose(); - } - - final ScrollController controller = ScrollController(); - - Color get color => BlocProvider.of(context).state.tabColor; - - Color get nextColor => - BlocProvider.of(context).state.nextTabColor; - - BoxDecoration get boxDecoration => const BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), - topRight: Radius.circular(20), - ), - ); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - SimpleDeskTopBar( - leading: Text( - 'Flutter 绘制集录', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - ), - Expanded(child: _buildContent()), - ], - ), - ); - } - - Widget _buildContent() { - final List widgets = - (json.decode(StrUnit.galleryInfo) as List).map((e) { - GalleryInfo info = GalleryInfo.fromJson(e); - List children = GalleryFactory.getGalleryByName(info.type); - - return FeedbackWidget( - a: 0.95, - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (ctx) => GalleryDetailPage( - galleryInfo: info, - children: children, - ))); - }, - child: GalleryCardItem( - galleryInfo: info, - count: children.length, - ), - ); - }).toList(); - - SliverGridDelegate gridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 460, - mainAxisSpacing: 10, - mainAxisExtent: 360, - crossAxisSpacing: 10, - ); - - return GridView.builder( - controller: controller, - gridDelegate: gridDelegate, - padding: const EdgeInsets.all(20), - itemCount: widgets.length, - itemBuilder: (ctx, index) => widgets[index]); - } -} diff --git a/lib/painter_system/gallery_factory.dart b/lib/painter_system/gallery_factory.dart deleted file mode 100644 index dbdddfcf..00000000 --- a/lib/painter_system/gallery_factory.dart +++ /dev/null @@ -1,270 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_unit/painter_system/anim/spring_widget.dart'; - -import 'anim/bezier3_player/bezier3_palyer.dart'; -import 'anim/circle_halo.dart'; -import 'anim/curve_shower/curve_anim_shower.dart'; -import 'anim/draw_path.dart'; -import 'anim/dundun_path.dart'; -import 'anim/rotate_by_point/rotate_by_point.dart'; -import 'art/circle_packing.dart'; -import 'art/cubic_disarray.dart'; -import 'art/hypnotic_squares.dart'; -import 'art/joy_division.dart'; -import 'art/piet_mondrian.dart'; -import 'art/tiled_lines.dart'; -import 'art/triangular_mesh.dart'; -import 'art/un_deux_trois.dart'; -import 'base/clock_widget.dart'; -import 'base/digital/digital_shower.dart'; -import 'base/draw_grid_axis.dart'; -import 'base/draw_path_fun.dart'; -import 'base/draw_picture.dart'; - -import 'base/n_side/n_side_page.dart'; -import 'base/polar/polar_painter_widget.dart'; -import 'base/windmill.dart'; -import 'fun/bufeng/bufeng_panel.dart'; -import 'fun/dundun_view.dart'; -import 'fun/random_portrait.dart'; -import 'fun/stemp/stamp_paper.dart'; -import 'particle/random/random_particle.dart'; -import 'particle/split/particle_split.dart'; -import 'particle/split_img/split_image.dart'; -import 'picture_frame.dart'; - -/// create by 张风捷特烈 on 2020/12/5 -/// contact me by email 1981462002@qq.com -/// 说明: -/// - -enum GalleryType { base, anim, particle, fun, art } - -class GalleryFactory { - static List getGalleryByName(GalleryType type) { - switch (type) { - case GalleryType.base: - return const [ - FrameShower( - title: "The Chaos", - author: "张风捷特烈", - srcUrl: "/base/draw_picture.dart", - info: "本样例介绍如何进行图片的绘制:通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45° 倾角的栅格线,来练习线条的绘制。", - content: DrawPicture()), - FrameShower( - title: "数字显示管", - author: "张风捷特烈", - srcUrl: "/base/digital", - info: "本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例。", - content: DigitalShower()), - FrameShower( - title: "旋转风车", - author: "张风捷特烈", - srcUrl: "/base/windmill.dart", - info: "本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。", - content: WindmillWidget()), - FrameShower( - title: "平面直角坐标系", - author: "张风捷特烈", - srcUrl: "/base/draw_grid_axis.dart", - info: - "本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。", - content: DrawGridAxis()), - FrameShower( - title: "平面极坐标系", - author: "张风捷特烈", - srcUrl: "/base/polar", - info: - "本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。", - content: PolarPainterWidget()), - FrameShower( - title: "曲线拟合", - author: "张风捷特烈", - srcUrl: "/base/draw_path_fun.dart", - info: "本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。", - content: DrawPathFun()), - FrameShower( - title: "圆中取形", - author: "张风捷特烈", - srcUrl: "/base/n_side", - info: "本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数", - content: NSidePage()), - FrameShower( - title: "随机对称图", - author: "张风捷特烈", - srcUrl: '/fun/random_portrait.dart', - info: "本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", - content: RandomPortrait()), - FrameShower( - title: "简单时钟", - author: "张风捷特烈", - srcUrl: '/base/clock_widget.dart', - info: "本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。", - content: ClockWidget()), - ]; - case GalleryType.anim: - return const [ - FrameShower( - title: "手势弹簧", - author: "张风捷特烈", - srcUrl: '/anim/spring_widget.dart', - info: "本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。\n特殊操作:上下拖拽伸缩弹簧", - content: SpringWidget()), - FrameShower( - title: "绕定点旋转", - author: "张风捷特烈", - srcUrl: '/anim/rotate_by_point', - info: "本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行", - content: RotateByPointWidget()), - FrameShower( - title: "流光", - author: "张风捷特烈", - srcUrl: '/anim/circle_halo.dart', - info: "本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。", - content: CircleHalo()), - FrameShower( - title: "曲线路径动画", - author: "张风捷特烈", - srcUrl: '/anim/draw_path.dart', - info: "本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画", - content: DrawPath()), - FrameShower( - title: "冰墩墩线条动画", - author: "张风捷特烈", - srcUrl: '/anim/dundun_path.dart', - info: "本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行", - content: DunDunPathPage()), - FrameShower( - title: "Bezier3 演示", - author: "张风捷特烈", - srcUrl: '/anim/bezier3_player', - info: "本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除", - content: Bezier3Player()), - FrameShower( - title: "动画曲线散点图", - author: "张风捷特烈", - srcUrl: '/anim/curve_shower', - info: "本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行", - content: CurveAnimShower()), - - ]; - case GalleryType.particle: - return const [ - FrameShower( - title: "随机粒子生成器", - author: "张风捷特烈", - srcUrl: '/particle/random', - info: "本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例。\n特殊操作:单击停止/运行", - content: RandomParticle()), - FrameShower( - title: "粒子分裂", - author: "张风捷特烈", - srcUrl: '/particle/split', - info: "本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置", - content: ParticleSplit()), - FrameShower( - title: "图片粒子分裂", - author: "张风捷特烈", - srcUrl: '/particle/split_img', - info: "本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行", - content: SplitImage()), - ]; - case GalleryType.fun: - return const[ - FrameShower( - title: "Random Portrait", - author: "张风捷特烈", - srcUrl: '/fun/random_portrait.dart', - info: "本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", - content: RandomPortrait()), - FrameShower( - title: "冰墩墩", - author: "张风捷特烈", - srcUrl: '/fun/dundun_view.dart', - info: "本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。", - content: DunDunView()), - FrameShower( - title: "蒲丰投针试验", - author: "张风捷特烈", - srcUrl: '/fun/bufeng', - info: "本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。", - content: BufengPanel()), - FrameShower( - title: "井字棋", - author: "张风捷特烈", - srcUrl: '/fun/stemp', - info: "本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", - content: StampPaper()), - ]; - case GalleryType.art: - return const [ - FrameShower( - title: "Tiled Line", - author: "generativeartistry.com", - srcUrl: '/art/tiled_lines.dart', - info: - "本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: TiledLines(), - ), - FrameShower( - title: "Joy Division", - author: "generativeartistry.com", - srcUrl: '/art/joy_division.dart', - info: - "本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: JoyDivision(), - ), - FrameShower( - title: "Cubic Disarray", - author: "generativeartistry.com", - srcUrl: '/art/cubic_disarray.dart', - info: - "本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: CubicDisarray(), - ), - FrameShower( - title: "Triangular Mesh", - author: "generativeartistry.com", - srcUrl: '/art/triangular_mesh.dart', - info: - "本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: TriangularMesh(), - ), - FrameShower( - title: "Un Deux Trois", - srcUrl: '/art/un_deux_trois.dart', - author: "generativeartistry.com", - info: - "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: UnDeuxTrois(), - ), - FrameShower( - title: "Circle Packing", - author: "generativeartistry.com", - srcUrl: '/art/circle_packing.dart', - info: - "本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: CirclePacking(), - ), - FrameShower( - title: "Hypnotic Squares", - author: "generativeartistry.com", - srcUrl: '/art/hypnotic_squares.dart', - info: - "本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: HypnoticSquares(), - ), - FrameShower( - title: "Piet Mondrian", - author: "generativeartistry.com", - srcUrl: '/art/piet_mondrian.dart', - info: - "本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: PietMondrian(), - ) - ]; - default: - return []; - } - } -} diff --git a/lib/point_system/api/app_info.dart b/lib/point_system/api/app_info.dart deleted file mode 100644 index b43de5e5..00000000 --- a/lib/point_system/api/app_info.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:equatable/equatable.dart'; -import 'package:utils/utils.dart'; - -class AppInfoApi { - - static Future> getAppVersion({required String appName}) async { - String errorMsg = ""; - var result = await HttpUtil.instance - .client - .get(PathUnit.appInfo+"/$appName") - .catchError((err) { - errorMsg = err.toString(); - }); - - // 获取的数据非空且 status = true - if (result.data != null && result.data['status']) { - // 说明有数据 - if (result.data['data'] != null) { - return TaskResult.success( - data: AppInfo( - appName: result.data['data']['appName'], - appVersion: result.data['data']['appVersion'], - appUrl: result.data['data']['appUrl'], - appSize: result.data['data']['appSize'], - )); - } else { - return const TaskResult.success(data: null); - } - } - return TaskResult.error(msg: '请求错误: $errorMsg'); - } -} - -class AppInfo extends Equatable{ - final String appName; - final String appVersion; - final String appUrl; - final int appSize; - - const AppInfo({ - required this.appName, - required this.appVersion, - required this.appUrl, - required this.appSize, - }); - - @override - List get props => [appName,appVersion,appUrl,appSize]; - - @override - String toString() { - return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; - } -} \ No newline at end of file diff --git a/lib/point_system/api/category_api.dart b/lib/point_system/api/category_api.dart deleted file mode 100644 index 888f5c3a..00000000 --- a/lib/point_system/api/category_api.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:utils/utils.dart'; - - -/// create by 张风捷特烈 on 2021/2/24 -/// contact me by email 1981462002@qq.com -/// 说明: - -class CategoryApi { - static Future> uploadCategoryData( - {required String data, required String likeData}) async { - String errorMsg = ""; - - var result = await HttpUtil.instance.client.post( - PathUnit.categoryDataSync, - data: {"data": data, "likeData": likeData}).catchError((err) { - errorMsg = err.toString(); - }); - - if (result.data != null) { - return TaskResult.success(data:result.data); - } - - return TaskResult.error(msg: '请求错误: $errorMsg'); - } - - static Future> getCategoryData() async { - String errorMsg = ""; - var result = await HttpUtil.instance - .client - .get(PathUnit.categoryData) - .catchError((err) { - errorMsg =err.toString(); - - }); - - // 获取的数据非空且 status = true - if (result.data != null && result.data['status']) { - // 说明有数据 - if (result.data['data'] != null) { - return TaskResult.success(data:CategoryData.fromJson(result.data['data'])); - } else { - return const TaskResult.success(data:null); - } - } - - return TaskResult.error(msg: '请求错误: $errorMsg'); - } -} - -class CategoryData{ - final int categoryDataId; - final int userId; - final String data; - final String likeData; - - CategoryData( - {required this.categoryDataId, - required this.userId, - required this.data, - required this.likeData}); - - factory CategoryData.fromJson(Map map) { - return CategoryData( - categoryDataId: map['categoryDataId'], - userId: map["userId"], - likeData: map["likeData"], - data: map["data"]); - } -} \ No newline at end of file diff --git a/lib/point_system/api/issues_api.dart b/lib/point_system/api/issues_api.dart deleted file mode 100644 index 6d2040df..00000000 --- a/lib/point_system/api/issues_api.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'dart:convert'; - -import 'package:dio/dio.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -const kBaseUrl = 'http://119.45.173.197:8080/api/v1'; - -class IssuesApi { - static Dio dio = Dio(BaseOptions(baseUrl: kBaseUrl)); - - static Future getRepoFlutterUnit() async { - Response rep = await dio.get('/repository/name/FlutterUnit'); - dynamic repoStr = rep.data['data']['repositoryData']; - return Repository.fromJson(json.decode(repoStr)); - } - - static Future> getIssues( - {int page = 1, int pageSize = 100}) async { - List res = (await dio.get('/point', - queryParameters: {"page": page, "pageSize": pageSize})) - .data['data'] as List; - return res.map((e) => Issue.fromJson(json.decode(e['pointData']))).toList(); - } - - static Future> getIssuesComment(int pointId) async { - List res = (await dio.get('/pointComment/$pointId')).data['data'] as List; - return res - .map((e) => IssueComment.fromJson(json.decode(e['pointCommentData']))) - .toList(); - } -} diff --git a/lib/point_system/blocs/point_bloc/point_bloc.dart b/lib/point_system/blocs/point_bloc/point_bloc.dart deleted file mode 100644 index fd4d3281..00000000 --- a/lib/point_system/blocs/point_bloc/point_bloc.dart +++ /dev/null @@ -1,28 +0,0 @@ - -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; - -import 'point_event.dart'; -import 'point_state.dart'; - - -/// create by 张风捷特烈 on 2020-09-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PointBloc extends Bloc { - PointBloc() : super(PointLoading()){ - on(_onEventLoadPoint); - } - - void _onEventLoadPoint(PointEvent event,Emitter emit) async{ - emit( PointLoading()); - try { - final issues = await IssuesApi.getIssues(); - emit( PointLoaded(issues)); - } catch (err) { - print(err); - emit( PointLoadFailure(err.toString())); - } - } -} diff --git a/lib/point_system/blocs/point_bloc/point_event.dart b/lib/point_system/blocs/point_bloc/point_event.dart deleted file mode 100644 index 5c686d59..00000000 --- a/lib/point_system/blocs/point_bloc/point_event.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointEvent extends Equatable { - -} - -class EventLoadPoint extends PointEvent{ - - @override - List get props => []; - -} \ No newline at end of file diff --git a/lib/point_system/blocs/point_bloc/point_state.dart b/lib/point_system/blocs/point_bloc/point_state.dart deleted file mode 100644 index 43b8dc9e..00000000 --- a/lib/point_system/blocs/point_bloc/point_state.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointState extends Equatable{ - -} - -class PointLoading extends PointState{ - @override - List get props => []; -} - -class PointLoaded extends PointState{ - - final List issues; - - PointLoaded(this.issues); - - @override - List get props => [issues]; -} - - -class PointLoadFailure extends PointState{ - - final String error; - - PointLoadFailure(this.error); - - @override - List get props => [error]; -} \ No newline at end of file diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart b/lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart deleted file mode 100644 index 4977bf68..00000000 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart +++ /dev/null @@ -1,36 +0,0 @@ - -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - - - -import 'point_comment_event.dart'; -import 'point_comment_state.dart'; - - -/// create by 张风捷特烈 on 2020-09-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PointCommentBloc extends Bloc { - - PointCommentBloc() : super(PointCommentInitial()){ - on(_onEventLoadPointComment); - } - - void _onEventLoadPointComment(EventLoadPointComment event,Emitter emit) async{ - emit( PointCommentLoading(event.point)); - if(event.point.number==null){ - emit( PointCommentLoadFailure('point_bloc id 为空')); - } - try { - final List comments = await IssuesApi.getIssuesComment(event.point.number!); - comments.sort((a,b)=>a.createdAt!.compareTo(b.createdAt!)); - emit( PointCommentLoaded(event.point,comments)); - } catch (err) { - print(err); - emit( PointCommentLoadFailure(err.toString())); - } - } -} diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_event.dart b/lib/point_system/blocs/point_comment_bloc/point_comment_event.dart deleted file mode 100644 index 15da9ed5..00000000 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_event.dart +++ /dev/null @@ -1,19 +0,0 @@ - - -import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointCommentEvent extends Equatable {} - -class EventLoadPointComment extends PointCommentEvent { - final Issue point; - - EventLoadPointComment(this.point); - - @override - List get props => [point]; -} diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_state.dart b/lib/point_system/blocs/point_comment_bloc/point_comment_state.dart deleted file mode 100644 index 1b53df4e..00000000 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_state.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointCommentState extends Equatable{ - -} - -class PointCommentInitial extends PointCommentState{ - - - @override - List get props => []; -} - -class PointCommentLoading extends PointCommentState{ - final Issue issue; - - PointCommentLoading(this.issue); - - @override - List get props => [issue]; -} - -class PointCommentLoaded extends PointCommentState{ - - final Issue issue; - final List comments; - - PointCommentLoaded(this.issue,this.comments); - - @override - List get props => [issue,comments]; - - @override - String toString() { - return 'PointCommentLoaded{issue: $issue, comments: $comments}'; - } -} - - -class PointCommentLoadFailure extends PointCommentState{ - - final String error; - - PointCommentLoadFailure(this.error); - - @override - List get props => [error]; -} \ No newline at end of file diff --git a/lib/point_system/blocs/point_system_bloc.dart b/lib/point_system/blocs/point_system_bloc.dart deleted file mode 100644 index e9642c71..00000000 --- a/lib/point_system/blocs/point_system_bloc.dart +++ /dev/null @@ -1,9 +0,0 @@ -export './point_comment_bloc/point_comment_bloc.dart'; -export './point_comment_bloc/point_comment_event.dart'; -export './point_comment_bloc/point_comment_state.dart'; - -export './point_bloc/point_bloc.dart'; -export './point_bloc/point_event.dart'; -export './point_bloc/point_state.dart'; - - diff --git a/lib/point_system/views/desk_ui/desk_point_page.dart b/lib/point_system/views/desk_ui/desk_point_page.dart deleted file mode 100644 index 904495ea..00000000 --- a/lib/point_system/views/desk_ui/desk_point_page.dart +++ /dev/null @@ -1,141 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../app/plateform_adapter/window/windows_adapter.dart'; -import '../../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; -import '../../blocs/point_bloc/point_bloc.dart'; -import '../../blocs/point_bloc/point_event.dart'; -import '../../github_model/repository.dart'; -import '../../views/issues_point/issues_point_page.dart'; -import 'github_repo_panel.dart'; - -class DeskPointPage extends StatefulWidget { - const DeskPointPage({Key? key}) : super(key: key); - - @override - State createState() => _DeskPointPageState(); -} - -class _DeskPointPageState extends State { - - final Repository _repository = Repository.fromJson({ - 'full_name': 'toly1994328/FlutterUnit', - 'license': {"spdx_id": 'GPL-3.0'}, - 'description': - '【Flutter 集录指南 App】The unity of flutter, The unity of coder.', - 'stargazers_count': 5840, - 'forks_count': 956, - 'subscribers_count': 126, - 'open_issues_count': 40, - }); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => PointBloc()..add(EventLoadPoint()), - child: Scaffold( - body: Column( - children: [ - SimpleDeskTopBar( - leading: Text( - 'Flutter 要点集录', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - ), - Divider(height: 1), - Expanded( - child: Row( - children: [ - Column( - children: [ - GithubRepoPanel( - repository: _repository, - ), - Expanded( - child: SizedBox( - width: 250, - child: IssuesTip()) - ) - ], - ), - VerticalDivider(width: 1,), - Expanded(flex: 2, child: IssuesPointContent()), - ], - )) - ], - ), - ), - ); - } -} - -class IssuesTip extends StatelessWidget { - const IssuesTip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Text.rich( - TextSpan(children: [ - TextSpan( - text: '* 注: ', - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold)), - TextSpan( - text: - '要点集录中的 QA 数据收录在 FlutterUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'), - TextSpan( - text: '点击这里跳转', - mouseCursor: SystemMouseCursors.click, - recognizer: TapGestureRecognizer() - ..onTap = _toUrl, - style: TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline, - fontWeight: FontWeight.bold)), - ]), - style: TextStyle(fontSize: 14), - ), - ); - } - - void _toUrl() async{ - String url = 'https://github.com/toly1994328/FlutterUnit/issues?q=label%3Apoint+'; - if (!await launchUrl(Uri.parse(url))) { - throw Exception('Could not launch $url'); - } - } -} - - -class SimpleDeskTopBar extends StatelessWidget { - final Widget? leading; - - const SimpleDeskTopBar({super.key, this.leading}); - - @override - Widget build(BuildContext context) { - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), - height: 64, - color: Colors.white, - child: Row( - children: [ - if (leading != null) leading!, - const Spacer(), - const SizedBox( - width: 20, - ), - const WindowButtons(), - ], - ), - ), - ); - } -} diff --git a/lib/point_system/views/issues_point/issue_item.dart b/lib/point_system/views/issues_point/issue_item.dart deleted file mode 100644 index 0cb8f276..00000000 --- a/lib/point_system/views/issues_point/issue_item.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'dart:ui'; - -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - - - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -class IssueItem extends StatelessWidget { - final Issue issue; - - const IssueItem({Key? key, required this.issue}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).dividerColor, - width: 1 / window.devicePixelRatio))), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTop(), - Padding( - padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), - child: Text( - '${issue.title}', - style: const TextStyle(fontSize: 15, color: Colors.grey, shadows: [ - Shadow(color: Colors.white, offset: Offset(1, .5)) - ]), - ), - ), - Row( - children: [ - const Spacer(), - WrapColor( - color: Colors.greenAccent, - child: Text( - issue.commentNum.toString(), - style: const TextStyle(color: Colors.white), - )), - const SizedBox( - width: 5, - ), - const Icon( - TolyIcon.icon_common, - size: 20, - ), - ], - ) - ], - ), - ); - } - - Widget _buildTop() { - return Row( - children: [ - CircleImage( - image: NetworkImage(issue.user?.avatarUrl??''), - size: 40, - borderSize: 2, - ), - const SizedBox( - width: 10, - ), - WrapColor( - child: Text( - "#${issue.number}", - style: const TextStyle(color: Colors.white), - )), - const SizedBox( - width: 10, - ), - Text( - '${issue.user?.login}', - style: const TextStyle(fontWeight: FontWeight.bold), - ), - const Spacer(), - Text(ConvertMan.time2string(issue.createdAt!)), - ], - ); - } -} \ No newline at end of file diff --git a/lib/point_system/views/issues_point/issues_detail.dart b/lib/point_system/views/issues_point/issues_detail.dart deleted file mode 100644 index ef5c78ff..00000000 --- a/lib/point_system/views/issues_point/issues_detail.dart +++ /dev/null @@ -1,181 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -class IssuesDetailPage extends StatelessWidget { - const IssuesDetailPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Flutter Point'), - ), - body: BlocBuilder( - builder: _buildContent), - ); - } - - Widget _buildContent(BuildContext context, PointCommentState state) { - if (state is PointCommentLoading) { - return IssueTitle(issue: state.issue); - } - - if (state is PointCommentLoaded) { - return CustomScrollView( - slivers: [ - SliverToBoxAdapter(child: IssueTitle(issue: state.issue)), - SliverList( - delegate: SliverChildBuilderDelegate( - (ctx, int index) => IssueCommentWidget( - comment: state.comments[index], - ), - childCount: state.comments.length), - ) - ], - ); - } - - return Container(); - } -} - -class IssueTitle extends StatelessWidget { - final Issue issue; - - const IssueTitle({Key? key, required this.issue}) : super(key: key); - - String get issueDesHtml => issue.bodyHtml != null - ? issue.bodyHtml! - : (issue.body != null) - ? issue.body! - : ""; - - @override - Widget build(BuildContext context) { - return SingleChildScrollView( - child: Column( - children: [ - Stack( - children: [ - Container( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Panel( - child: Text( - '${issue.title}', - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.bold), - )), - ), - Positioned( - right: 10, - bottom: 10, - child: WrapColor( - child: Text( - '#${issue.number}', - style: const TextStyle(color: Colors.white), - ), - )), - ], - ), - const Divider(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: WrapColor( - color: Colors.blue.withAlpha(22), - child: ListTile( - dense: true, - leading: CircleImage( - size: 40, - borderSize: 1, - image: NetworkImage(issue.user!.avatarUrl!), - ), - title: Text(issue.user!.login!), - subtitle: Row( - children: [ - Text('创建于:${ConvertMan.time2string(issue.createdAt!)}'), - const Spacer(), - WrapColor( - color: Colors.green, - child: Text( - '更新于:${ConvertMan.time2string(issue.updatedAt!)}', - style: const TextStyle(color: Colors.white), - )), - ], - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: MarkdownWidget( - markdownData: issueDesHtml, style: MarkdownWidget.kWhite), - ), - const Divider( - thickness: 2, - ) - ], - ), - ); - } -} - -class IssueCommentWidget extends StatelessWidget { - final IssueComment comment; - - const IssueCommentWidget({Key? key, required this.comment}) : super(key: key); - - String get issueDesHtml => comment.bodyHtml != null - ? comment.bodyHtml! - : (comment.body != null) - ? comment.body! - : ""; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: WrapColor( - color: Colors.blue.withAlpha(22), - child: ListTile( - dense: true, - leading: CircleImage( - size: 40, - borderSize: 1, - image: NetworkImage(comment.user!.avatarUrl!), - ), - title: Text(comment.user!.login!), - subtitle: Row( - children: [ - Text('创建于:${ConvertMan.time2string(comment.createdAt!)}'), - const Spacer(), - WrapColor( - color: Colors.green, - child: Text( - '更新于:${ConvertMan.time2string(comment.updatedAt!)}', - style: const TextStyle(color: Colors.white), - )), - ], - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: MarkdownWidget( - markdownData: issueDesHtml, style: MarkdownWidget.kWhite), - ), - const Divider(thickness: 2) - ], - ); - } -} diff --git a/lib/point_system/views/issues_point/issues_point_page.dart b/lib/point_system/views/issues_point/issues_point_page.dart deleted file mode 100644 index 0cd07104..00000000 --- a/lib/point_system/views/issues_point/issues_point_page.dart +++ /dev/null @@ -1,164 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_spinkit/flutter_spinkit.dart'; - -import 'package:flutter_unit/app/router/unit_router.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; - -import 'issue_item.dart'; -import 'issues_detail.dart'; -import 'repo_widget.dart'; - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -class IssuesPointScope extends StatelessWidget { - const IssuesPointScope({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider(providers: [ - BlocProvider(create: (_) => PointBloc()..add(EventLoadPoint())), - ], child: const IssuesPointPage(), - ); - } -} - -class IssuesPointPage extends StatelessWidget { - const IssuesPointPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Scaffold(body: IssuesPointContent()); - } -} - -class IssuesPointContent extends StatefulWidget { - const IssuesPointContent({Key? key}) : super(key: key); - - @override - _IssuesPointContentState createState() => _IssuesPointContentState(); -} - -class _IssuesPointContentState extends State { - Repository? _repository; - - @override - void initState() { - super.initState(); - _loadRepo(); - } - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => RefreshIndicator( - onRefresh: _loadIssues, - child: CustomScrollView(slivers: [ - // _buildSliverAppBar(), - buildContentByState(state) - ]), - )); - } - - Widget buildContentByState(PointState state) { - if (state is PointLoading) { - return const SliverPadding( - padding: EdgeInsets.only(top: 150), - sliver: SliverToBoxAdapter( - child: Center( - child: SpinKitCircle( - color: Colors.blue, - ), - )), - ); - } - - if (state is PointLoaded) { - List issues = state.issues; - return SliverList( - delegate: SliverChildBuilderDelegate( - (ctx, int index) => GestureDetector( - onTap: () { - Navigator.of(context).push(Right2LeftRouter( - child: BlocProvider( - create: (_) => PointCommentBloc() - ..add(EventLoadPointComment(issues[index])), - child: const IssuesDetailPage()))); - - // Navigator.pushNamed(ctx, UnitRouter. - // ); - }, - child: IssueItem(issue: issues[index])), - childCount: issues.length),); - } - - if (state is PointLoadFailure) { - return SliverPadding( - padding: const EdgeInsets.only(top: 40), - sliver: SliverToBoxAdapter( - child: Center( - child: Text(state.error), - )), - ); - } - - return const SliverPadding( - padding: EdgeInsets.zero, - ); - } - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 210.0, -// leading: _buildLeading(), - title: const Text('Flutter要点集录'), -// actions: _buildActions(), - elevation: 5, - pinned: true, - actions: [ - IconButton( - icon: const Icon( - Icons.help_outline, - color: Colors.white, - ), - onPressed: () { - Navigator.of(context).pushNamed(UnitRouter.bug); - }) - ], - backgroundColor: Colors.blue, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: _repository == null - ? const Center( - child: SpinKitFadingCube( - color: Colors.white, - ), - ) - : RepoWidget( - repository: _repository!, - ), - ), - ); - } - - Future _loadIssues() async { - BlocProvider.of(context).add(EventLoadPoint()); - await Future.delayed(const Duration(milliseconds: 200)); - } - - void _loadRepo() async { - final Repository? result = await IssuesApi.getRepoFlutterUnit(); - setState(() { - if (result != null) { - _repository = result; - } - }); - } -} diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart new file mode 100644 index 00000000..0f3b0ee7 --- /dev/null +++ b/lib/src/flutter_unit.dart @@ -0,0 +1,91 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; + +import 'package:go_router/go_router.dart'; +import 'package:l10n/gen_l10n/app_localizations.dart'; +import 'package:l10n/l10n.dart'; +import 'package:tolyui/app/toly_ui.dart'; +import 'package:widget_module/widget_module.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:note/note.dart'; +import 'l10n/gen/app_l10n.dart'; +import 'l10n/locale_provider.dart'; +import 'navigation/router/app_route.dart'; + +/// create by 张风捷特烈 on 2020/4/28 +/// contact me by email 1981462002@qq.com +/// 说明: 应用主程序 + +class FlutterUnit3 extends StatefulWidget { + const FlutterUnit3({super.key}); + + @override + State createState() => _FlutterUnit3State(); +} + +class _FlutterUnit3State extends State with LocalProvider { + final GoRouter _router = GoRouter( + initialLocation: AppRoute.splash.url, + routes: [appRoute], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go(AppRoute.globalError.url, extra: state.uri.toString()); + }, + ); + + @override + void initState() { + super.initState(); + _initWeb(); + } + + @override + Widget build(BuildContext context) { + AppConfig state = context.watch().state; + ThemeData dark = darkTheme(state); + ThemeData light = lightTheme(state); + return BlocListener( + listenWhen: (p, n) => p.language != n.language, + listener: _onLocaleChange, + child: DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: TolyUiApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: localizationsDelegates, + supportedLocales: supportedLocales, + locale: state.language.locale, + themeMode: state.themeMode, + darkTheme: dark, + theme: light, + ), + ), + ); + } + + void _initWeb() { + if (!kAppEnv.isWeb) return; + GoRouter.optionURLReflectsImperativeAPIs = true; + context.initWidgetData(); + } + + void _onLocaleChange(BuildContext context, AppConfig state) { + context.read().changeLocale(state.language.locale); + } + + @override + Iterable? get localizationsDelegates => const [ + AppL10n.delegate, + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, + ]; + + @override + List get supportedLocales => l10nLocales; +} diff --git a/lib/src/l10n/arb/app_de.arb b/lib/src/l10n/arb/app_de.arb new file mode 100644 index 00000000..915213a3 --- /dev/null +++ b/lib/src/l10n/arb/app_de.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Widget-Sammlung", + "deskTabPainter": "Zeichnungssammlung", + "deskTabKnowledge": "Wissensdatenbank", + "deskTabTools": "Werkzeugkasten", + "deskTabMine": "App-Info", + "messageBoard": "Pinnwand", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Malen", + "mobileTabKnowledge": "Wissen", + "mobileTabTools": "Werkzeuge", + "mobileTabMine": "Mein", + "newBoard": "Neu", + "news": "Neuigkeiten", + "moreNews": "Mehr News" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_en.arb b/lib/src/l10n/arb/app_en.arb new file mode 100644 index 00000000..9a3d0f4f --- /dev/null +++ b/lib/src/l10n/arb/app_en.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Widgets", + "deskTabPainter": "Painter", + "deskTabKnowledge": "Knowledge", + "deskTabTools": "Treasure", + "deskTabMine": "About", + "messageBoard": "Message Board", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Painter", + "mobileTabKnowledge": "Knowledge", + "mobileTabTools": "Treasure", + "mobileTabMine": "Mine", + "newBoard": "New", + "news": "News", + "moreNews": "More News" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_es.arb b/lib/src/l10n/arb/app_es.arb new file mode 100644 index 00000000..ede49fdb --- /dev/null +++ b/lib/src/l10n/arb/app_es.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Colección de widgets", + "deskTabPainter": "Colección de dibujos", + "deskTabKnowledge": "Centro de conocimiento", + "deskTabTools": "Caja de herramientas", + "deskTabMine": "Info App", + "messageBoard": "Tablero de Mensajes", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dibujo", + "mobileTabKnowledge": "Conocimiento", + "mobileTabTools": "Herramientas", + "mobileTabMine": "Mi", + "newBoard": "Nuevo", + "news": "Noticias", + "moreNews": "Más noticias" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_fr.arb b/lib/src/l10n/arb/app_fr.arb new file mode 100644 index 00000000..2e271c2d --- /dev/null +++ b/lib/src/l10n/arb/app_fr.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Collection de widgets", + "deskTabPainter": "Collection de dessins", + "deskTabKnowledge": "Base de connaissances", + "deskTabTools": "Boîte à outils", + "deskTabMine": "Infos App", + "messageBoard": "Tableau de messages", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dessin", + "mobileTabKnowledge": "Connaissances", + "mobileTabTools": "Outils", + "mobileTabMine": "Moi", + "newBoard": "Nouveau", + "news": "Actualités", + "moreNews": "Plus d'actualités" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_it.arb b/lib/src/l10n/arb/app_it.arb new file mode 100644 index 00000000..7cf9050c --- /dev/null +++ b/lib/src/l10n/arb/app_it.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Raccolta widget", + "deskTabPainter": "Raccolta disegni", + "deskTabKnowledge": "Hub conoscitivo", + "deskTabTools": "Cassetta degli attrezzi", + "deskTabMine": "Info App", + "messageBoard": "Bacheca", + "mobileTabWidgets": "Widget", + "mobileTabPainter": "Disegno", + "mobileTabKnowledge": "Conoscenza", + "mobileTabTools": "Strumenti", + "mobileTabMine": "Io", + "newBoard": "Nuovo", + "news": "Notizie", + "moreNews": "Altre notizie" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ja.arb b/lib/src/l10n/arb/app_ja.arb new file mode 100644 index 00000000..dcf1cb0c --- /dev/null +++ b/lib/src/l10n/arb/app_ja.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "ウィジェット集", + "deskTabPainter": "描画集", + "deskTabKnowledge": "ナレッジハブ", + "deskTabTools": "ツールボックス", + "deskTabMine": "アプリ情報", + "messageBoard": "掲示板", + "mobileTabWidgets": "ウィジェット", + "mobileTabPainter": "描画", + "mobileTabKnowledge": "知識", + "mobileTabTools": "ツール", + "mobileTabMine": "マイ", + "newBoard": "新規作成", + "news": "最新情報", + "moreNews": "もっと見る" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ko.arb b/lib/src/l10n/arb/app_ko.arb new file mode 100644 index 00000000..a3952eb9 --- /dev/null +++ b/lib/src/l10n/arb/app_ko.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "위젯 모음집", + "deskTabPainter": "그림 모음집", + "deskTabKnowledge": "지식 허브", + "deskTabTools": "도구 상자", + "deskTabMine": "앱 정보", + "messageBoard": "게시판", + "mobileTabWidgets": "위젯", + "mobileTabPainter": "그리기", + "mobileTabKnowledge": "지식", + "mobileTabTools": "도구", + "mobileTabMine": "내 정보", + "newBoard": "새 글", + "news": "최신 소식", + "moreNews": "더 보기" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_pt.arb b/lib/src/l10n/arb/app_pt.arb new file mode 100644 index 00000000..4b877bfa --- /dev/null +++ b/lib/src/l10n/arb/app_pt.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Coleção de widgets", + "deskTabPainter": "Coleção de desenhos", + "deskTabKnowledge": "Hub de conhecimento", + "deskTabTools": "Caixa de ferramentas", + "deskTabMine": "Info App", + "messageBoard": "Quadro de Mensagens", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Desenho", + "mobileTabKnowledge": "Conhecimento", + "mobileTabTools": "Ferramentas", + "mobileTabMine": "Meu", + "newBoard": "Novo", + "news": "Novidades", + "moreNews": "Mais novidades" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ru.arb b/lib/src/l10n/arb/app_ru.arb new file mode 100644 index 00000000..64b61c2e --- /dev/null +++ b/lib/src/l10n/arb/app_ru.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "Коллекция виджетов", + "deskTabPainter": "Коллекция рисунков", + "deskTabKnowledge": "База знаний", + "deskTabTools": "Инструменты", + "deskTabMine": "Информация", + "messageBoard": "Доска сообщений", + "mobileTabWidgets": "Виджеты", + "mobileTabPainter": "Рисование", + "mobileTabKnowledge": "Знания", + "mobileTabTools": "Инструменты", + "mobileTabMine": "Мои", + "newBoard": "Создать", + "news": "Новости", + "moreNews": "Больше новостей" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_zh.arb b/lib/src/l10n/arb/app_zh.arb new file mode 100644 index 00000000..5b4d2f39 --- /dev/null +++ b/lib/src/l10n/arb/app_zh.arb @@ -0,0 +1,16 @@ +{ + "deskTabWidgets": "组件集录", + "deskTabPainter": "绘制集录", + "deskTabKnowledge": "知识集锦", + "deskTabTools": "工具宝箱", + "deskTabMine": "应用信息", + "messageBoard": "留言板", + "mobileTabWidgets": "组件", + "mobileTabPainter": "绘制", + "mobileTabKnowledge": "知识", + "mobileTabTools": "工具", + "mobileTabMine": "我的", + "newBoard": "新建 ", + "news": "最新资讯", + "moreNews": "查看更多" +} \ No newline at end of file diff --git a/lib/src/l10n/gen/app_l10n.dart b/lib/src/l10n/gen/app_l10n.dart new file mode 100644 index 00000000..39cd6ac3 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n.dart @@ -0,0 +1,257 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_l10n_de.dart'; +import 'app_l10n_en.dart'; +import 'app_l10n_es.dart'; +import 'app_l10n_fr.dart'; +import 'app_l10n_it.dart'; +import 'app_l10n_ja.dart'; +import 'app_l10n_ko.dart'; +import 'app_l10n_pt.dart'; +import 'app_l10n_ru.dart'; +import 'app_l10n_zh.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppL10n +/// returned by `AppL10n.of(context)`. +/// +/// Applications need to include `AppL10n.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'gen/app_l10n.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppL10n.localizationsDelegates, +/// supportedLocales: AppL10n.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppL10n.supportedLocales +/// property. +abstract class AppL10n { + AppL10n(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppL10n of(BuildContext context) { + return Localizations.of(context, AppL10n)!; + } + + static const LocalizationsDelegate delegate = _AppL10nDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('de'), + Locale('en'), + Locale('es'), + Locale('fr'), + Locale('it'), + Locale('ja'), + Locale('ko'), + Locale('pt'), + Locale('ru'), + Locale('zh') + ]; + + /// No description provided for @deskTabWidgets. + /// + /// In zh, this message translates to: + /// **'组件集录'** + String get deskTabWidgets; + + /// No description provided for @deskTabPainter. + /// + /// In zh, this message translates to: + /// **'绘制集录'** + String get deskTabPainter; + + /// No description provided for @deskTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识集锦'** + String get deskTabKnowledge; + + /// No description provided for @deskTabTools. + /// + /// In zh, this message translates to: + /// **'工具宝箱'** + String get deskTabTools; + + /// No description provided for @deskTabMine. + /// + /// In zh, this message translates to: + /// **'应用信息'** + String get deskTabMine; + + /// No description provided for @messageBoard. + /// + /// In zh, this message translates to: + /// **'留言板'** + String get messageBoard; + + /// No description provided for @mobileTabWidgets. + /// + /// In zh, this message translates to: + /// **'组件'** + String get mobileTabWidgets; + + /// No description provided for @mobileTabPainter. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get mobileTabPainter; + + /// No description provided for @mobileTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get mobileTabKnowledge; + + /// No description provided for @mobileTabTools. + /// + /// In zh, this message translates to: + /// **'工具'** + String get mobileTabTools; + + /// No description provided for @mobileTabMine. + /// + /// In zh, this message translates to: + /// **'我的'** + String get mobileTabMine; + + /// No description provided for @newBoard. + /// + /// In zh, this message translates to: + /// **'新建 '** + String get newBoard; + + /// No description provided for @news. + /// + /// In zh, this message translates to: + /// **'最新资讯'** + String get news; + + /// No description provided for @moreNews. + /// + /// In zh, this message translates to: + /// **'查看更多'** + String get moreNews; +} + +class _AppL10nDelegate extends LocalizationsDelegate { + const _AppL10nDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppL10n(locale)); + } + + @override + bool isSupported(Locale locale) => [ + 'de', + 'en', + 'es', + 'fr', + 'it', + 'ja', + 'ko', + 'pt', + 'ru', + 'zh' + ].contains(locale.languageCode); + + @override + bool shouldReload(_AppL10nDelegate old) => false; +} + +AppL10n lookupAppL10n(Locale locale) { + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'de': + return AppL10nDe(); + case 'en': + return AppL10nEn(); + case 'es': + return AppL10nEs(); + case 'fr': + return AppL10nFr(); + case 'it': + return AppL10nIt(); + case 'ja': + return AppL10nJa(); + case 'ko': + return AppL10nKo(); + case 'pt': + return AppL10nPt(); + case 'ru': + return AppL10nRu(); + case 'zh': + return AppL10nZh(); + } + + throw FlutterError( + 'AppL10n.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); +} diff --git a/lib/src/l10n/gen/app_l10n_de.dart b/lib/src/l10n/gen/app_l10n_de.dart new file mode 100644 index 00000000..f8e2660c --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_de.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for German (`de`). +class AppL10nDe extends AppL10n { + AppL10nDe([String locale = 'de']) : super(locale); + + @override + String get deskTabWidgets => 'Widget-Sammlung'; + + @override + String get deskTabPainter => 'Zeichnungssammlung'; + + @override + String get deskTabKnowledge => 'Wissensdatenbank'; + + @override + String get deskTabTools => 'Werkzeugkasten'; + + @override + String get deskTabMine => 'App-Info'; + + @override + String get messageBoard => 'Pinnwand'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Malen'; + + @override + String get mobileTabKnowledge => 'Wissen'; + + @override + String get mobileTabTools => 'Werkzeuge'; + + @override + String get mobileTabMine => 'Mein'; + + @override + String get newBoard => 'Neu'; + + @override + String get news => 'Neuigkeiten'; + + @override + String get moreNews => 'Mehr News'; +} diff --git a/lib/src/l10n/gen/app_l10n_en.dart b/lib/src/l10n/gen/app_l10n_en.dart new file mode 100644 index 00000000..65194446 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_en.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppL10nEn extends AppL10n { + AppL10nEn([String locale = 'en']) : super(locale); + + @override + String get deskTabWidgets => 'Widgets'; + + @override + String get deskTabPainter => 'Painter'; + + @override + String get deskTabKnowledge => 'Knowledge'; + + @override + String get deskTabTools => 'Treasure'; + + @override + String get deskTabMine => 'About'; + + @override + String get messageBoard => 'Message Board'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Painter'; + + @override + String get mobileTabKnowledge => 'Knowledge'; + + @override + String get mobileTabTools => 'Treasure'; + + @override + String get mobileTabMine => 'Mine'; + + @override + String get newBoard => 'New'; + + @override + String get news => 'News'; + + @override + String get moreNews => 'More News'; +} diff --git a/lib/src/l10n/gen/app_l10n_es.dart b/lib/src/l10n/gen/app_l10n_es.dart new file mode 100644 index 00000000..121c6f7d --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_es.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppL10nEs extends AppL10n { + AppL10nEs([String locale = 'es']) : super(locale); + + @override + String get deskTabWidgets => 'Colección de widgets'; + + @override + String get deskTabPainter => 'Colección de dibujos'; + + @override + String get deskTabKnowledge => 'Centro de conocimiento'; + + @override + String get deskTabTools => 'Caja de herramientas'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get messageBoard => 'Tablero de Mensajes'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Dibujo'; + + @override + String get mobileTabKnowledge => 'Conocimiento'; + + @override + String get mobileTabTools => 'Herramientas'; + + @override + String get mobileTabMine => 'Mi'; + + @override + String get newBoard => 'Nuevo'; + + @override + String get news => 'Noticias'; + + @override + String get moreNews => 'Más noticias'; +} diff --git a/lib/src/l10n/gen/app_l10n_fr.dart b/lib/src/l10n/gen/app_l10n_fr.dart new file mode 100644 index 00000000..14d753ca --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_fr.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class AppL10nFr extends AppL10n { + AppL10nFr([String locale = 'fr']) : super(locale); + + @override + String get deskTabWidgets => 'Collection de widgets'; + + @override + String get deskTabPainter => 'Collection de dessins'; + + @override + String get deskTabKnowledge => 'Base de connaissances'; + + @override + String get deskTabTools => 'Boîte à outils'; + + @override + String get deskTabMine => 'Infos App'; + + @override + String get messageBoard => 'Tableau de messages'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Dessin'; + + @override + String get mobileTabKnowledge => 'Connaissances'; + + @override + String get mobileTabTools => 'Outils'; + + @override + String get mobileTabMine => 'Moi'; + + @override + String get newBoard => 'Nouveau'; + + @override + String get news => 'Actualités'; + + @override + String get moreNews => 'Plus d\'actualités'; +} diff --git a/lib/src/l10n/gen/app_l10n_it.dart b/lib/src/l10n/gen/app_l10n_it.dart new file mode 100644 index 00000000..20d3e47c --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_it.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Italian (`it`). +class AppL10nIt extends AppL10n { + AppL10nIt([String locale = 'it']) : super(locale); + + @override + String get deskTabWidgets => 'Raccolta widget'; + + @override + String get deskTabPainter => 'Raccolta disegni'; + + @override + String get deskTabKnowledge => 'Hub conoscitivo'; + + @override + String get deskTabTools => 'Cassetta degli attrezzi'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get messageBoard => 'Bacheca'; + + @override + String get mobileTabWidgets => 'Widget'; + + @override + String get mobileTabPainter => 'Disegno'; + + @override + String get mobileTabKnowledge => 'Conoscenza'; + + @override + String get mobileTabTools => 'Strumenti'; + + @override + String get mobileTabMine => 'Io'; + + @override + String get newBoard => 'Nuovo'; + + @override + String get news => 'Notizie'; + + @override + String get moreNews => 'Altre notizie'; +} diff --git a/lib/src/l10n/gen/app_l10n_ja.dart b/lib/src/l10n/gen/app_l10n_ja.dart new file mode 100644 index 00000000..d55fc327 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ja.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppL10nJa extends AppL10n { + AppL10nJa([String locale = 'ja']) : super(locale); + + @override + String get deskTabWidgets => 'ウィジェット集'; + + @override + String get deskTabPainter => '描画集'; + + @override + String get deskTabKnowledge => 'ナレッジハブ'; + + @override + String get deskTabTools => 'ツールボックス'; + + @override + String get deskTabMine => 'アプリ情報'; + + @override + String get messageBoard => '掲示板'; + + @override + String get mobileTabWidgets => 'ウィジェット'; + + @override + String get mobileTabPainter => '描画'; + + @override + String get mobileTabKnowledge => '知識'; + + @override + String get mobileTabTools => 'ツール'; + + @override + String get mobileTabMine => 'マイ'; + + @override + String get newBoard => '新規作成'; + + @override + String get news => '最新情報'; + + @override + String get moreNews => 'もっと見る'; +} diff --git a/lib/src/l10n/gen/app_l10n_ko.dart b/lib/src/l10n/gen/app_l10n_ko.dart new file mode 100644 index 00000000..920b7a29 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ko.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppL10nKo extends AppL10n { + AppL10nKo([String locale = 'ko']) : super(locale); + + @override + String get deskTabWidgets => '위젯 모음집'; + + @override + String get deskTabPainter => '그림 모음집'; + + @override + String get deskTabKnowledge => '지식 허브'; + + @override + String get deskTabTools => '도구 상자'; + + @override + String get deskTabMine => '앱 정보'; + + @override + String get messageBoard => '게시판'; + + @override + String get mobileTabWidgets => '위젯'; + + @override + String get mobileTabPainter => '그리기'; + + @override + String get mobileTabKnowledge => '지식'; + + @override + String get mobileTabTools => '도구'; + + @override + String get mobileTabMine => '내 정보'; + + @override + String get newBoard => '새 글'; + + @override + String get news => '최신 소식'; + + @override + String get moreNews => '더 보기'; +} diff --git a/lib/src/l10n/gen/app_l10n_pt.dart b/lib/src/l10n/gen/app_l10n_pt.dart new file mode 100644 index 00000000..ba255d47 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_pt.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Portuguese (`pt`). +class AppL10nPt extends AppL10n { + AppL10nPt([String locale = 'pt']) : super(locale); + + @override + String get deskTabWidgets => 'Coleção de widgets'; + + @override + String get deskTabPainter => 'Coleção de desenhos'; + + @override + String get deskTabKnowledge => 'Hub de conhecimento'; + + @override + String get deskTabTools => 'Caixa de ferramentas'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get messageBoard => 'Quadro de Mensagens'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Desenho'; + + @override + String get mobileTabKnowledge => 'Conhecimento'; + + @override + String get mobileTabTools => 'Ferramentas'; + + @override + String get mobileTabMine => 'Meu'; + + @override + String get newBoard => 'Novo'; + + @override + String get news => 'Novidades'; + + @override + String get moreNews => 'Mais novidades'; +} diff --git a/lib/src/l10n/gen/app_l10n_ru.dart b/lib/src/l10n/gen/app_l10n_ru.dart new file mode 100644 index 00000000..7f00e6c9 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ru.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppL10nRu extends AppL10n { + AppL10nRu([String locale = 'ru']) : super(locale); + + @override + String get deskTabWidgets => 'Коллекция виджетов'; + + @override + String get deskTabPainter => 'Коллекция рисунков'; + + @override + String get deskTabKnowledge => 'База знаний'; + + @override + String get deskTabTools => 'Инструменты'; + + @override + String get deskTabMine => 'Информация'; + + @override + String get messageBoard => 'Доска сообщений'; + + @override + String get mobileTabWidgets => 'Виджеты'; + + @override + String get mobileTabPainter => 'Рисование'; + + @override + String get mobileTabKnowledge => 'Знания'; + + @override + String get mobileTabTools => 'Инструменты'; + + @override + String get mobileTabMine => 'Мои'; + + @override + String get newBoard => 'Создать'; + + @override + String get news => 'Новости'; + + @override + String get moreNews => 'Больше новостей'; +} diff --git a/lib/src/l10n/gen/app_l10n_zh.dart b/lib/src/l10n/gen/app_l10n_zh.dart new file mode 100644 index 00000000..2e2086d1 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_zh.dart @@ -0,0 +1,52 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class AppL10nZh extends AppL10n { + AppL10nZh([String locale = 'zh']) : super(locale); + + @override + String get deskTabWidgets => '组件集录'; + + @override + String get deskTabPainter => '绘制集录'; + + @override + String get deskTabKnowledge => '知识集锦'; + + @override + String get deskTabTools => '工具宝箱'; + + @override + String get deskTabMine => '应用信息'; + + @override + String get messageBoard => '留言板'; + + @override + String get mobileTabWidgets => '组件'; + + @override + String get mobileTabPainter => '绘制'; + + @override + String get mobileTabKnowledge => '知识'; + + @override + String get mobileTabTools => '工具'; + + @override + String get mobileTabMine => '我的'; + + @override + String get newBoard => '新建 '; + + @override + String get news => '最新资讯'; + + @override + String get moreNews => '查看更多'; +} diff --git a/lib/src/l10n/locale_provider.dart b/lib/src/l10n/locale_provider.dart new file mode 100644 index 00000000..7c631ee7 --- /dev/null +++ b/lib/src/l10n/locale_provider.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +mixin LocalProvider { + Iterable>? get localizationsDelegates; + + List get supportedLocales; +} diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart new file mode 100644 index 00000000..9417b7c3 --- /dev/null +++ b/lib/src/navigation/model/app_tab.dart @@ -0,0 +1,53 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; +import 'package:tolyui/tolyui.dart'; + +enum AppTab { + widgets('/widget', TolyIcon.icon_layout), + note('/note', Icons.note_alt_outlined), + knowledge('/knowledge', TolyIcon.icon_artifact), + painter('/painter', TolyIcon.dingzhi1), + tools('/tools', TolyIcon.icon_fast), + mine('/account', TolyIcon.yonghu); + + final IconData icon; + final String path; + + static List get mobileTabs => [ + widgets, + painter, + knowledge, + note, + mine + ]; + + const AppTab(this.path, this.icon); + + String label(AppL10n l10n) { + if (kAppEnv.isDesktopUI) { + return switch (this) { + AppTab.widgets => l10n.deskTabWidgets, + AppTab.painter => l10n.deskTabPainter, + AppTab.knowledge => l10n.deskTabKnowledge, + AppTab.tools => l10n.deskTabTools, + AppTab.mine => l10n.deskTabMine, + AppTab.note => l10n.messageBoard, + }; + } + return switch (this) { + AppTab.widgets => l10n.mobileTabWidgets, + AppTab.painter => l10n.mobileTabPainter, + AppTab.knowledge => l10n.mobileTabKnowledge, + AppTab.tools => l10n.mobileTabTools, + AppTab.mine => l10n.mobileTabMine, + AppTab.note => l10n.messageBoard, + }; + } + + IconMenu menu(AppL10n l10n) => IconMenu(icon, + label: label(l10n), + route: path, + ); +} diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart new file mode 100644 index 00000000..8c42ff21 --- /dev/null +++ b/lib/src/navigation/router/app_route.dart @@ -0,0 +1,40 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; +import '../view/desktop/flutter_unit_desk_navigation.dart'; + +import 'system/app.dart'; +import 'system/global.dart'; +import 'system/settings.dart'; +import 'widgets/collection_route.dart'; +import 'widgets/widgets_route.dart'; +import 'package:note/note.dart'; + +RouteBase get appRoute { + List body = [ + widgetsRoute, + noteRoute, + collectRoute, + settingsRoute, + GoRoute( + path: AppRoute.moreNews.path, + builder: (ctx, __) => NewsPage( + title: AppL10n.of(ctx).news, + ), + ), + ...systemRoutes, + ]; + return GoRoute( + path: AppRoute.home.path, + redirect: (_, __) => null, + routes: [ + ...globalRoutes, + if (kAppEnv.isDesktopUI) + ShellRoute( + builder: (_, __, Widget child) => AppDeskNavigation(content: child), + routes: body, + ), + if (!kAppEnv.isDesktopUI) ...body, + ], + ); +} diff --git a/lib/src/navigation/router/system/app.dart b/lib/src/navigation/router/system/app.dart new file mode 100644 index 00000000..79ab782e --- /dev/null +++ b/lib/src/navigation/router/system/app.dart @@ -0,0 +1,44 @@ +import 'package:app/app.dart'; +import 'package:artifact/artifact.dart'; +import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:treasure_tools/treasure_tools.dart'; + +List get systemRoutes => [ + GoRoute( + path: AppRoute.dataManage.path, + builder: (_, __) => const DataManagePage(), + ), + GoRoute( + path: AppRoute.account.path, + builder: (_, __) => const DeskAccountPage(), + ), + GoRoute( + path: AppRoute.aboutApp.path, + builder: (_, __) => const AboutAppPage(), + ), + GoRoute( + path: AppRoute.aboutMe.path, + builder: (_, __) => const AboutMePage(), + ), + GoRoute( + path: AppRoute.supportMe.path, + builder: (_, __) => const SupportMe(), + ), + if (kAppEnv.isDesktopUI) ...deskTopRoutes + ]; + +List get deskTopRoutes => [ + GoRoute( + path: AppRoute.knowledge.path, + builder: (_, __) => const DeskKnowledgePage(), + ), + GoRoute( + path: AppRoute.painter.path, + builder: (_, __) => const GalleryUnit(), + ), + GoRoute( + path: AppRoute.tools.path, + builder: (_, __) => const CodeGenPage(), + ), + ]; diff --git a/lib/src/navigation/router/system/global.dart b/lib/src/navigation/router/system/global.dart new file mode 100644 index 00000000..d7c1c0f3 --- /dev/null +++ b/lib/src/navigation/router/system/global.dart @@ -0,0 +1,17 @@ +import 'package:app/app.dart'; +import '../../../starter/fx_application.dart'; + +List get globalRoutes => [ + GoRoute( + path: AppRoute.splash.path, + builder: (_, __) => const FlutterUnitSplash(), + ), + GoRoute( + path: AppRoute.startError.path, + builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), + ), + GoRoute( + path: AppRoute.globalError.path, + builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), + ), + ]; diff --git a/lib/src/navigation/router/system/settings.dart b/lib/src/navigation/router/system/settings.dart new file mode 100644 index 00000000..820cd1dd --- /dev/null +++ b/lib/src/navigation/router/system/settings.dart @@ -0,0 +1,28 @@ +import 'package:app/app.dart'; + +GoRoute get settingsRoute => GoRoute( + path: AppRoute.settings.path, + builder: (_, __) => const SettingPage(), + routes: [ + GoRoute( + path: AppRoute.darkModel.path, + builder: (_, __) => const ThemeModelSetting(), + ), + GoRoute( + path: AppRoute.codeStyle.path, + builder: (_, __) => const CodeStyleSettingPage(), + ), + GoRoute( + path: AppRoute.themeColor.path, + builder: (_, __) => const ThemeColorSettingPage(), + ), + GoRoute( + path: AppRoute.fontSetting.path, + builder: (_, __) => const FontSettingPage(), + ), + GoRoute( + path: AppRoute.version.path, + builder: (_, __) => const VersionInfo(), + ), + ], + ); diff --git a/lib/src/navigation/router/widgets/collection_route.dart b/lib/src/navigation/router/widgets/collection_route.dart new file mode 100644 index 00000000..9b34deec --- /dev/null +++ b/lib/src/navigation/router/widgets/collection_route.dart @@ -0,0 +1,29 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:widget_module/widget_module.dart'; +import 'package:note/note.dart'; + +GoRoute get collectRoute => GoRoute( + path: AppRoute.collection.path, + builder: (_, __) => const CollectPageAdapter(), + routes: [ + GoRoute(path: AppRoute.collectionDetail.path, builder: collectionDetailBuilder), + ], +); + +GoRoute get noteRoute => GoRoute( + path: AppRoute.note.path, + builder: (_, __) => ArtSysScope(child: const ArticleAdmin()), + // routes: [ + // GoRoute(path: AppRoute.collectionDetail.path, builder: collectionDetailBuilder), + // ], +); + +Widget collectionDetailBuilder(BuildContext context, GoRouterState state) { + Object? extra = state.extra; + CategoryModel? model; + if (extra is CategoryModel) { + model = extra; + } + return CategoryShow(model: model!); +} diff --git a/lib/src/navigation/router/widgets/widgets_route.dart b/lib/src/navigation/router/widgets/widgets_route.dart new file mode 100644 index 00000000..125fec83 --- /dev/null +++ b/lib/src/navigation/router/widgets/widgets_route.dart @@ -0,0 +1,39 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../../view/mobile/news.dart'; +import '../../view/mobile/unit_navigation.dart'; + +GoRoute get widgetsRoute => GoRoute( + path: AppRoute.widget.path, + builder: (_, __) { + if (kAppEnv.isDesktopUI) { + return const DeskWidgetPanel( + header: NewsHeader(), + ); + } + return const UnitPhoneNavigation(); + }, + routes: [ + GoRoute(path: AppRoute.widgetDetail.path, builder: widgetDetailBuilder), + ], + ); + +Widget widgetDetailBuilder(BuildContext context, GoRouterState state) { + Object? extra = state.extra; + String? widgetName = state.pathParameters['name']; + + WidgetModel? model; + if (extra is WidgetModel) { + model = extra; + } + if (kAppEnv.isDesktopUI) { + return DeskWidgetDetailPageScope( + model: model, + widgetName: widgetName, + ); + } + assert(model != null); + return WidgetDetailPageScope(model: model!); +} diff --git a/lib/src/navigation/view/app_bloc_provider.dart b/lib/src/navigation/view/app_bloc_provider.dart new file mode 100644 index 00000000..9c339a59 --- /dev/null +++ b/lib/src/navigation/view/app_bloc_provider.dart @@ -0,0 +1,50 @@ +import 'package:app/app.dart'; +import 'package:note/note.dart'; +import 'package:app_update/app_update.dart'; +import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:storage/storage.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/widget_module.dart'; + +/// create by 张风捷特烈 on 2020/4/28 +/// contact me by email 1981462002@qq.com +/// 说明: Bloc提供器包裹层 + +class AppBlocProvider extends StatefulWidget { + final Widget child; + + const AppBlocProvider({Key? key, required this.child}) : super(key: key); + + @override + State createState() => _AppBlocProviderState(); +} + +class _AppBlocProviderState extends State { + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + // 全局 bloc : 维护应用存储状态、更新、认证 + BlocProvider( + create: (_) => AuthBloc(repository: HttpAuthRepository())), + BlocProvider(create: (_) => AppConfigBloc()), + BlocProvider( + create: (_) => UpgradeBloc(api: UnitUpgradeApi())), + BlocProvider(create: (_) => UserBloc()), + BlocProvider(create: (_) => NewsBloc()..initByCache()), + + BlocProvider( + create: (_) => GalleryUnitBloc()..loadGalleryInfo()), + ], + child: WidgetsBlocProvider(child: widget.child), + ); + } + + @override + void dispose() { + AppStorage().close(); + super.dispose(); + } +} diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart new file mode 100644 index 00000000..29a55ee6 --- /dev/null +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -0,0 +1,75 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; +import 'package:flutter_unit/src/navigation/model/app_tab.dart'; +import 'package:flutter_unit/src/navigation/view/desktop/unit_shortcuts_scope.dart'; +import 'package:go_router/go_router.dart'; +import 'package:tolyui_navigation/tolyui_navigation.dart'; +import 'menu_bar_leading.dart'; +import 'menu_bar_tail.dart'; +import 'toly_unit_menu_cell.dart'; +class AppDeskNavigation extends StatelessWidget { + final Widget content; + + const AppDeskNavigation({super.key, required this.content}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: UnitShortcutsScope( + child: Row( + children: [ + const DragToMoveWrapper(child: DeskNavigationRail()), + Expanded(child: content), + ], + ), + ), + ); + } +} + +class DeskNavigationRail extends StatefulWidget { + const DeskNavigationRail({super.key}); + + @override + State createState() => _DeskNavigationRailState(); +} + +class _DeskNavigationRailState extends State { + + @override + Widget build(BuildContext context) { + return TolyRailMenuBar( + cellBuilder: FlutterUnitMenuCell.create, + width: 140, + gap: 8, + padding: EdgeInsets.zero, + backgroundColor: const Color(0xff2C3036), + menus: deskNavBarMenus, + activeId: activePath, + enableWidthChange: false, + onSelected: context.go, + tail: (_) => const MenuBarTail(), + leading: (_) => const MenuBarLeading(), + ); + } + + late List deskNavBarMenus; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + AppL10n l10n = AppL10n.of(context); + deskNavBarMenus = AppTab.values.map((e)=>e.menu(l10n)).toList(); + } + + final RegExp _segReg = RegExp(r'/\w+'); + + String? get activePath { + final String path = GoRouterState.of(context).uri.toString(); + RegExpMatch? match = _segReg.firstMatch(path); + if (match == null) return null; + String? target = match.group(0); + return target; + } +} diff --git a/lib/src/navigation/view/desktop/locale_change_menu.dart b/lib/src/navigation/view/desktop/locale_change_menu.dart new file mode 100644 index 00000000..54b1cf72 --- /dev/null +++ b/lib/src/navigation/view/desktop/locale_change_menu.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:app/app.dart'; + +class LocaleChangeMenu extends StatelessWidget { + const LocaleChangeMenu({super.key}); + + @override + Widget build(BuildContext context) { + List labels = Language.values.map((e) => e.label).toList(); + + DropMenuCellStyle lightStyle = const DropMenuCellStyle( + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 0), + borderRadius: BorderRadius.all(Radius.circular(6)), + foregroundColor: Color(0xff1f1f1f), + backgroundColor: Colors.transparent, + disableColor: Color(0xffbfbfbf), + hoverBackgroundColor: Color(0xfff5f5f5), + hoverForegroundColor: Color(0xff1f1f1f), + textStyle: TextStyle(fontFamily: '微软雅黑', fontSize: 12,)); + Language language = + context.select((AppConfigBloc bloc) => bloc.state.language); + int index = Language.values.indexOf(language); + return Stack( + alignment: Alignment.centerLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 6.0), + child: Icon(Icons.translate,color: Colors.white,size: 14), + ), + IconTheme( + data: const IconThemeData(color: Colors.white), + child: DefaultTextStyle( + style: const TextStyle(color: Colors.white), + child: TolySelect( + fontSize: 12, + cellStyle: lightStyle, + data: labels, + selectIndex: index, + iconSize: 16, + height: 26, + width: 100, + minWidth: 100, + maxHeight: 180, + padding: const EdgeInsets.only(right: 6,left: 24), + onSelected: (int index) async { + Language type = Language.values[index]; + context.read().switchLanguage(type); + }, + ), + ), + ), + ], + ); + } +} diff --git a/lib/src/navigation/view/desktop/menu_bar_leading.dart b/lib/src/navigation/view/desktop/menu_bar_leading.dart new file mode 100644 index 00000000..c3d097b0 --- /dev/null +++ b/lib/src/navigation/view/desktop/menu_bar_leading.dart @@ -0,0 +1,88 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class MenuBarLeading extends StatelessWidget { + const MenuBarLeading({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 20, bottom: 8), + child: Column( + children: [ + Wrap( + direction: Axis.vertical, + spacing: 8, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + GestureDetector( + onDoubleTap: () { + sendEvent(1); + }, + child: const CircleImage( + image: AssetImage('assets/images/icon_head.webp'), + size: 60, + ), + ), + const Text( + '张风捷特烈', + style: TextStyle(color: Colors.white70), + ) + ], + ), + _buildIcons(), + const Divider(color: Colors.white, height: 1, endIndent: 20), + const SizedBox(height: 16), + ], + ), + ); + } + + final List menus = const [ + LinkIconMenu( + TolyIcon.icon_github, "https://github.com/toly1994328/FlutterUnit"), + LinkIconMenu(TolyIcon.icon_juejin, + 'https://juejin.im/user/5b42c0656fb9a04fe727eb37'), + LinkIconMenu(TolyIcon.icon_item, 'http://toly1994.com/'), + ]; + + Widget _buildIcons() { + return Padding( + padding: const EdgeInsets.only(bottom: 8, top: 8), + child: Wrap( + spacing: 8, + children: menus + .map((menu) => TolyAction( + style: const ActionStyle.dark(), + onTap: menu.launch, + child: Icon(menu.icon, color: Colors.white, size: 22), + )) + .toList(), + ), + ); + } +} + +class LinkIconMenu { + final IconData icon; + final String url; + + const LinkIconMenu(this.icon, this.url); + + void launch() => _launchUrl(url); + + void _launchUrl(String url) async { + if (!await launchUrl(Uri.parse(url))) {} + } +} diff --git a/lib/src/navigation/view/desktop/menu_bar_tail.dart b/lib/src/navigation/view/desktop/menu_bar_tail.dart new file mode 100644 index 00000000..17b33129 --- /dev/null +++ b/lib/src/navigation/view/desktop/menu_bar_tail.dart @@ -0,0 +1,82 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/src/flutter_unit.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; + +import 'locale_change_menu.dart'; +import 'theme_model_switch_icon.dart'; +import 'package:app_update/app_update.dart'; + +enum ActionType { + settings(path: '/settings'), + collection(path: '/collection'); + + final String path; + + const ActionType({required this.path}); +} + +class MenuBarTail extends StatelessWidget { + const MenuBarTail({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const Divider(indent: 20, color: Colors.white, height: 1), + const SizedBox(height: 8,), + const LocaleChangeMenu(), + Padding( + padding: const EdgeInsets.only(left: 8, right: 8,bottom: 8,top: 2), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 8, + children: [ + const SettingIcon(), + TolyAction( + style: const ActionStyle.dark(), + onTap: () => context.push(ActionType.collection.path), + child: const Icon( + TolyIcon.icon_collect, + color: Colors.white, + size: 22, + ), + ), + const ThemeModelSwitchIcon(), + ], + ), + ), + ], + ); + } +} + +class SettingIcon extends StatelessWidget { + const SettingIcon({super.key}); + + @override + Widget build(BuildContext context) { + UpdateState state = context.watch().state; + Color tipColor = Colors.redAccent; + Widget child = TolyAction( + style: const ActionStyle.dark(), + onTap: () => context.push(ActionType.settings.path), + child: const Icon(Icons.settings, color: Colors.white, size: 22), + ); + return switch (state) { + ShouldUpdateState() => Badge(backgroundColor: tipColor, child: child), + _ => child, + }; + } +} diff --git a/lib/src/navigation/view/desktop/theme_model_switch_icon.dart b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart new file mode 100644 index 00000000..3aae39e6 --- /dev/null +++ b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart @@ -0,0 +1,28 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:tolyui/tolyui.dart'; + +class ThemeModelSwitchIcon extends StatelessWidget { + + const ThemeModelSwitchIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return MouseRegion( + cursor: SystemMouseCursors.click, + child: TolyAction( + style: const ActionStyle.dark(), + onTap: (){ + context.read().changeThemeMode(isDark?ThemeMode.light:ThemeMode.dark); + }, + child: Icon( + !isDark?TolyIcon.dark:TolyIcon.wb_sunny, + color: Colors.white, + size: 22, + ), + ), + ); + } +} diff --git a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart new file mode 100644 index 00000000..8c17403e --- /dev/null +++ b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart @@ -0,0 +1,86 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:tolyui_navigation/tolyui_navigation.dart'; + +final Tween _widthTween = Tween(begin: 0.82, end: 0.95); +final Tween _sizeTween = Tween(begin: 18.0, end: 22.0); +final Tween _fontSizeTween = Tween(begin: 14.0, end: 15); + +class FlutterUnitMenuCell extends StatelessWidget { + final MenuMeta menu; + final bool enableTooltip; + final DisplayMeta display; + + const FlutterUnitMenuCell.create(this.menu, this.display, + {super.key, this.enableTooltip = false}); + + Color? get foregroundColor => + display.selected ? Colors.white : Colors.white70; + + @override + Widget build(BuildContext context) { + double height = 42; + + double anim = display.rate; + Color? color = ColorTween( + begin: Colors.white.withAlpha(33), + end: Theme.of(context).primaryColor) + .transform(anim); + + double iconSize = _sizeTween.transform(anim); + double fontSize = _fontSizeTween.transform(anim); + IconData? icon; + if (menu is IconMenu) { + icon = (menu as IconMenu).icon; + } + TextStyle style = TextStyle(color: foregroundColor, fontSize: fontSize); + Radius radius = Radius.circular(height / 2); + BorderRadius br = BorderRadius.only(topRight: radius, bottomRight: radius); + Widget child = Container( + padding: EdgeInsets.only(left: 12), + alignment: Alignment.centerLeft, + decoration: BoxDecoration(color: color, borderRadius: br), + width: _widthTween.transform(anim) * 140, + height: height, + child: Row( + spacing: 6, + // crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(icon, color: foregroundColor, size: iconSize), + Expanded( + child: Text( + menu.label, + style: style, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox( + width: 2, + ) + ], + ), + ); + + if (enableTooltip) { + child = TolyTooltip( + placement: Placement.right, + message: menu.label, + child: child, + ); + } + + return Align( + alignment: Alignment.centerLeft, + child: child, + ); + } +} diff --git a/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart b/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart new file mode 100644 index 00000000..96818bea --- /dev/null +++ b/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fx_trace/fx_trace.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/widget_module.dart'; + +class GlobalFind extends Intent { + const GlobalFind(); +} + +class UnitShortcutsScope extends StatefulWidget { + final Widget child; + + const UnitShortcutsScope({super.key, required this.child}); + + @override + State createState() => _UnitShortcutsScopeState(); +} + +class _UnitShortcutsScopeState extends State + with FxEmitterMixin { + @override + Widget build(BuildContext context) { + return Shortcuts( + shortcuts: { + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyF): const GlobalFind(), + }, + child: Actions( + actions: >{ + GlobalFind: CallbackAction(onInvoke: _onGlobalSearch), + }, + child: widget.child, + ), + ); + } + + @override + void onEvent(FxEvent event) { + if (event is SelectWidgetEvent) { + context.push('/widget/detail/${event.name}', extra: event.model); + } + } + + Object? _onGlobalSearch(GlobalFind intent) { + showDialog(context: context, builder: (_) => const GlobalFindDialog()); + return null; + } +} diff --git a/lib/src/navigation/view/mobile/carousel.dart b/lib/src/navigation/view/mobile/carousel.dart new file mode 100644 index 00000000..6802defa --- /dev/null +++ b/lib/src/navigation/view/mobile/carousel.dart @@ -0,0 +1,236 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:app/app.dart'; +import 'news.dart'; + +typedef TypeWidgetBuilder = Widget Function(BuildContext context, T data); + +class Carousel extends StatefulWidget { + final List data; + final TypeWidgetBuilder itemBuilder; + + const Carousel({ + super.key, + required this.data, + required this.itemBuilder, + }); + + @override + State createState() => _CarouselState(); +} + +class _CarouselState extends State> { + final ValueNotifier factor = ValueNotifier(0); + + late PageController _ctrl; + + final int _firstOffset = 1000; //初始偏移 + int _position = 0; //页面位置 + + @override + void initState() { + super.initState(); + _position = _position + _firstOffset; + + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; + _ctrl = PageController( + viewportFraction: kAppEnv.isDesktopUI ? 0.38 : 0.8, + initialPage: _position, + )..addListener(() { + if (_ctrl.page != null) { + double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; + factor.value = value == 0 ? 1 : value; + } + }); + } + + @override + void dispose() { + _ctrl.dispose(); + factor.dispose(); + super.dispose(); + } + + Color get color => Colors.blue; + + Color get nextColor => Colors.orangeAccent; + + bool get isDark => Theme.of(context).brightness == Brightness.dark; + + @override + Widget build(BuildContext context) { + List data = widget.data; + if (data.isEmpty) return const SizedBox(); + Widget child = PageView.builder( + controller: _ctrl, // itemCount: 7, + itemBuilder: (_, index) { + int realIndex = _fixPosition(index, _firstOffset, data.length); + return GestureDetector( + child: AnimatedBuilder( + animation: _ctrl, + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), + child: widget.itemBuilder(context, data[realIndex]), + ), + ); + }, + onPageChanged: (index) { + _position = index; + setState(() {}); + }, + ); + + int realIndex = _fixPosition(_position, _firstOffset, data.length); + + child = Stack( + alignment: Alignment.bottomCenter, + children: [ + child, + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Wrap( + spacing: 6, + children: widget.data.asMap().keys.map((int index) { + return GestureDetector( + onTap: () { + int deta = index - realIndex; + _position += deta; + print('$_position,$realIndex'); + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + child: Container( + width: 8, + height: 8, + decoration: BoxDecoration( + color: realIndex == index + ? Colors.white + : Colors.black.withValues(alpha: 0.4), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.white.withValues(alpha: 0.3), + spreadRadius: 1, + blurRadius: 10, + blurStyle: BlurStyle.outer) + ]), + ), + ); + }).toList(), + ), + ) + ], + ); + + if (!kIsDesk) { + return child; + } + + return Stack( + alignment: Alignment.center, + children: [ + child, + Positioned( + right: 0, + child: HoverIndicator( + onTap: () { + _position += 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icons.navigate_next_outlined, + )), + Positioned( + left: 0, + child: HoverIndicator( + onTap: () { + _position -= 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icons.navigate_before)), + ], + ); + } + + Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { + double value; + if (_ctrl.position.haveDimensions && _ctrl.page != null) { + value = _ctrl.page! - index; + } else { + value = (_position - index).toDouble(); + } + value = (1 - ((value.abs()) * 0.2)).clamp(0, 1).toDouble(); + value = Curves.easeOut.transform(value); + + return Transform( + transform: Matrix4.diagonal3Values(value, value, 1.0), + alignment: Alignment.center, + child: child, + ); + } + + int _fixPosition(int realPos, int initPos, int length) { + if (length == 0) return 0; + final int offset = realPos - initPos; + int result = offset % length; + return result < 0 ? length + result : result; + } +} + +class HoverIndicator extends StatefulWidget { + final IconData icon; + final VoidCallback onTap; + + const HoverIndicator({super.key, required this.icon, required this.onTap}); + + @override + State createState() => _HoverIndicatorState(); +} + +class _HoverIndicatorState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: widget.onTap, + child: Container( + width: 36, + height: 260, + child: !_hover + ? null + : Icon( + widget.icon, + color: Colors.white, + ), + color: _hover + ? Colors.blue.withValues(alpha: 0.2) + : Colors.transparent, + ), + )); + } + + bool _hover = false; + + void _onEnter(PointerEnterEvent event) { + setState(() { + _hover = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hover = false; + }); + } +} diff --git a/lib/src/navigation/view/mobile/news.dart b/lib/src/navigation/view/mobile/news.dart new file mode 100644 index 00000000..c7086cc4 --- /dev/null +++ b/lib/src/navigation/view/mobile/news.dart @@ -0,0 +1,148 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; +import 'package:tolyui/basic/basic.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../l10n/gen/app_l10n.dart'; +import 'carousel.dart'; +import 'package:app/app.dart'; + +class NewsHeader extends StatefulWidget { + const NewsHeader({super.key}); + + @override + State createState() => _NewsHeaderState(); +} + +class _NewsHeaderState extends State { + @override + Widget build(BuildContext context) { + AppL10n l10n = AppL10n.of(context); + + List data = + context.select((NewsBloc bloc) => bloc.state.headerNews); + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 64), + child: Column( + spacing: 2, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 4), + child: Row( + children: [ + Text( + l10n.news, + style: TextStyle(fontWeight: FontWeight.w600), + ), + if (kAppEnv.isDesktopUI) + TolyAction( + style: ActionStyle(padding: EdgeInsets.all(2)), + child: Icon( + Icons.refresh, + size: 16, + ), + onTap: () { + context.read().refreshFromNet(); + }), + Spacer(), + MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + context.push('/more_news'); + }, + child: Text( + l10n.moreNews, + style: TextStyle(fontSize: 12, color: Color(0xff999999)), + ), + ), + ) + ], + ), + ), + Expanded( + child: Carousel( + data: data, + itemBuilder: (BuildContext context, ArticlePo data) { + return NewsArticleDisplay(article: data); + }, + ), + ), + ], + ), + ); + } +} + +void launch(String url) => _launchUrl(url); + +void _launchUrl(String url) async { + if (!await launchUrl(Uri.parse(url))) {} +} + +class NewsArticleDisplay extends StatelessWidget { + const NewsArticleDisplay({ + super.key, + required this.article, + }); + + final ArticlePo article; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + _launchUrl(article.url); + }, + child: Container( + // margin: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: NetworkImage(article.cover ?? ''), fit: BoxFit.cover)), + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 16, + height: 16, + margin: EdgeInsets.only(right: 6), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(4)), + child: Text( + '新', + style: + TextStyle(fontSize: 8, color: Colors.white, height: 1), + ), + ), + Flexible( + child: Text( + article.title, + style: TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 4) + ], + fontSize: 14, + fontWeight: FontWeight.bold), + softWrap: false, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/navigation/view/mobile/pure_bottom_bar.dart b/lib/src/navigation/view/mobile/pure_bottom_bar.dart new file mode 100644 index 00000000..685b45cf --- /dev/null +++ b/lib/src/navigation/view/mobile/pure_bottom_bar.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +import '../../../l10n/gen/app_l10n.dart'; +import '../../model/app_tab.dart'; + +class PureBottomBar extends StatelessWidget { + final ValueChanged? onTap; + final AppTab activeTab; + + + const PureBottomBar({ + super.key, + this.onTap, + required this.activeTab, + // required this.labels, + // required this.icons, + }); + + @override + Widget build(BuildContext context) { + AppL10n l10n = AppL10n.of(context); + return BottomNavigationBar( + onTap: onTap, + currentIndex: activeTab.index, + elevation: 3, + // fixedColor: themeColor.activeColor, + type: BottomNavigationBarType.fixed, + iconSize: 22, + selectedItemColor: Theme.of(context).primaryColor, + selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), + showUnselectedLabels: true, + showSelectedLabels: true, + // backgroundColor: themeColor.itemColor, + items: AppTab.mobileTabs + .map((AppTab tab) => BottomNavigationBarItem( + label: tab.label(l10n), + icon: Icon(tab.icon), + )) + .toList() + + // labels + // .asMap() + // .keys + // .map((index) => + // + // .toList(), + ); + } +} diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart new file mode 100644 index 00000000..702bca96 --- /dev/null +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -0,0 +1,102 @@ +import 'dart:io'; + +import 'package:algorithm/algorithm.dart'; +import 'package:app/app.dart'; +import 'package:app_update/app_update.dart'; +import 'package:artifact/artifact.dart'; +import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/src/navigation/model/app_tab.dart'; +import 'package:treasure_tools/treasure_tools.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/widget_module.dart'; +import 'package:note/note.dart'; +import 'news.dart'; +import 'pure_bottom_bar.dart'; + +/// create by 张风捷特烈 on 2020-04-11 +/// contact me by email 1981462002@qq.com +/// 说明: 主题结构 左右滑页 + 底部导航栏 + +class UnitPhoneNavigation extends StatefulWidget { + const UnitPhoneNavigation({super.key}); + + @override + State createState() => _UnitPhoneNavigationState(); +} + +class _UnitPhoneNavigationState extends State { + //页面控制器,初始 0 + final PageController _controller = PageController(); + final ValueNotifier _activeTab = ValueNotifier(AppTab.widgets); + + // 禁止 PageView 滑动 + final ScrollPhysics _neverScroll = const NeverScrollableScrollPhysics(); + + @override + void initState() { + super.initState(); + if (Platform.isAndroid || Platform.isIOS) {} + String locale = + context.read().state.language.locale.toString(); + context.read().add(CheckUpdate(appId: 1, locale: locale)); + } + + @override + void dispose() { + _controller.dispose(); //释放控制器 + _activeTab.dispose(); + super.dispose(); + } + + /// extendBody = true 凹嵌透明,需要处理底部 边距 + @override + Widget build(BuildContext context) { + return Scaffold( + extendBody: true, + endDrawer: const HomeRightDrawer(), + body: PageView( + physics: _neverScroll, + controller: _controller, + children: [ + StandardHomePage(heard: NewsHeader()), + GalleryUnit(), + AlgoScope(child: ArtifactPage()), + ArtSysScope(child: MobileArticlePage()), + // MobileToolPage(), + UserPage(), + ], + ), + bottomNavigationBar: _buildBottomNav(context), + ); + } + + bool get isDark => Theme.of(context).brightness == Brightness.dark; + + // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, + // 使用 BlocBuilder 构建 + Widget _buildBottomNav(BuildContext context) { + return Stack( + children: [ + ValueListenableBuilder( + valueListenable: _activeTab, + builder: (_, value, __) => PureBottomBar( + onTap: _onTapBottomNav, + activeTab: value, + )), + const Positioned(right: 22, top: 8, child: UpdateRedPoint()) + ], + ); + } + + // 点击底部按钮事件,切换页面 + void _onTapBottomNav(int index) { + _controller.jumpToPage(index); + _activeTab.value = AppTab.values[index]; + if (index == 3) { + BlocProvider.of(context).add(const EventLoadLikeData()); + } + } +} diff --git a/lib/src/starter/bridge/unit_bridge.dart b/lib/src/starter/bridge/unit_bridge.dart new file mode 100644 index 00000000..11c7f4bc --- /dev/null +++ b/lib/src/starter/bridge/unit_bridge.dart @@ -0,0 +1,9 @@ +import 'package:fx_dio/fx_dio.dart'; +import 'package:fx_dio/src/client/host.dart'; +import 'package:note/note.dart'; +import 'package:app/app.dart'; + +class UnitNoteBridge with NoteModuleBridge { + @override + Host get host => FxDio()(); +} diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart new file mode 100644 index 00000000..f66b52b3 --- /dev/null +++ b/lib/src/starter/fx_application.dart @@ -0,0 +1,55 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/widget_module.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import '../flutter_unit.dart'; +import '../navigation/view/app_bloc_provider.dart'; +import 'start_repository.dart'; +import 'package:app_update/app_update.dart'; +import 'package:note/note.dart'; + +export 'view/splash/Flutter_unit_splash.dart'; +export 'view/error/app_start_error.dart'; + +class FxApplication with FxStarter { + const FxApplication(); + + @override + Widget get app => const AppBlocProvider(child: FlutterUnit3()); + + @override + AppStartRepository get repository => const FlutterUnitStartRepo(); + + @override + void onLoaded(BuildContext context, int cost, AppConfig state) { + debugPrint("App启动耗时:$cost ms"); + context.read().init(state); + context.initWidgetData(); + if (!kAppEnv.isWeb) { + context.read().add(const EventLoadLikeData()); + context.read().add(const EventLoadCategory()); + context.read().load(); + } + } + + @override + void onStartSuccess(BuildContext context, AppConfig state) { + CheckUpdate event = CheckUpdate(appId: 1, locale: state.localeValue); + context.read().add(event); + context.go(AppRoute.widget.url); + sendEvent(1); + } + + @override + void onStartError(BuildContext context, Object error, StackTrace trace) { + context.go(AppRoute.startError.url, extra: error); + } + + @override + void onGlobalError(Object error, StackTrace stack) { + print(error); + } +} diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart new file mode 100644 index 00000000..86aea38b --- /dev/null +++ b/lib/src/starter/start_repository.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:note/note.dart'; +import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:flutter/services.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:storage/storage.dart'; +import 'package:path/path.dart' as path; +import 'package:utils/utils.dart'; + +import 'bridge/unit_bridge.dart'; + +class FlutterUnitStartRepo implements AppStartRepository { + const FlutterUnitStartRepo(); + + /// 初始化 app 的异步任务 + /// 返回本地持久化的 AppConfig 对象 + @override + Future initApp() async { + WidgetsFlutterBinding.ensureInitialized(); + // 滚动性能优化 1.22.0 + GestureBinding.instance.resamplingEnabled = true; + WindowSizeAdapter.setSize(); + await SpStorage().initSp(); + await initAppMeta(); + + registerHttpClient(); + NoteEnv().attachBridge(UnitNoteBridge()); + if (!kAppEnv.isWeb) await initDb(); + HttpUtil.instance.rebase(PathUnit.baseUrl); + AppConfigPo po = await SpStorage().appConfig.read(); + AppConfig state = AppConfig.fromPo(po); + return state; + } + + Future initDb() async { + //数据库不存在,执行拷贝 + String dbPath = await AppStorage().flutter.dbpath; + bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage().spf); + if (shouldCopy) { + await _doCopyAssetsDb(dbPath); + } else { + print("=====flutter.db 已存在===="); + } + await AppStorage().init(); + } + + Future _doCopyAssetsDb(String dbPath) async { + Directory dir = Directory(path.dirname(dbPath)); + if (!dir.existsSync()) { + await dir.create(recursive: true); + } + ByteData data = await rootBundle.load("assets/flutter.db"); + List bytes = + data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + await File(dbPath).writeAsBytes(bytes, flush: true); + + print("=====flutter.db==== assets ======拷贝完成===="); + } + + Future _checkShouldCopy(String dbPath, SharedPreferences prefs) async { + bool shouldCopy = false; + String versionStr = await rootBundle.loadString('assets/version.json'); + int dbVersion = await json.decode(versionStr)['dbVersion']; + int versionInSP = prefs.getInt(SpKey.dbVersionKey) ?? -1; + + // 版本升级,执行拷贝 + if (dbVersion > versionInSP) { + shouldCopy = true; + await prefs.setInt(SpKey.dbVersionKey, dbVersion); + } + + //非 release模式,执行拷贝 + if (kDebugMode) { + shouldCopy = true; + } + + //数据库不存在,执行拷贝 + if (!File(dbPath).existsSync()) { + shouldCopy = true; + } + + return shouldCopy; + } +} diff --git a/lib/src/starter/view/error/app_start_error.dart b/lib/src/starter/view/error/app_start_error.dart new file mode 100644 index 00000000..ab3784fd --- /dev/null +++ b/lib/src/starter/view/error/app_start_error.dart @@ -0,0 +1,49 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; + +class AppStartErrorPage extends StatelessWidget { + final Object? error; + const AppStartErrorPage({super.key, required this.error}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: PreferredDragToMoveWrapper( + child: AppBar( + title: const Text( + "App 启动异常", + style: TextStyle(fontFamily: '宋体'), + ), + actions: const [WindowButtons()], + ), + ), + body: Center( + child: Column( + children: [ + Expanded( + child: Center( + child: Wrap( + direction: Axis.vertical, + children: [ + const Text('应用启动异常:'), + Text( + error.toString(), + style: const TextStyle(color: Colors.redAccent), + ), + ], + ))), + TolyLink( + href: 'https://github.com/toly1994328/', + text: 'Github 开源地址: FlutterUnit', + onTap: (l) {}), + const Text("联系邮箱: 1981462002@qq.com"), + const SizedBox( + height: 12, + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/starter/view/splash/Flutter_unit_splash.dart b/lib/src/starter/view/splash/Flutter_unit_splash.dart new file mode 100644 index 00000000..e9d55f1e --- /dev/null +++ b/lib/src/starter/view/splash/Flutter_unit_splash.dart @@ -0,0 +1,151 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; + +import 'dart:ui' as ui; + +import 'flutter_unit_text.dart'; + +/// create by 张风捷特烈 on 2020-03-07 +/// contact me by email 1981462002@qq.com +/// 说明: app 闪屏页 +class FlutterUnitSplash extends StatelessWidget { + const FlutterUnitSplash({super.key}); + + @override + Widget build(BuildContext context) { + return const AppStartListener( + child: AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.dark, + ), + child: Material(color: Colors.white, child: _SplashBody()), + ), + ); + } +} + +class _SplashBody extends StatelessWidget { + const _SplashBody({super.key}); + + @override + Widget build(BuildContext context) { + final Color color = Theme.of(context).primaryColor; + const TextStyle shadowStyle = UnitTextStyle.splashShadows; + const TextStyle titleStyle = TextStyle(fontWeight: FontWeight.bold); + + return Column( + children: [ + const SplashTopBar( + leading: Text('Flutter Unit', style: titleStyle), + logo: CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp'), + radius: 14, + ), + ), + const Spacer(), + Expanded( + child: Wrap( + direction: Axis.vertical, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Stack(children: [ColorfulText(), FlutterLogo(size: 60)]), + const SizedBox(height: 20), + FlutterUnitText( + text: StrUnit.appName, + color: color, + ), + ], + )), + const Expanded( + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Positioned( + bottom: 15, + child: Wrap( + direction: Axis.vertical, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text("Power By 张风捷特烈", style: shadowStyle), + Text("· 2021 · @编程之王 ", style: shadowStyle), + ], + )), + ], + )) + ], + ); + } +} + +class ColorfulText extends StatelessWidget { + const ColorfulText({super.key}); + + @override + Widget build(BuildContext context) { + final Paint paint = Paint() + ..style = PaintingStyle.stroke + ..shader = ui.Gradient.linear( + const Offset(0, 0), + const Offset(22, 0), + [Colors.red, Colors.yellow, Colors.blue, Colors.green], + [1 / 4, 2 / 4, 3 / 4, 1], + TileMode.mirror, + Matrix4.rotationZ(pi / 4).storage, + ); + return Text( + "U", + style: TextStyle(fontSize: 26, height: 1, fontWeight: FontWeight.bold, foreground: paint), + ); + } +} + +class SplashTopBar extends StatelessWidget { + final Widget? leading; + final Widget? logo; + + const SplashTopBar({super.key, this.leading, this.logo}); + + @override + Widget build(BuildContext context) { + if (!kIsDesk) return const SizedBox.shrink(); + return DragToMoveWrapper( + child: Stack( + children: [ + Container( + alignment: Alignment.topLeft, + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8), + child: Row( + children: [ + if (leading != null) + Row( + children: [ + if (logo != null) logo!, + const SizedBox( + width: 8, + ), + leading!, + ], + ), + const Spacer(), + const SizedBox( + width: 20, + ), + ], + ), + ), + const Positioned( + right: 0, + child: WindowButtons(), + ) + ], + ), + ); + } +} diff --git a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_text.dart b/lib/src/starter/view/splash/flutter_unit_text.dart similarity index 85% rename from packages/old_fancy_mobile_ui/lib/splash/flutter_unit_text.dart rename to lib/src/starter/view/splash/flutter_unit_text.dart index 09b6e370..427cf92e 100644 --- a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_text.dart +++ b/lib/src/starter/view/splash/flutter_unit_text.dart @@ -6,15 +6,17 @@ import 'package:flutter/material.dart'; class FlutterUnitText extends StatefulWidget { final String text; final Color color; + final double fontSize; const FlutterUnitText({ this.text = "Toly", this.color = Colors.blue, + this.fontSize = 32, Key? key, }) : super(key: key); @override - _FlutterUnitTextState createState() => _FlutterUnitTextState(); + State createState() => _FlutterUnitTextState(); } class _FlutterUnitTextState extends State @@ -31,7 +33,7 @@ class _FlutterUnitTextState extends State void initState() { super.initState(); TextSpan text = TextSpan( - text: widget.text, style: const TextStyle(fontSize: 32, color: Colors.blue)); + text: widget.text, style: TextStyle(fontSize: widget.fontSize, color: Colors.blue)); _textPainter.text = text; _textPainter.layout(); // 进行布局 @@ -60,6 +62,7 @@ class _FlutterUnitTextState extends State return CustomPaint( size: _textPainter.size, painter: SpringPainter( + fontSize: widget.fontSize, textPainter: _textPainter, color: widget.color, skew: animation, @@ -80,11 +83,12 @@ class Interpolator extends Curve { class SpringPainter extends CustomPainter { final ValueListenable skew; final TextPainter textPainter; + final double fontSize; String _text = ''; Color color; SpringPainter( - {required this.skew, required this.textPainter, this.color = Colors.blue}) + {required this.skew, required this.textPainter, this.color = Colors.blue,required this.fontSize}) : super(repaint: skew) { _text = textPainter.text?.toPlainText() ?? ''; } @@ -93,7 +97,7 @@ class SpringPainter extends CustomPainter { void paint(Canvas canvas, Size size) { canvas.translate(size.width / 2, size.height / 2); TextSpan text = - TextSpan(text: _text, style: TextStyle(fontSize: 32, color: color)); + TextSpan(text: _text, style: TextStyle(fontSize: fontSize, color: color)); textPainter.text = text; textPainter.layout(); // 进行布局 Size textSize = textPainter.size; // 尺寸必须在布局后获取 @@ -103,7 +107,7 @@ class SpringPainter extends CustomPainter { textPainter.paint(canvas, Offset.zero); TextSpan textShadow = TextSpan( text: _text, - style: TextStyle(fontSize: 32, color: color.withAlpha(88))); + style: TextStyle(fontSize: fontSize, color: color.withAlpha(88))); textPainter.text = textShadow; textPainter.layout(); // 进行布局 Matrix4 matrix4 = Matrix4.skewX((6 / 180 * pi) * skew.value); diff --git a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart b/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart deleted file mode 100644 index b40b69b7..00000000 --- a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class LinkWidgetButtons extends StatelessWidget { - final List links; - final ValueChanged onSelect; - - const LinkWidgetButtons( - {Key? key, required this.links, required this.onSelect}) - : super(key: key); - - @override - Widget build(BuildContext context) { - Color chipColor = Theme.of(context).primaryColor; - - if (links.isEmpty) { - return Padding( - padding: const EdgeInsets.only(left: 10), - child: Chip( - backgroundColor: Colors.grey.withAlpha(120), - labelStyle: const TextStyle(fontSize: 12, color: Colors.white), - label: const Text('暂无链接组件'), - )); - } - - return Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), - child: Wrap( - spacing: 5, - runSpacing: 5, - children: links - .map((WidgetModel model) => ActionChip( - labelPadding: EdgeInsets.zero, - side: BorderSide.none, - onPressed: () => onSelect(model), - elevation: 1, - // shadowColor: chipColor, - backgroundColor: chipColor, - labelStyle: model.deprecated - ? UnitTextStyle.deprecatedChip - : UnitTextStyle.commonChip, - label: Text(model.name), - )) - .toList(), - ), - ); - } -} diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart deleted file mode 100644 index dcf7299c..00000000 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'dart:math'; - -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/window_buttons.dart'; -import 'package:utils/utils.dart'; - -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class DeskSliverWidgetDetailBar extends StatelessWidget { - final WidgetModel model; - - const DeskSliverWidgetDetailBar({Key? key, required this.model}) - : super(key: key); - - final Color backgroundColor = const Color(0xffFAFAFA); - static const Color textColor = Color(0xff262626); - - @override - Widget build(BuildContext context) { - return SliverAppBar( - pinned: true, - backgroundColor: backgroundColor, - titleTextStyle: const TextStyle(color: textColor), - iconTheme: const IconThemeData(color: textColor), - expandedHeight: 120.0, - scrolledUnderElevation: 0.5, - flexibleSpace: DragToMoveAreaNoDouble( - child: DiyFlexibleSpaceBar( - expandedTitleScale: 2, - titleIconBuilder: (t) => WindmillWidget( - rotate: t * 2 * pi * 2, - radius: 15, - ), - fixedSubtitle: Text( - model.name, - style: const TextStyle(color: Color(0xff696969), fontSize: 12), - ), - title: Padding( - padding: const EdgeInsets.only(bottom: 3), - child: Text( - model.nameCN, - style: const TextStyle(color: textColor, fontSize: 16), - ), - ), - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 20, bottom: 10), - //标题边距 - collapseMode: CollapseMode.parallax, - ), - ), - elevation: 0, - actions: [ - _buildToHome(context), - FeedbackWidget( - onPressed: () => _toggleLikeState(context), - child: BlocConsumer( - listener: _listenLikeStateChange, - builder: _buildByLikeState, - ), - ), - Padding( - padding: const EdgeInsets.only(right: 20), - child: const Center(child: WindowButtons()), - ) - ], - ); - } - - void _toggleLikeState(BuildContext context) { - BlocProvider.of(context).add( - ToggleLikeWidgetEvent(id: model.id), - ); - } - - // 监听 LikeWidgetBloc 伺机弹出 toast - void _listenLikeStateChange(BuildContext context, LikeWidgetState state) { - bool collected = state.widgets.contains(model); - String msg = - collected ? "收藏【${model.name}】组件成功!" : "已取消【${model.name}】组件收藏!"; - Toast.toast( - context, - msg, - duration: Duration(milliseconds: collected ? 1500 : 600), - action: collected - ? SnackBarAction( - textColor: Colors.white, - label: '收藏夹管理', - onPressed: () => Scaffold.of(context).openEndDrawer()) - : null, - ); - } - - // 根据 [LikeWidgetState ] 构建图标 - Widget _buildByLikeState(BuildContext context, LikeWidgetState state) { - bool liked = state.widgets.contains(model); - return Padding( - padding: const EdgeInsets.only(right: 20.0), - child: Icon( - liked ? TolyIcon.icon_star_ok : TolyIcon.icon_star_add, - size: 25, - ), - ); - } - - Widget _buildToHome(BuildContext context) => GestureDetector( - onLongPress: () => Scaffold.of(context).openEndDrawer(), - child: const Padding( - padding: EdgeInsets.all(15.0), - child: Icon(Icons.home), - ), - onTap: () => Navigator.of(context).pop()); -} diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart deleted file mode 100644 index a69c618e..00000000 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart +++ /dev/null @@ -1,160 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/category_end_drawer.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'package:widgets/widgets.dart'; - -import 'link_widget_buttons.dart'; -import 'widget_detail_bar.dart'; -import 'widget_detail_panel.dart'; -import 'widget_node_panel.dart'; - -// 用于组件详情不需要在一开始就加载 -// WidgetDetailBloc 可以在稍后提供 -class DeskWidgetDetailPageScope extends StatelessWidget { - final WidgetModel model; - - const DeskWidgetDetailPageScope({super.key, required this.model}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => WidgetDetailBloc( - widgetRepository: const WidgetDbRepository(), - nodeRepository: const NodeDbRepository()) - ..add(FetchWidgetDetail(model)), - child: DeskWidgetDetailPage( - model: model, - ), - ); - } -} - -class DeskWidgetDetailPage extends StatefulWidget { - final WidgetModel model; - - const DeskWidgetDetailPage({Key? key, required this.model}) : super(key: key); - - @override - _DeskWidgetDetailPageState createState() => _DeskWidgetDetailPageState(); -} - -class _DeskWidgetDetailPageState extends State { - final List _modelStack = []; - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - @override - void initState() { - _modelStack.add(widget.model); - super.initState(); - } - - // 获取当前的 组件数据模型 - WidgetModel get currentWidgetModel => _modelStack.last; - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => Scaffold( - endDrawer: CategoryEndDrawer(widget: currentWidgetModel), - body: Builder(builder: (ctx) { - return _buildContent(ctx, state); - }), - ), - ); - } - - Widget get linkText => Row( - children: const [ - Padding( - padding: EdgeInsets.only(left: 15, right: 5), - child: Icon(Icons.link, color: Colors.blue), - ), - Text('相关组件', style: UnitTextStyle.labelBold), - ], - ); - - Widget _buildContent(BuildContext context, DetailState state) { - return WillPopScope( - onWillPop: () => _whenPop(context), - child: CustomScrollView( - slivers: [ - DeskSliverWidgetDetailBar(model: _modelStack.last), - SliverToBoxAdapter( - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: DeskWidgetDetailPanel(model: _modelStack.last), - ), - const SizedBox(width: 20,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - linkText, - if (state is DetailWithData) - LinkWidgetButtons( - links: state.links, - onSelect: _toLinkWidget, - ) - ], - )) - ], - ), - const Divider() - ], - ), - ), - if (state is DetailWithData) - _buildSliverNodeList(state.nodes, state.widgetModel.name) - ], - )); - } - - Future _whenPop(BuildContext context) async { - if (Scaffold.of(context).isEndDrawerOpen || _modelStack.isEmpty) { - return true; - } - _modelStack.removeLast(); - if (_modelStack.isNotEmpty) { - BlocProvider.of(context).add( - FetchWidgetDetail(currentWidgetModel), - ); - return false; - } else { - return true; - } - } - - void _toLinkWidget(WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); - _modelStack.add(model); - } - - Widget _buildSliverNodeList(List nodes, String name) { - AppState globalState = BlocProvider.of(context).state; - HighlighterStyle codeStyle = - Cons.codeThemeSupport.keys.toList()[globalState.codeStyleIndex]; - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, i) => DeskWidgetNodePanel( - codeStyle: codeStyle, - codeFamily: 'Inconsolata', - text: nodes[i].name, - subText: nodes[i].subtitle, - code: nodes[i].code, - death: _modelStack.last.death, - show: WidgetsMap.map(name)[i], - ), - childCount: nodes.length, - )); - } -} diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart deleted file mode 100644 index 6b8e195d..00000000 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class DeskWidgetDetailPanel extends StatelessWidget { - final WidgetModel model; - - const DeskWidgetDetailPanel({Key? key, required this.model}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - _buildLeft(model, context), - _buildRight(model), - ], - ), - // const Divider(), - ], - ); - } - - Widget _buildLeft(WidgetModel model, BuildContext context) => Expanded( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, - child: Text(model.info)), - ), - ); - - Widget _buildRight(WidgetModel model) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - height: 100, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Hero( - tag: "hero_widget_image_${model.id}", - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(8)), - child: model.image == null - ? Image.asset('assets/images/caver.webp') - : Image(image: model.image!))), - ), - ), - StarScore( - score: model.lever, - star: const Star(size: 15, fillColor: Colors.blue), - ) - ], - ); -} diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart b/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart deleted file mode 100644 index 6416e160..00000000 --- a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart +++ /dev/null @@ -1,166 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - - -import 'package:toggle_rotate/toggle_rotate.dart'; -import 'package:utils/utils.dart'; - - -/// create by 张风捷特烈 on 2020-04-13 -/// contact me by email 1981462002@qq.com -/// 说明: 一个Widget的知识点对应的界面 - -class DeskWidgetNodePanel extends StatefulWidget { - final String text; - final String subText; - final String code; - final Widget? show; - final HighlighterStyle? codeStyle; - final String? codeFamily; - final bool death; - - const DeskWidgetNodePanel( - {Key? key, this.text='', - this.subText='', - this.code='', - this.death=false, - this.show, - required this.codeStyle, - this.codeFamily}) : super(key: key); - - @override - _DeskWidgetNodePanelState createState() => _DeskWidgetNodePanelState(); -} - -class _DeskWidgetNodePanelState extends State { - CrossFadeState _crossFadeState = CrossFadeState.showFirst; - - bool get isFirst => _crossFadeState == CrossFadeState.showFirst; - - Color get themeColor => Theme.of(context).primaryColor; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - buildNodeTitle(), - const SizedBox( - height: 20, - ), - _buildCode(context), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Center( - child: Padding( - padding: const EdgeInsets.only(top: 10, bottom: 20), - child: widget.show, - ), - ), - ), - if(!widget.death) - Expanded(child: _buildNodeInfo()), - ], - ), - - - const Divider(), - ], - ), - ); - } - - Widget buildNodeTitle() => Row( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Circle( - color: themeColor, - radius: 5, - ), - ), - Expanded( - child: Text( - widget.text, - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), - ), - ), - _buildShareButton(), - _buildCodeButton() - ], - ); - - Widget _buildNodeInfo() => SizedBox( - width: double.infinity, - child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, - child: Text( - widget.subText, - style: const TextStyle(fontSize: 12), - )), - ); - - Widget _buildCodeButton() => Padding( - padding: const EdgeInsets.only(right: 10.0), - child: ToggleRotate( - durationMs: 300, - child: Icon( - TolyIcon.icon_code, - color: themeColor, - ), - onTap: _toggleCodePanel, - ), - ); - - Widget _buildShareButton() => FeedbackWidget( - mode: FeedMode.fade, - a: 0.4, - onPressed: _doShare, - child: Padding( - padding: const EdgeInsets.only(right: 10), - child: Icon( - Icons.copy, - size: 20, - color: themeColor, - ), - ), - ); - - Widget _buildCode(BuildContext context) => AnimatedCrossFade( - firstCurve: Curves.easeInCirc, - secondCurve: Curves.easeInToLinear, - firstChild: const SizedBox(), - secondChild: SizedBox( - width: MediaQuery.of(context).size.width, - child: CodeWidget( - fontFamily: widget.codeFamily, - code: isFirst?'':widget.code, - style: widget.codeStyle ?? - HighlighterStyle.fromColors(HighlighterStyle.lightColor), - ), - ), - duration: const Duration(milliseconds: 200), - crossFadeState: _crossFadeState, - ); - - //执行分享 - _doShare() async{ - // Share.share(widget.code); - await Clipboard.setData(ClipboardData(text: widget.code)); - Toast.success(context, '代码复制成功!'); - } - - // 折叠代码面板 - _toggleCodePanel() { - setState(() { - _crossFadeState = - !isFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond; - }); - } -} diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart deleted file mode 100644 index c45a39fc..00000000 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart +++ /dev/null @@ -1,166 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'package:wrapper/wrapper.dart'; - -class DeskWidgetItem extends StatelessWidget { - final WidgetModel model; - final VoidCallback onTap; - final String? searchArg; - - const DeskWidgetItem( - {Key? key, required this.model, required this.onTap, this.searchArg}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return InkWell( - borderRadius: BorderRadius.circular(6), - onTap: onTap, - child: Ink( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(6), - boxShadow: [ - BoxShadow( - color: Theme.of(context).primaryColor.withOpacity(0.1), - blurRadius: 2, - ) - ] - ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - // margin: - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildTitle(Theme.of(context).primaryColor), - _buildContent(), - _buildFoot() - ], - ), - ), - ); - } - - Widget _buildTitle(Color color) { - return Row( - children: [ - if (searchArg == null) - Text( - model.name, - style: const TextStyle( - fontSize: 15, - color: Color(0xff2F3032), - fontWeight: FontWeight.bold, - ), - ), - if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), - const SizedBox(width: 8), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - if (!show) return const SizedBox(); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: Wrapper.just( - radius: 10, - color: const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - '已收藏', - style: TextStyle( - color: color, - height: 1, - fontSize: 10, - shadows: const [ - Shadow( - color: Colors.white, - blurRadius: 2, - offset: Offset(1, 1)) - ]), - ), - ), - ); - }), - const Spacer(), - StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: color), - score: model.lever, - ), - ], - ); - } - - Widget _buildContent() { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Text( - model.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 14, color: Color(0xff2F3032)), - ), - ); - } - - Widget _buildFoot() { - return Row( - children: [ - Container( - width: 4, - height: 4, - margin: const EdgeInsets.only(right: 6), - decoration: const BoxDecoration( - color: Color(0xff86909c), shape: BoxShape.circle), - ), - Text( - model.nameCN, - style: const TextStyle( - fontSize: 12, height: 1, color: Color(0xff86909c)), - ), - const Spacer(), - Wrapper.just( - radius: 2, - color: const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - Cons.kWidgetFamilyLabelMap[model.family]!, - style: const TextStyle( - color: Color(0xff878D96), - height: 1, - fontSize: 12, - shadows: [ - Shadow( - color: Colors.white, blurRadius: 2, offset: Offset(1, 1)) - ]), - ), - ), - ], - ); - } - - final TextStyle lightTextStyle = const TextStyle( - color: Colors.red, - fontSize: 16, - fontWeight: FontWeight.bold, - ); - - InlineSpan formSpan(String src, String pattern) { - List span = []; - RegExp regExp = RegExp(pattern, caseSensitive: false); - src.splitMapJoin(regExp, onMatch: (Match match) { - span.add(TextSpan(text: match.group(0), style: lightTextStyle)); - return ''; - }, onNonMatch: (str) { - span.add(TextSpan( - text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); - return ''; - }); - return TextSpan(children: span); - } -} diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart deleted file mode 100644 index c9f26468..00000000 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - - -import 'desk_search_bar.dart'; -import 'window_buttons.dart'; - -class DeskWidgetTopBar extends StatefulWidget { - final ValueChanged onTabPressed; - - const DeskWidgetTopBar({Key? key,required this.onTabPressed}) : super(key: key); - - @override - State createState() => _DeskWidgetTopBarState(); -} - -class _DeskWidgetTopBarState extends State with SingleTickerProviderStateMixin { - late TabController tabController; - - static const List _tabs = ['无态', '有态', '单渲', '多渲', '滑片', '代理', '其它']; - - @override - void initState() { - super.initState(); - tabController = TabController(length: _tabs.length, vsync: this); - } - - @override - Widget build(BuildContext context) { - Color themeColor = Theme.of(context).primaryColor; - - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), - height: 64, - color: Colors.white, - child: Row( - children: [ - SizedBox( - width: 350, - child: TabBar( - onTap: widget.onTabPressed, - indicatorSize: TabBarIndicatorSize.label, - labelPadding: const EdgeInsets.symmetric(horizontal: 6), - isScrollable: false, - indicator: RoundRectTabIndicator( - borderSide: BorderSide(color: themeColor, width: 3), - ), - labelStyle: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - controller: tabController, - labelColor: themeColor, - indicatorWeight: 3, - unselectedLabelColor: Colors.grey, - indicatorColor: themeColor, - tabs: - _tabs.map((String name) => Tab(text: name)).toList(), - ), - ), - Spacer(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: SizedBox( - width: 250, height: 30, child: DeskSearchBar( - )), - ), - // const SizedBox(width: 20,), - WindowButtons(), - ], - ), - ), - ); - } -} diff --git a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart b/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart deleted file mode 100644 index d23a4988..00000000 --- a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'desk_widget_model_item.dart'; -import 'desk_widget_top_bar.dart'; - -class DeskWidgetPanel extends StatefulWidget { - const DeskWidgetPanel({Key? key}) : super(key: key); - - @override - State createState() => _DeskWidgetPanelState(); -} - -class _DeskWidgetPanelState extends State{ - - @override - Widget build(BuildContext context) { - WidgetsState state = context.watch().state; - - return Scaffold( - body: Column( - children: [ - DeskWidgetTopBar( - onTabPressed: _switchTab, - ), - const Divider(height: 1), - Expanded( - child: _buildByState(state), - ), - ], - ), - ); - } - - Widget _buildByState(WidgetsState state) { - if (state is WidgetsLoaded) { - return WidgetList(state: state); - } - return Center( - child: Text("${state.runtimeType}"), - ); - } - - void _switchTab(int index) { - WidgetFamily widgetFamily = Convert.toFamily(index); - BlocProvider.of(context).add(EventTabTap(widgetFamily)); - } -} - -class WidgetList extends StatelessWidget { - final WidgetsLoaded state; - - const WidgetList({Key? key, required this.state}) : super(key: key); - - @override - Widget build(BuildContext context) { - SliverGridDelegate gridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 400, - mainAxisSpacing: 10, - mainAxisExtent: 130, - crossAxisSpacing: 10, - ); - - return GridView.builder( - padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10), - gridDelegate: gridDelegate, - itemBuilder: _buildItem, - itemCount: state.widgets.length, - ); - } - - Widget _buildItem(BuildContext context, int index) { - WidgetModel model = state.widgets[index]; - return DeskWidgetItem( - model: model, - onTap: () { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - }, - ); - } -} diff --git a/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart b/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart deleted file mode 100644 index ed272bb5..00000000 --- a/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:window_manager/window_manager.dart'; - -class WindowButtons extends StatefulWidget { - const WindowButtons({Key? key}) : super(key: key); - - @override - State createState() => _WindowButtonsState(); -} - -class _WindowButtonsState extends State { - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 5, - children: [ - SizedBox( - width: 30, - height: 30, - child: WindowCaptionButton.minimize( - brightness: Brightness.light, - onPressed: () async { - bool isMinimized = await windowManager.isMinimized(); - if (isMinimized) { - windowManager.restore(); - } else { - windowManager.minimize(); - } - }, - ), - ), - SizedBox( - width: 30, - height: 30, - child: FutureBuilder( - future: windowManager.isMaximized(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.data == true) { - return WindowCaptionButton.unmaximize( - brightness: Brightness.light, - onPressed: () async{ - await windowManager.unmaximize(); - setState(() { - - }); - }, - ); - } - return WindowCaptionButton.maximize( - brightness: Brightness.light, - onPressed: () async{ - await windowManager.maximize(); - setState(() { - - }); - }, - ); - }, - ), - ), - SizedBox( - height: 30, - width: 30, - child: WindowCaptionButton.close( - brightness: Brightness.light, - onPressed: () { - windowManager.close(); - }, - ), - ), - ], - ); - } -} diff --git a/lib/widget_ui/mobile/category_page/category_detail.dart b/lib/widget_ui/mobile/category_page/category_detail.dart deleted file mode 100644 index 4303eb77..00000000 --- a/lib/widget_ui/mobile/category_page/category_detail.dart +++ /dev/null @@ -1,151 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'package:widget_module/blocs/blocs.dart'; - - -/// create by 张风捷特烈 on 2020-04-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -class CategoryShow extends StatelessWidget { - final CategoryModel model; - - const CategoryShow({Key? key, required this.model}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text(model.name)), - body: BlocBuilder( - builder: (_, state) { - if (state is CategoryWidgetLoadedState) { - return _buildWidgetList(state.widgets); - } - return const SizedBox(); - }), - ); - } - - Widget _buildWidgetList(List widgets) { - return ListView.separated( - separatorBuilder: (_, index) => const Divider(height: 1), - itemBuilder: (context, index) => Dismissible( - direction: DismissDirection.endToStart, - key: ValueKey(widgets[index].id), - background: Container( - padding: const EdgeInsets.only(right: 20), - alignment: Alignment.centerRight, - color: Colors.red, - child: const Icon( - CupertinoIcons.delete_solid, - color: Colors.white, - size: 30, - ), - ), - onDismissed: (v) { - BlocProvider.of(context).add( - EventToggleCategoryWidget(model.id!, widgets[index].id)); - }, - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), - child: FeedbackWidget( - duration: const Duration(milliseconds: 200), - onPressed: () => _toDetailPage(context, widgets[index]), - child: - // Container(height: 60,) - SimpleWidgetItem( - data: widgets[index], - )), - ), - ), - itemCount: widgets.length); - } - - _toDetailPage(BuildContext context, WidgetModel model) async { - Navigator.pushNamed(context, UnitRouter.widget_detail, arguments: model); - } -} - -class SimpleWidgetItem extends StatelessWidget { - final WidgetModel data; - - const SimpleWidgetItem({Key? key, required this.data}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.transparent, - height: 75, - child: Row( - children: [ - _buildLeading(), - const SizedBox( - width: 20, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [_buildTitle(), _buildSummary()], - ), - ) - ], - ), - ); - } - - Widget _buildTitle() { - return Row( - children: [ - Text(data.name, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - shadows: [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - const SizedBox(width: 15), - StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: data.color), - score: data.lever, - ) - ], - ); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 60, - color: data.color, - ), - ) - : CircleImage( - image: data.image!, - size: 60, - ), - ); - - Widget _buildSummary() { - return Text( - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - color: Color(0xFF757575), - fontSize: 14, - shadows: [Shadow(color: Colors.white, offset: Offset(.5, .5))]), - ); - } -} diff --git a/lib/widget_ui/mobile/category_page/category_list_item.dart b/lib/widget_ui/mobile/category_page/category_list_item.dart deleted file mode 100644 index 1d43ceb4..00000000 --- a/lib/widget_ui/mobile/category_page/category_list_item.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2020-04-21 -/// contact me by email 1981462002@qq.com -/// 说明: - -class CategoryListItem extends StatelessWidget { - final CategoryModel data; - final Function(CategoryModel)? onDeleteItemClick; - final Function(CategoryModel)? onEditItemClick; - - const CategoryListItem({Key? key, required this.data, this.onDeleteItemClick,this.onEditItemClick}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - child: _buildChild(context), - padding: const EdgeInsets.all(10), - - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow(color: Colors.black.withOpacity(0.1),blurRadius: 2) - ], - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ); - - } - - _buildChild(BuildContext context) { - final Color themeColor = Theme.of(context).primaryColor; - return Column( - children: [ - _buildTitle(themeColor), - const Divider(), - Expanded( - child: Stack( - fit: StackFit.expand, - children: [ - Container( - padding: const EdgeInsets.only(top: 10, left: 10, right: 10), - child: Text(data.info, - style: TextStyle( - color: Colors.grey, - shadows: [ - Shadow(color: themeColor.withOpacity(0.4), offset:const Offset(.2,.2),blurRadius: .5) - ])), - ), - Positioned( - bottom: 5, - right: 5, - child: - FeedbackWidget( - onPressed: () { - onEditItemClick?.call(data); - }, - child: Icon( - Icons.edit, - size: 20, - color: themeColor, - ), - ) - ) - ], - )), - const Divider(), - Padding( - padding: const EdgeInsets.all(5.0), - child: Text( - '创建于 ${data.createDate}', - style: const TextStyle(color: Colors.grey, fontSize: 12), - ), - ), - ], - ); - } - - Row _buildTitle(Color themeColor) { - return Row( - children: [ - CircleText( - text: "${data.count}", - size: 35, - fontSize: 14, - backgroundColor: data.color, - ), - const SizedBox( - width: 10, - ), - Expanded( - child: Text( - data.name, - style: const TextStyle(fontWeight: FontWeight.bold), - )), - FeedbackWidget( - onPressed: () { - onDeleteItemClick?.call(data); - }, - child: const Icon( - CupertinoIcons.delete_solid, - color: Colors.red, - ), - ) - ], - ); - } -} \ No newline at end of file diff --git a/lib/widget_ui/mobile/category_page/collect_page.dart b/lib/widget_ui/mobile/category_page/collect_page.dart deleted file mode 100644 index d81b6a2c..00000000 --- a/lib/widget_ui/mobile/category_page/collect_page.dart +++ /dev/null @@ -1,167 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -import 'package:authentication/views/authentic_widget.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - -import '../../desk_ui/category_panel/desk_category_page.dart'; -import 'category_page.dart'; -import 'like_widget_page.dart'; -import 'sync/async_button.dart'; -import 'sync/upload_button.dart'; - - -class CollectPageAdapter extends StatelessWidget { - const CollectPageAdapter({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - bool isDesk = Platform.isMacOS||Platform.isWindows||Platform.isLinux; - if(isDesk){ - return DeskCategoryPage(); - }else{ - return CollectPage(); - } - } -} - - - -class CollectPage extends StatefulWidget { - const CollectPage({Key? key}) : super(key: key); - - @override - _CollectPageState createState() => _CollectPageState(); -} - -class _CollectPageState extends State - with AutomaticKeepAliveClientMixin { - final List _tabs = const [ - '收藏集录', - '珍藏组件', - ]; - - @override - Widget build(BuildContext context) { - super.build(context); - BuildContext _topContext = context; - final Color color = BlocProvider.of(context).state.tabColor.withAlpha(11); - - return Scaffold( - backgroundColor: Colors.white, - body: Container( - color: color, - child: DefaultTabController( - length: _tabs.length, - child: NestedScrollView( - headerSliverBuilder: (context, innerBoxIsScrolled) => [ - SliverOverlapAbsorber( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context), - sliver: _buildAppBar(_topContext, innerBoxIsScrolled)), - ], - body: const TabBarView( - children: [ - CategoryPage(), - LikeWidgetPage(), - ], - ), - ), - ), - )); - } - - Widget _buildAppBar(BuildContext context, bool index) { - final Color color = BlocProvider.of(context).state.color; - - return SliverAppBar( - systemOverlayStyle: const SystemUiOverlayStyle( - statusBarIconBrightness: Brightness.light - ), - leading: Container( - margin: const EdgeInsets.all(10), - child: FeedbackWidget( - onPressed: () { - // Navigator.of(context).pushNamed(UnitRouter.login); - }, - child: const CircleImage( - image: AssetImage('assets/images/icon_head.webp'), - borderSize: 1.5, - ), - )), - backgroundColor: color, - actions: [ - SizedBox( - width: 32, - child: AuthenticWidget.just(const UploadCategoryButton())), - // SizedBox(width: 5,), - SizedBox( - width: 32, - child: AuthenticWidget.just(const SyncCategoryButton())), - _buildAddAction(context) - ], - title: const Text( - '收藏集 CollectUnit', - style: TextStyle( - color: Colors.white, //标题 - fontSize: 18, - shadows: [ - Shadow(color: Colors.blue, offset:Offset(1, 1), blurRadius: 2) - ]), - ), - pinned: true, - expandedHeight: 150.0, - flexibleSpace: FlexibleSpaceBar( - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - forceElevated: index, - bottom: PreferredSize( - preferredSize: const Size.fromHeight(30), - child: TabBar( - indicatorColor: Colors.transparent, - unselectedLabelColor: Colors.white, - labelColor: Colors.black, - labelStyle: TextStyle(fontSize: 16, shadows: [ - Shadow( - color: Theme.of(context).primaryColor, - offset: const Offset(1, 1), - blurRadius: 10) - ]), - tabs: _buildTabs(), - ), - ), - ); - } - - Widget _buildAddAction(BuildContext context) => IconButton( - icon: const Icon( - Icons.add, - size: 30, - ), - onPressed: () => Scaffold.of(context).openEndDrawer()); - - List _buildTabs() => _tabs - .map( - (String name) => Container( - margin: const EdgeInsets.only(bottom: 5), - alignment: Alignment.center, - child: Text(name), - ), - ) - .toList(); - - @override - bool get wantKeepAlive => true; -} - - - - diff --git a/lib/widget_ui/mobile/search_page/search_page.dart b/lib/widget_ui/mobile/search_page/search_page.dart deleted file mode 100644 index 28d97999..00000000 --- a/lib/widget_ui/mobile/search_page/search_page.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'app_search_bar.dart'; - - -// SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc -// 不必单独提供 SearchBloc 增加复杂性 -class SearchPageProvider extends StatelessWidget { - const SearchPageProvider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocProvider( - lazy: false, - create: (BuildContext context) => WidgetsBloc( - repository: BlocProvider.of(context).repository, - ), - child: const SearchPage(), - ); - } -} - -class SearchPage extends StatefulWidget { - const SearchPage({Key? key}) : super(key: key); - - @override - _SearchPageState createState() => _SearchPageState(); -} - -class _SearchPageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - body: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - SliverToBoxAdapter(child: _buildStarFilter()), - BlocBuilder(builder: _buildBodyByState) - ], - ), - ); - } - - Widget _buildSliverAppBar() { - return const SliverAppBar( - pinned: true, - title: AppSearchBar(), - actions: [ - Padding( - padding: EdgeInsets.only(right: 15.0), - child: Icon(TolyIcon.icon_sound), - ) - ], - ); - } - - Widget _buildStarFilter() => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 10.0, left: 20, bottom: 5), - child: Wrap( - spacing: 5, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Circle( - radius: 5, - color: Colors.orange, - ), - Text( - '星级查询', - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold), - ), - ], - ), - ), - MultiChipFilter( - data: const [1, 2, 3, 4, 5], - avatarBuilder: (_, index) => - CircleAvatar(child: Text((index + 1).toString())), - labelBuilder: (_, selected) => Icon( - Icons.star, - color: selected ? Colors.blue : Colors.grey, - size: 18, - ), - onChange: _doSelectStart, - ), - const Divider(), - const SizedBox( - height: 10, - ) - ], - ); - - Widget _buildBodyByState(BuildContext context, WidgetsState state) { - Widget noSearchArg = const SliverToBoxAdapter(child: NotSearchPage()); - if (state.filter.name.isEmpty) { - return noSearchArg; - } - - if (state is WidgetsLoading) { - return const SliverToBoxAdapter(child: LoadingShower()); - } - - if (state is WidgetsLoadFailed) { - return const SliverToBoxAdapter(child: ErrorPage()); - } - - if (state is WidgetsLoaded) { - if (state.widgets.isEmpty) { - return const SliverToBoxAdapter( - child: EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", - ), - ); - } - return _buildSliverList(state.widgets); - } - return const SliverToBoxAdapter(child: NotSearchPage()); - } - - Widget _buildSliverList(List models) => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Padding( - padding: const EdgeInsets.only( - bottom: 10, top: 2, left: 10, right: 10), - child: InkWell( - customBorder: HomeItemSupport.shapeBorderMap[index], - onTap: () => _toDetailPage(models[index]), - child: TechnoWidgetListItem( - data: models[index], - ))), - childCount: models.length), - ); - - void _doSelectStart(List select) { - List temp = select.map((e) => e + 1).toList(); - if (temp.length < 5) { - temp.addAll(List.generate(5 - temp.length, (e) => -1)); - } - WidgetsBloc widgetsBloc = BlocProvider.of(context); - final WidgetFilter filter = widgetsBloc.state.filter.copyWith( - stars: temp, - ); - widgetsBloc.add( - EventSearchWidget(filter: filter), - ); - } - - void _toDetailPage(WidgetModel model) { - //收起键盘 - final FocusScopeNode focusScope = FocusScope.of(context); - if (focusScope.hasFocus) { - focusScope.unfocus(); - } - BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed(context, UnitRouter.widget_detail,arguments: model); - } -} - diff --git a/lib/widget_ui/mobile/search_page/standard_search_bar.dart b/lib/widget_ui/mobile/search_page/standard_search_bar.dart deleted file mode 100644 index c8685d75..00000000 --- a/lib/widget_ui/mobile/search_page/standard_search_bar.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - - - -class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWidget { - - const StandardSearchBarInner({Key? key}) : super(key: key); - - @override - Size get preferredSize => const Size.fromHeight(35 + 8 * 2); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Row( - children: [ - const SizedBox( - width: 15, - ), - - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - Navigator.of(context).maybePop(); - }, - child: const SizedBox( - height: 32, - width: 32, - child: Icon( -Icons.arrow_back - ), - ), - ), - Expanded( - child: Container( - height: 35, - padding: const EdgeInsets.only(left: 10, right: 10), - child: Material( - color: Colors.transparent, - child: TextField( - autofocus: true, - enabled: true, - cursorColor: Colors.blue, - maxLines: 1, - onChanged: (str)=>_doSearch(context,str), - onSubmitted: (str) { - //提交后,收起键盘 - FocusScope.of(context).requestFocus(FocusNode()); - }, - decoration: const InputDecoration( - filled: true, - fillColor: Color(0xffF3F6F9), - prefixIcon: Icon( - Icons.search, - color: Colors.grey, - ), - border: UnderlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(35 / 2)), - ), - hintText: "搜索组件", - hintStyle: TextStyle(fontSize: 14) - ), - ), - )), - ), - Wrap( - spacing: 3, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Icon(TolyIcon.icon_sound), - // Text('已签',style: TextStyle(color: Colors.grey),) - ], - ), - const SizedBox( - width: 15, - ) - ], - ), - - ); - } - - void _doSearch(BuildContext context,String str) { - WidgetsBloc widgetsBloc = BlocProvider.of(context); - final WidgetFilter filter = widgetsBloc.state.filter.copyWith( - name: str, - ); - widgetsBloc.add( - EventSearchWidget(filter: filter), - ); - } -} diff --git a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart b/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart deleted file mode 100644 index e31b2e68..00000000 --- a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class CollectWidgetListItem extends StatelessWidget { - final WidgetModel data; - final Function(WidgetModel model)? onDeleteItemClick; - - const CollectWidgetListItem({Key? key, required this.data, this.onDeleteItemClick}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - Material( - color: itemColor.withAlpha(66), - shape: TechnoShapeBorder(color: itemColor), - child: Row( - children: [ - _buildLeading(), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTitle(), - _buildSummary(), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], - ), - ), - ], - ), - ), - Positioned( - bottom: 5, - right: 5, - child: FeedbackWidget( - onPressed: () { - onDeleteItemClick?.call(data); - }, - child: const Icon( - CupertinoIcons.delete_solid, - color: Colors.red, - ), - )) - ], - ); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 50, - color: itemColor, - ), - ) - : CircleImage( - image: data.image!, - size: 50, - ), - ); - - Color get itemColor => Cons.tabColors[data.family.index]; - - Widget _buildTitle() => Row( - children: [ - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - shadows: [ - Shadow( - color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - ], - ); - - Widget _buildSummary() => Padding( - padding: const EdgeInsets.only(left: 5, bottom: 5, top: 5), - child: Text( - data.nameCN, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.grey[600], - fontSize: 14, - shadows: const [Shadow(color: Colors.white, offset: Offset(.5, .5))]), - ), - ); -} diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart deleted file mode 100644 index 7239fd61..00000000 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'dart:math'; - -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:utils/utils.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class SliverWidgetDetailBar extends StatelessWidget { - final WidgetModel model; - - const SliverWidgetDetailBar({Key? key, required this.model}) - : super(key: key); - - final Color backgroundColor = const Color(0xffFAFAFA); - static const Color textColor = Color(0xff262626); - - @override - Widget build(BuildContext context) { - return SliverAppBar( - pinned: true, - backgroundColor: backgroundColor, - titleTextStyle: const TextStyle(color: textColor), - iconTheme: const IconThemeData(color: textColor), - expandedHeight: 120.0, - scrolledUnderElevation: 0.5, - flexibleSpace: DiyFlexibleSpaceBar( - expandedTitleScale: 2, - titleIconBuilder: (t) => WindmillWidget( - rotate: t * 2 * pi * 2, - radius: 15, - ), - fixedSubtitle: Text( - model.name, - style: const TextStyle(color: Color(0xff696969), fontSize: 12), - ), - title: Padding( - padding: const EdgeInsets.only(bottom: 3), - child: Text( - model.nameCN, - style: const TextStyle(color: textColor, fontSize: 16), - ), - ), - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 20, bottom: 10), - //标题边距 - collapseMode: CollapseMode.parallax, - ), - elevation: 0, - actions: [ - _buildToHome(context), - FeedbackWidget( - onPressed: () => _toggleLikeState(context), - child: BlocConsumer( - listener: _listenLikeStateChange, - builder: _buildByLikeState, - ), - ) - ], - ); - } - - void _toggleLikeState(BuildContext context) { - BlocProvider.of(context).add( - ToggleLikeWidgetEvent(id: model.id), - ); - } - - // 监听 LikeWidgetBloc 伺机弹出 toast - void _listenLikeStateChange(BuildContext context, LikeWidgetState state) { - bool collected = state.widgets.contains(model); - String msg = - collected ? "收藏【${model.name}】组件成功!" : "已取消【${model.name}】组件收藏!"; - Toast.toast( - context, - msg, - duration: Duration(milliseconds: collected ? 1500 : 600), - action: collected - ? SnackBarAction( - textColor: Colors.white, - label: '收藏夹管理', - onPressed: () => Scaffold.of(context).openEndDrawer()) - : null, - ); - } - - // 根据 [LikeWidgetState ] 构建图标 - Widget _buildByLikeState(BuildContext context, LikeWidgetState state) { - bool liked = state.widgets.contains(model); - return Padding( - padding: const EdgeInsets.only(right: 20.0), - child: Icon( - liked ? TolyIcon.icon_star_ok : TolyIcon.icon_star_add, - size: 25, - ), - ); - } - - Widget _buildToHome(BuildContext context) => GestureDetector( - onLongPress: () => Scaffold.of(context).openEndDrawer(), - child: const Padding( - padding: EdgeInsets.all(15.0), - child: Icon(Icons.home), - ), - onTap: () => Navigator.of(context).pop()); -} diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart deleted file mode 100644 index f9ac02fe..00000000 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ /dev/null @@ -1,186 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'widget_node_panel.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'package:widgets/widgets.dart'; - -import 'category_end_drawer.dart'; -import 'widget_detail_bar.dart'; -import 'widget_detail_panel.dart'; - - -// 用于组件详情不需要在一开始就加载 -// WidgetDetailBloc 可以在稍后提供 -class WidgetDetailPageScope extends StatelessWidget { - final WidgetModel model; - - const WidgetDetailPageScope({super.key, required this.model}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => WidgetDetailBloc( - widgetRepository: const WidgetDbRepository(), - nodeRepository: const NodeDbRepository()) - ..add(FetchWidgetDetail(model)), - child: WidgetDetailPage( - model: model, - ), - ); - } -} - -class WidgetDetailPage extends StatefulWidget { - final WidgetModel model; - - const WidgetDetailPage({Key? key, required this.model}) : super(key: key); - - @override - _WidgetDetailPageState createState() => _WidgetDetailPageState(); -} - -class _WidgetDetailPageState extends State { - final List _modelStack = []; - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - @override - void initState() { - _modelStack.add(widget.model); - super.initState(); - } - - // 获取当前的 组件数据模型 - WidgetModel get currentWidgetModel => _modelStack.last; - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => Scaffold( - endDrawer: CategoryEndDrawer(widget: currentWidgetModel), - body: Builder(builder: (ctx) { - return _buildContent(ctx, state); - }), - ), - ); - } - - Widget get linkText => Row( - children: const [ - Padding( - padding: EdgeInsets.only(left: 15, right: 5), - child: Icon(Icons.link, color: Colors.blue), - ), - Text('相关组件', style: UnitTextStyle.labelBold), - ], - ); - - Widget _buildContent(BuildContext context, DetailState state) { - return WillPopScope( - onWillPop: () => _whenPop(context), - child: CustomScrollView( - slivers: [ - SliverWidgetDetailBar( - model: _modelStack.last - ), - SliverToBoxAdapter( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - WidgetDetailPanel(model: _modelStack.last), - linkText, - if (state is DetailWithData) - _buildLinkTo(context, state.links), - const Divider(), - ], - ), - ), - if (state is DetailWithData) - _buildSliverNodeList(state.nodes, state.widgetModel.name) - ], - )); - } - - - - Future _whenPop(BuildContext context) async { - if (Scaffold.of(context).isEndDrawerOpen || _modelStack.isEmpty) { - return true; - } - _modelStack.removeLast(); - if (_modelStack.isNotEmpty) { - BlocProvider.of(context).add( - FetchWidgetDetail(currentWidgetModel), - ); - return false; - } else { - return true; - } - } - - Color? get chipColor => isDark - ? Theme.of(context).floatingActionButtonTheme.backgroundColor - : Theme.of(context).primaryColor; - - Widget _buildLinkTo(BuildContext context, List links) { - if (links.isEmpty) { - return Padding( - padding: const EdgeInsets.only(left: 10), - child: Chip( - backgroundColor: Colors.grey.withAlpha(120), - labelStyle: const TextStyle(fontSize: 12, color: Colors.white), - label: const Text('暂无链接组件'), - )); - } else { - return Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), - child: Wrap( - spacing: 5, - children: links - .map((WidgetModel model) => ActionChip( - labelPadding: EdgeInsets.zero, - side: BorderSide.none, - onPressed: () => _toLinkWidget(model), - elevation: 1, - // shadowColor: chipColor, - backgroundColor: chipColor, - labelStyle: model.deprecated - ? UnitTextStyle.deprecatedChip - : UnitTextStyle.commonChip, - label: Text(model.name), - )) - .toList(), - ), - ); - } - } - - void _toLinkWidget(WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); - _modelStack.add(model); - } - - Widget _buildSliverNodeList(List nodes, String name) { - AppState globalState = BlocProvider.of(context).state; - HighlighterStyle codeStyle = - Cons.codeThemeSupport.keys.toList()[globalState.codeStyleIndex]; - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, i) => WidgetNodePanel( - codeStyle: codeStyle, - codeFamily: 'Inconsolata', - text: nodes[i].name, - subText: nodes[i].subtitle, - code: nodes[i].code, - death: _modelStack.last.death, - show: WidgetsMap.map(name)[i], - ), - childCount: nodes.length, - )); - } -} diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart deleted file mode 100644 index 1b7f1050..00000000 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class WidgetDetailPanel extends StatelessWidget { - final WidgetModel model; - - const WidgetDetailPanel({Key? key, required this.model}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - _buildLeft(model, context), - _buildRight(model), - ], - ), - const Divider(), - ], - ); - } - - Widget _buildLeft(WidgetModel model, BuildContext context) => Expanded( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, - child: Text(model.info)), - ), - ); - - Widget _buildRight(WidgetModel model) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - height: 100, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Hero( - tag: "hero_widget_image_${model.id}", - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(8)), - child: model.image == null - ? Image.asset('assets/images/caver.webp') - : Image(image: model.image!))), - ), - ), - StarScore( - score: model.lever, - star: const Star(size: 15, fillColor: Colors.blue), - ) - ], - ); -} diff --git a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart b/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart deleted file mode 100644 index ee087c43..00000000 --- a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:toggle_rotate/toggle_rotate.dart'; - - -/// create by 张风捷特烈 on 2020-04-13 -/// contact me by email 1981462002@qq.com -/// 说明: 一个Widget的知识点对应的界面 - -class WidgetNodePanel extends StatefulWidget { - final String text; - final String subText; - final String code; - final Widget? show; - final HighlighterStyle? codeStyle; - final String? codeFamily; - final bool death; - - const WidgetNodePanel( - {Key? key, this.text='', - this.subText='', - this.code='', - this.death=false, - this.show, - required this.codeStyle, - this.codeFamily}) : super(key: key); - - @override - _WidgetNodePanelState createState() => _WidgetNodePanelState(); -} - -class _WidgetNodePanelState extends State { - CrossFadeState _crossFadeState = CrossFadeState.showFirst; - - bool get isFirst => _crossFadeState == CrossFadeState.showFirst; - - Color get themeColor => Theme.of(context).primaryColor; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - buildNodeTitle(), - const SizedBox( - height: 20, - ), - _buildCode(context), - Padding( - padding: const EdgeInsets.only(top: 10, bottom: 20), - child: widget.show, - ), - if(!widget.death) - _buildNodeInfo(), - const Divider(), - ], - ), - ); - } - - Widget buildNodeTitle() => Row( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Circle( - color: themeColor, - radius: 5, - ), - ), - Expanded( - child: Text( - widget.text, - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), - ), - ), - _buildShareButton(), - _buildCodeButton() - ], - ); - - Widget _buildNodeInfo() => SizedBox( - width: double.infinity, - child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, - child: Text( - widget.subText, - style: const TextStyle(fontSize: 12), - )), - ); - - Widget _buildCodeButton() => Padding( - padding: const EdgeInsets.only(right: 10.0), - child: ToggleRotate( - durationMs: 300, - child: Icon( - TolyIcon.icon_code, - color: themeColor, - ), - onTap: _toggleCodePanel, - ), - ); - - Widget _buildShareButton() => FeedbackWidget( - mode: FeedMode.fade, - a: 0.4, - onPressed: _doShare, - child: Padding( - padding: const EdgeInsets.only( - right: 10, - ), - child: Icon( - TolyIcon.icon_share, - size: 20, - color: themeColor, - ), - ), - ); - - Widget _buildCode(BuildContext context) => AnimatedCrossFade( - firstCurve: Curves.easeInCirc, - secondCurve: Curves.easeInToLinear, - firstChild: const SizedBox(), - secondChild: SizedBox( - width: MediaQuery.of(context).size.width, - child: CodeWidget( - fontFamily: widget.codeFamily, - code: isFirst?'':widget.code, - style: widget.codeStyle ?? - HighlighterStyle.fromColors(HighlighterStyle.lightColor), - ), - ), - duration: const Duration(milliseconds: 200), - crossFadeState: _crossFadeState, - ); - - //执行分享 - _doShare() { - Share.share(widget.code); - } - - // 折叠代码面板 - _toggleCodePanel() { - setState(() { - _crossFadeState = - !isFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond; - }); - } -} diff --git a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart b/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart deleted file mode 100644 index 15004da3..00000000 --- a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'widget_model_item.dart'; - -class PhoneWidgetContent extends StatelessWidget { - final List items; - - const PhoneWidgetContent({Key? key,required this.items}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => StandardWidgetItem( - model: items[index], - onTap: () => _toDetail(context, items[index]), - ), - childCount: items.length, - ), - ); - } - - void _toDetail(BuildContext context, WidgetModel model) { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - } -} diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart deleted file mode 100644 index 8c246545..00000000 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ /dev/null @@ -1,134 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/home_drawer.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'standard_home_search.dart'; -import 'widget_list_panel.dart'; - -class StandardHomePage extends StatefulWidget { - const StandardHomePage({Key? key}) : super(key: key); - - @override - State createState() => _StandardHomePageState(); -} - -class _StandardHomePageState extends State - with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - static const List _tabs = ['无态', '有态', '单渲', '多渲', '滑片', '代理', '其它']; - late TabController tabController; - - @override - void initState() { - super.initState(); - tabController = TabController(length: _tabs.length, vsync: this); - } - - @override - void dispose() { - tabController.dispose(); - super.dispose(); - } - - List _buildHeader(BuildContext context, bool innerBoxIsScrolled) { - Color themeColor = Theme.of(context).primaryColor; - - return [ - const SliverSnapHeader( - child: StandardHomeSearch(), - ), - SliverOverlapAbsorber( - sliver: SliverPinnedHeader( - child: TabBar( - onTap: _switchTab, - indicatorSize: TabBarIndicatorSize.label, - isScrollable: true, - indicator: RoundRectTabIndicator( - borderSide: BorderSide(color: themeColor, width: 3), - ), - labelStyle: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - controller: tabController, - labelColor: themeColor, - indicatorWeight: 3, - unselectedLabelColor: Colors.grey, - indicatorColor: themeColor, - tabs: _tabs.map((String name) => Tab(text: name)).toList(), - ), - ), - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - ]; - } - - void _switchTab(int index) { - WidgetFamily widgetFamily = Convert.toFamily(index); - context.read() - .change(Cons.tabColors[index], family: widgetFamily); - BlocProvider.of(context).add(EventTabTap(widgetFamily)); - } - - @override - Widget build(BuildContext context) { - super.build(context); - final AppBarTheme appBarTheme = AppBarTheme.of(context); - - return Scaffold( - backgroundColor: const Color(0xffF3F4F6), - drawer: const HomeDrawer(), - body: Column( - children: [ - AnnotatedRegion( - value: appBarTheme.systemOverlayStyle!, - child: Container( - color: Colors.white, - height: MediaQuery.of(context).padding.top, - ), - ), - Expanded( - child: NestedScrollView( - floatHeaderSlivers: true, - headerSliverBuilder: _buildHeader, - body: TabBarView( - physics: const NeverScrollableScrollPhysics(), - controller: tabController, - children: _tabs.map(buildScrollPage).toList(), - ), - ), - ), - ], - ), - ); - } - - Widget buildScrollPage(String name) { - return Builder( - builder: (BuildContext context) => CustomScrollView( - key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - const WidgetListPanel(), - SliverPadding( - padding: const EdgeInsets.only(bottom: 20), - sliver: SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - ), - ], - ), - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart deleted file mode 100644 index 62bf4080..00000000 --- a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -import '../search_page/standard_search_page.dart'; - - -class StandardHomeSearch extends StatelessWidget - implements PreferredSizeWidget { - const StandardHomeSearch({Key? key}) : super(key: key); - - @override - Size get preferredSize => const Size.fromHeight(35 + 8 * 2); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Row( - children: [ - const SizedBox(width: 15), - FeedbackWidget( - onPressed: () => _openDrawer(context), - child: const CircleAvatar( - radius: 16, - backgroundImage: AssetImage('assets/images/icon_head.webp'), - ), - ), - Expanded( - child: GestureDetector( - onTap: () { - Navigator.of(context).push( - FadeRouter(child: const StandardSearchPageProvider())); - }, - child: Container( - height: 35, - padding: const EdgeInsets.only(left: 10, right: 10), - child: const Material( - color: Colors.transparent, - child: TextField( - autofocus: false, - enabled: false, - cursorColor: Colors.blue, - maxLines: 1, - decoration: InputDecoration( - filled: true, - fillColor: Color(0xffF3F6F9), - prefixIcon: Icon( - Icons.search, - color: Colors.grey, - ), - border: UnderlineInputBorder( - borderSide: BorderSide.none, - borderRadius: - BorderRadius.all(Radius.circular(35 / 2)), - ), - hintText: "搜索组件", - hintStyle: TextStyle(fontSize: 14)), - ), - )), - ), - ), - const Icon(TolyIcon.icon_sound), - const SizedBox(width: 15) - ], - ), - ); - } - - void _openDrawer(BuildContext context) { - Scaffold.of(context).openDrawer(); - } -} diff --git a/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart b/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart deleted file mode 100644 index 75929aa6..00000000 --- a/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:components/project_ui/project_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'phone_widget_content.dart'; - -class WidgetListPanel extends StatelessWidget { - const WidgetListPanel({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => _buildContent(state), - ); - } - - Widget _buildContent(WidgetsState state) { - if (state is WidgetsLoading) { - return const SliverFillRemaining( - child: LoadingShower(), - ); - } - - if (state is WidgetsLoaded) { - List items = state.widgets; - if (items.isEmpty) { - return const SliverFillRemaining( - child: EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", - ), - ); - } - return SliverLayoutBuilder(builder: (_, c) { - if (c.crossAxisExtent > 500) { - return DeskWidgetContent( - items: items, - width: c.crossAxisExtent, - ); - } - return PhoneWidgetContent( - items: items, - ); - }); - } - - if (state is WidgetsLoadFailed) { - return SliverFillRemaining( - child: ErrorShower( - error: "数据加载异常:\n${state.error}", - )); - } - return Container(); - } -} diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart deleted file mode 100644 index 42c0c66c..00000000 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ /dev/null @@ -1,158 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'package:wrapper/wrapper.dart'; - -class StandardWidgetItem extends StatelessWidget { - final WidgetModel model; - final VoidCallback onTap; - final String? searchArg; - - const StandardWidgetItem( - {Key? key, required this.model, required this.onTap, this.searchArg}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 10), - child: InkWell( - onTap: onTap, - child: Ink( - color: Colors.white, - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - // margin: - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildTitle(Theme.of(context).primaryColor), - _buildContent(), - _buildFoot() - ], - ), - ), - ), - ); - } - - Widget _buildTitle(Color color) { - return Row( - children: [ - if (searchArg == null) - Text( - model.name, - style: const TextStyle( - fontSize: 16, - color: Color(0xff2F3032), - fontWeight: FontWeight.bold, - ), - ), - if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), - const SizedBox( - width: 8, - ), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: Wrapper.just( - radius: 10, - color: const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - '已收藏', - style: TextStyle( - color: color, - height: 1, - fontSize: 10, - shadows: const [ - Shadow( - color: Colors.white, - blurRadius: 2, - offset: Offset(1, 1)) - ]), - ), - ), - ); - }), - const Spacer(), - StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: color), - score: model.lever, - ), - ], - ); - } - - Widget _buildContent() { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Text( - model.info, - style: const TextStyle(fontSize: 14, color: Color(0xff2F3032)), - ), - ); - } - - Widget _buildFoot() { - return Row( - children: [ - Container( - width: 4, - height: 4, - margin: const EdgeInsets.only(right: 6), - decoration: const BoxDecoration( - color: Color(0xff86909c), shape: BoxShape.circle), - ), - Text( - model.nameCN, - style: const TextStyle( - fontSize: 12, height: 1, color: Color(0xff86909c)), - ), - const Spacer(), - Wrapper.just( - radius: 2, - color: const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - Cons.kWidgetFamilyLabelMap[model.family]!, - style: const TextStyle( - color: Color(0xff878D96), - height: 1, - fontSize: 12, - shadows: [ - Shadow( - color: Colors.white, blurRadius: 2, offset: Offset(1, 1)) - ]), - ), - ), - ], - ); - } - - final TextStyle lightTextStyle = const TextStyle( - color: Colors.red, - fontSize: 16, - fontWeight: FontWeight.bold, - ); - - InlineSpan formSpan(String src, String pattern) { - List span = []; - RegExp regExp = RegExp(pattern, caseSensitive: false); - src.splitMapJoin(regExp, onMatch: (Match match) { - span.add(TextSpan(text: match.group(0), style: lightTextStyle)); - return ''; - }, onNonMatch: (str) { - span.add(TextSpan( - text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); - return ''; - }); - return TextSpan(children: span); - } -} diff --git a/lib/widget_ui/widget_ui.dart b/lib/widget_ui/widget_ui.dart deleted file mode 100644 index 3e16562b..00000000 --- a/lib/widget_ui/widget_ui.dart +++ /dev/null @@ -1,8 +0,0 @@ -// export '../widget_system/views/widget_detail_page/widget_detail_page.dart'; -// export '../widget_system/views/category_view/category_page.dart'; -// export '../widget_system/views/category_view/collect_page.dart'; -// export '../widget_system/views/category_view/home_right_drawer.dart'; -// export '../widget_system/views/category_view/category_detail.dart'; -// export '../widget_system/views/search_view/search_page.dart'; - - diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 0cacc750..43f825cc 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,14 +6,22 @@ #include "generated_plugin_registrant.h" -#include +#include +#include +#include #include #include void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) screen_retriever_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); - screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) open_file_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); + open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 62f151fd..95b737f5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,7 +3,9 @@ # list(APPEND FLUTTER_PLUGIN_LIST - screen_retriever + file_selector_linux + open_file_linux + screen_retriever_linux url_launcher_linux window_manager ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 7426e610..25112d2f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,22 +5,30 @@ import FlutterMacOS import Foundation -import package_info_plus_macos -import path_provider_macos -import screen_retriever +import file_picker +import open_file_mac +import package_info_plus +import path_provider_foundation +import quill_native_bridge_macos +import screen_retriever_macos import share_plus -import shared_preferences_macos -import sqflite +import shared_preferences_foundation +import sqflite_darwin import url_launcher_macos +import webview_flutter_wkwebview import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) + QuillNativeBridgePlugin.register(with: registry.registrar(forPlugin: "QuillNativeBridgePlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 069154c5..6fea947e 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,73 +1,92 @@ PODS: + - file_picker (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - - package_info_plus_macos (0.0.1): + - open_file_mac (0.0.1): + - FlutterMacOS + - package_info_plus (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter - FlutterMacOS - - path_provider_macos (0.0.1): + - quill_native_bridge_macos (0.0.1): - FlutterMacOS - - screen_retriever (0.0.1): + - screen_retriever_macos (0.0.1): - FlutterMacOS - share_plus (0.0.1): - FlutterMacOS - - shared_preferences_macos (0.0.1): + - shared_preferences_foundation (0.0.1): + - Flutter - FlutterMacOS - - sqflite (0.0.2): + - sqflite_darwin (0.0.4): + - Flutter - FlutterMacOS - - FMDB (>= 2.7.5) - url_launcher_macos (0.0.1): - FlutterMacOS + - webview_flutter_wkwebview (0.0.1): + - Flutter + - FlutterMacOS - window_manager (0.2.0): - FlutterMacOS DEPENDENCIES: + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - - package_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos`) - - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) - - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) + - open_file_mac (from `Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - webview_flutter_wkwebview (from `Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) -SPEC REPOS: - trunk: - - FMDB - EXTERNAL SOURCES: + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos FlutterMacOS: :path: Flutter/ephemeral - package_info_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos - path_provider_macos: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos - screen_retriever: - :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos + open_file_mac: + :path: Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + quill_native_bridge_macos: + :path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos share_plus: :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos - shared_preferences_macos: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + webview_flutter_wkwebview: + :path: Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin window_manager: :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c - path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 - screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 - shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 + open_file_mac: 0e554648e2a87ce59e9438e3e5ca3e552e90d89a + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + quill_native_bridge_macos: 3a5f378bc757eb92825193853020b759b56cbb2c + screen_retriever_macos: 776e0fa5d42c6163d2bf772d22478df4b302b161 + share_plus: 1fa619de8392a4398bfaf176d441853922614e89 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + webview_flutter_wkwebview: a4af96a051138e28e29f60101d094683b9f82188 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 -COCOAPODS: 1.11.3 +COCOAPODS: 1.14.3 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 35baad73..a19f9ac5 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -21,12 +21,13 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 04C873F32A42825600BAB8F5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70442F268D8DC1467C4B98E1 /* Pods_Runner.framework */; }; + 04C873F42A42825600BAB8F5 /* Pods_Runner.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 70442F268D8DC1467C4B98E1 /* Pods_Runner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - A37B1E596FCF76C5AC4F6EF1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70442F268D8DC1467C4B98E1 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -46,6 +47,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 04C873F42A42825600BAB8F5 /* Pods_Runner.framework in Bundle Framework */, ); name = "Bundle Framework"; runOnlyForDeploymentPostprocessing = 0; @@ -80,7 +82,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A37B1E596FCF76C5AC4F6EF1 /* Pods_Runner.framework in Frameworks */, + 04C873F32A42825600BAB8F5 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -94,7 +96,6 @@ F04E92F35B305ECDEB7ABD24 /* Pods-Runner.release.xcconfig */, B432D8A33593253D20752670 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -203,13 +204,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { CreatedOnToolsVersion = 9.2; LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.Sandbox = { enabled = 1; @@ -566,8 +566,11 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XQPP7CHG9D; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7c999745..46ae587f 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef643..b3c17614 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/modules/ability/r_upgrade-0.4.2/CHANGELOG.md b/modules/ability/r_upgrade-0.4.2/CHANGELOG.md new file mode 100644 index 00000000..c5c06398 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/CHANGELOG.md @@ -0,0 +1,80 @@ +## 0.4.2 +* fix issues(#76) support android 13. +## 0.4.1 +* fix issues(#71) +## 0.4.0 +* add silent install, fix google play release issues. +## 0.3.9 +* fixed download file not exist error. +## 0.3.8+2 +* fixed download file not exist error. +## 0.3.8+1 +* fixed [installByPath] error. +## 0.3.8 +* fixed get download header error,big file adapter,add [installByPath] method +## 0.3.7+3 +* fixed Are you missing a call to unregisterReceiver(). +## 0.3.7+2 +* fixed android 31 notification problem. +## 0.3.7+1 +* Class [DownloadInfo] add [getSpeedString] method , change [LICENSE] to Apache License 2.0. +## 0.3.7 +* fixed android compile SDK version = 31 crash error,upgrade version click cancel crash error、 +## 0.3.6 +* add android platform [androidStores]、[getVersionFromAndroidStore] methods. +## 0.3.5 +* fix ios if not exist appId will crash error,add isChina params to [getVersionFrom]、[upgradeFromAppStore] method. +## 0.3.4 +* fix 301/302 download error, larger then Android N network disconnect turn to connect download recovery. +## 0.3.3 +* adapter null safety. +## 0.3.2+3 +* adapter android Q. +## 0.3.2+2 +* fix issues #23 again. +## 0.3.2+1 +* fix issues #23. +## 0.3.2 +* Repair the installation of two applications using the plug-in on the same device, resulting in two different but synchronous progress problems in the application, and the download failure occurred during the repair pause. +## 0.3.1+2 +* Improve the download process and repair the problem that incremental update files do not exist. +## 0.3.1+1 +* fix [#17](https://github.com/rhymelph/r_upgrade/issues/17) +## 0.3.1 +* add `Android` permission check, when you use `upgrade` or `install`. +## 0.3.0 +* remove `hotUpgrade` method,add increment upgrade.edit `upgrade` method. +## 0.2.6 +* fix mini bug ,and change notification channel name ,fix example hot upgrade error. +## 0.2.5 +* add `notificationStyle` params from `upgrade` method. +## 0.2.4 +* add `upgradeFromAndroidStore` method. +## 0.2.2 +* fix not use stream can not open notification,update `upgradeWithId` method. +## 0.2.1 +* fix Android 6.0 install error. +## 0.2.0 +* will power and awesome . +## 0.1.8 +* adapter FlutterPlugin . +## 0.1.7 +* add hot upgrade. +## 0.1.6 +* fix file provider merge error and add can select auto apk install. +## 0.1.5 +* add license. +## 0.1.4 +* fix [issues/2](https://github.com/rhymelph/r_upgrade/issues/2#issue-524088878) +## 0.1.3 +* fix progress will decrement. +## 0.1.2 +* fix progress is null and speed is negative issus. +## 0.1.1 +* add ios upgrade from AppStore. +## 0.1.0 +* fix install apk. +## 0.0.2 +* Improving health. +## 0.0.1 +* release plugin. \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/LICENSE b/modules/ability/r_upgrade-0.4.2/LICENSE new file mode 100644 index 00000000..895657b9 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/LICENSE @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/README.md b/modules/ability/r_upgrade-0.4.2/README.md new file mode 100644 index 00000000..a2aadf61 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/README.md @@ -0,0 +1,364 @@ +# r_upgrade +[![pub package](https://img.shields.io/pub/v/r_upgrade.svg)](https://pub.dartlang.org/packages/r_upgrade) + +![](screen/r_upgrade.png) + +## [中文点此](README_CN.md) + +Android and IOS upgrade plugin. + +- [✔] Jump link mode upgrade +- [✔] `Android` Get user installed android stores. +- [✔] `Android` Get version from android stores(only support GooglePlay、XiaoMi、Tencent) +- [✔] `Android` Jump to store mode upgrade +- [✔] `Android` Download APK using download link + - [✔] Monitor download information + - [✔] cancel/pause/continue download + - [✔] Get download status according to ID + - [✔] Install app according to ID + - [✔] Get the last download ID (based on the version name and version number) + - [✔] Modify the information displayed in the notification bar +- [✔] `Android` hot upgrade +- [✔] `Android` increment upgrade +- [✔] `IOS` Jump to Appstore upgrade according to appid +- [✔] `IOS` Get the current online version of Appstore according to appid + +> For the development of this plug-in, I haven't had a good meal for a long time. I hope you can click on the sponsor and give a little bit of money. Thank you! + +## List +- [r_upgrade](#r_upgrade) + - [中文点此](#中文点此) + - [List](#list) + - [Getting Started](#getting-started) + - [1. Use Plugin:](#1-use-plugin) + - [2. Upgrade from your website ( Android or IOS )](#2-upgrade-from-your-website--android-or-ios-) + - [Android Platform](#android-platform) + - [1.Get android store list.](#1get-android-store-list) + - [2.Get version from android store.](#2get-version-from-android-store) + - [3. App upgrade from store.](#3-app-upgrade-from-store) + - [4. App upgrade from download link.](#4-app-upgrade-from-download-link) + - [1. Add Upgrade Download Listener](#1-add-upgrade-download-listener) + - [2. Upgrade your application](#2-upgrade-your-application) + - [3. Cancel Download](#3-cancel-download) + - [4. Install Apk](#4-install-apk) + - [5. Pause Download](#5-pause-download) + - [6. Continue Download](#6-continue-download) + - [7. Get the last upgrade id](#7-get-the-last-upgrade-id) + - [8. Get the download status from id](#8-get-the-download-status-from-id) + - [9. Increment Upgrade](#9-increment-upgrade) + - [10. Hot Upgrade](#10-hot-upgrade) + - [Android Platform Notification Bar](#android-platform-notification-bar) + - [IOS Platform](#ios-platform) + - [1.Go to the AppStore Upgrade](#1go-to-the-appstore-upgrade) + - [2.Get the last version form AppStore](#2get-the-last-version-form-appstore) + - [LICENSE](#license) + + +## Getting Started + +### 1. Use Plugin: +- add this code in `pubspec.yaml` + +```yaml +dependencies: + r_upgrade: last version +``` + +### 2. Upgrade from your website ( Android or IOS ) +```dart + void upgradeFromUrl()async{ + bool isSuccess =await RUpgrade.upgradeFromUrl( + 'https://www.google.com/', + ); + print(isSuccess); + } +``` + +## Android Platform + +### 1.Get android store list. +```dart + void getAndroidStores() async { + final stores = await RUpgrade.androidStores; + } +``` + +### 2.Get version from android store. +```dart + void getVersionName() async { + final versionName = await RUpgrade.getVersionFromAndroidStore(AndroidStore.GOOGLE_PLAY); + } +``` + +### 3. App upgrade from store. +```dart + void upgradeFromAndroidStore(){ + bool isSuccess = await RUpgrade.upgradeFromAndroidStore(AndroidStore.GOOGLE_PLAY); + print('${isSuccess?'jump success':'jump error'}'); + } +``` + +### 4. App upgrade from download link. + +> make sure your application had this permission and request dynamic permission. + +```xml + + + + + + + +``` + +#### 1. Add Upgrade Download Listener +```dart +RUpgrade.stream.listen((DownloadInfo info){ + ///... +}); +``` +info: + +| param | desc | +| - | - | +| (int) id | download id | +| (int) max_length | download max bytes length (bytes) | +| (int) current_length | download current bytes length (bytes) | +| (double) percent | download percent 0-100 | +| (double) planTime | download plan time /s (X.toStringAsFixed(0)) | +| (String) path | download file path | +| (double) speed | download speed kb/s | +| (DownloadStatus) status | download status
`STATUS_PAUSED`
`STATUS_PENDING`
`STATUS_RUNNING`
`STATUS_SUCCESSFUL`
`STATUS_FAILED`
`STATUS_CANCEL`| + +#### 2. Upgrade your application +This upgrade have two part. +`useDownloadManager`: +- `true`: Use system `DownloadManager`to download + - advantage:Simple, use system. + - Inferiority:can not use http download , can not click the notification pause downloading, can not pause and continue download by network status etc... + - support: `RUpgrade.stream`、`install`、`cancel` +- `false`: Use `Service` download(default use) + - advantage:Power, support http/https download, support auto pause and continue download by network status etc.. + - Inferiority:No bugs found yet. If you find a bug, you are welcome to issue + - support: `RUpgrade.stream`、`install`、`cancel` +```dart + // [installType] downloaded finish will use install type to install apk. + // [apkName] apk name (such as `release.apk`) + // [notificationVisibility] notification visibility. + // [notificationStyle] download notification show style about content text, only support [useDownloadManager]==false. + // [useDownloadManager] if true will use DownloadManager,false will use my service , + // if true will no use [pause] , [upgradeWithId] , [getDownloadStatus] , [getLastUpgradedId] methods. + // [upgradeFlavor] you can use [RUpgradeFlavor.normal] , [RUpgradeFlavor.hotUpgrade] , [RUpgradeFlavor.incrementUpgrade] flavor + void upgrade() async { + int id = await RUpgrade.upgrade( + 'https://raw.githubusercontent.com/rhymelph/r_upgrade/master/apk/app-release.apk', + apkName: 'app-release.apk', installType: RUpgradeInstallType.normal,); + } +``` +New upgraded flavor:(no support use DownloadManager) +```dart +enum RUpgradeFlavor { + normal, // full upgrade + hotUpgrade, // hot upgrade + incrementUpgrade, // increment upgrade +} +``` + +#### 3. Cancel Download +```dart + void cancel() async { + bool isSuccess=await RUpgrade.cancel(id); + } +``` + +#### 4. Install Apk + +- use download id install +```dart + void install() async { + bool isSuccess=await RUpgrade.install(id); + } +``` +- use file path install +```dart + void installByPath(String path) async { + bool isSuccess=await RUpgrade.installByPath(path); + } +``` +- install type +```dart +/// [RUpgrade.upgradeWithId]、[RUpgrade.upgrade]、[RUpgrade.install]、[RUpgrade.installByPath] +enum RUpgradeInstallType { + normal,//normal install + silent,//silent install + none,// not install +} +``` + +#### 5. Pause Download +```dart + void pause() async { + bool isSuccess=await RUpgrade.pause(id); + } +``` + +#### 6. Continue Download +```dart + void pause() async { + bool isSuccess=await RUpgrade.upgradeWithId(id); + /// return true. + /// * if download status is [STATUS_PAUSED] or [STATUS_FAILED] or [STATUS_CANCEL], will restart running. + /// * if download status is [STATUS_RUNNING] or [STATUS_PENDING], nothing happened. + /// * if download status is [STATUS_SUCCESSFUL] , will install apk. + /// + /// return false. + /// * if not found the id , will return [false]. + } +``` + +#### 7. Get the last upgrade id +```dart + void getLastUpgradeId() async { + int id = await RUpgrade.getLastUpgradedId(); + } +``` + +#### 8. Get the download status from id +```dart + void getDownloadStatus()async{ + DownloadStatus status = await RUpgrade.getDownloadStatus(id); + } +``` +#### 9. Increment Upgrade +- 1.Download [bsdiff](https://github.com/rhymelph/r_upgrade/releases/download/v0.3.0/bsdiff) to local. +- 2.Prepare two installation packages, one is the one to be upgraded( old.apk ), an installation package that you need to update( new.apk ) +- 3.Switch to the 'bsdiff' directory downloaded above on the command line, and run the command`./bsdiff old.apk new.apk increment.patch` +- 4.Put the` increment.patch `Upload to server +- 5.use `RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)`download file +- 6.use `RUpgrade.install(id)` install apk. + +The code is as follows: +```dart + int id; + void incrementUpgrade(){ + id = await RUpgrade.upgrade( + 'https://mydata-1252536312.cos.ap-guangzhou.myqcloud.com/r_upgrade.patch', + fileName: 'r_upgrade.patch', + useDownloadManager: false, + installType: RUpgradeInstallType.none, + upgradeFlavor: RUpgradeFlavor.incrementUpgrade, + ); + } + + void install(){ + try { + await RUpgrade.install(id); + } catch (e) { + _state.currentState + .showSnackBar(SnackBar(content: Text('failure!'))); + } + } +``` + +#### 10. Hot Upgrade +- you can use this id to hot upgrade,but download file is zip. include three file [isolate_snapshot_data]、[kernel_blob.bin]、[vm_snapshot_data].Your can use `flutter build bundle` generate. +``` + flutter build bundle +``` + +- generate file path form ./build/flutter_assets and packaged into zip. + +``` +|- AssetManifest.json +|- FontManifest.json +|- fonts + |- ... +|- isolate_snapshot_data * +|- kernel-blob.bin * +|- LICENSE +|- packages + |- ... +|- vm_snapshot_data * +``` + +- use `RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`download file. +- download complete you can use download `id` to hot upgrade + +```dart + bool isSuccess = await RUpgrade.install(id); + if (isSuccess) { + _state.currentState + .showSnackBar(SnackBar(content: Text('Hot update succeeded, exit the application after 3S, please enter again'))); + Future.delayed(Duration(seconds: 3)).then((_){ + SystemNavigator.pop(animated: true); + }); + }else{ + _state.currentState + .showSnackBar(SnackBar(content: Text('Hot update failed, please wait for update package download to complete'))); + } +``` +> At present, the hot update is still in the testing stage, only supporting the change of the flutter code, not supporting the resource file, etc. the author of the plug-in is not responsible for all the consequences caused by the hot update, and the user is responsible for it. + +## Android Platform Notification Bar +If you want to customize the content displayed in the download notification bar, you can do so, modify or add files `project/android/app/main/res/values/r_upgrade_value.xml`,add the following code +```xml + + + %.0f kb/s + %.0fs left + Download finished + Download paused + Download failed + +``` +And then.When you use `upgrade` method,you should set the `notificationStyle` param. +```dart +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, // 100kb/s 1s left + planTimeAndSpeech, // 1s left 100kb/s + speech,// 100kb/s + planTime, // 1s left + none, // +} +``` + +## IOS Platform + +### 1.Go to the AppStore Upgrade +```dart + void upgradeFromAppStore() async { + bool isSuccess =await RUpgrade.upgradeFromAppStore( + 'your AppId',//such as:WeChat AppId:414478124 + false + ); + print(isSuccess); + } +``` + +### 2.Get the last version form AppStore +```dart + void getVersionFromAppStore() async { + String versionName = await RUpgrade.getVersionFromAppStore( + 'your AppId',//such as:WeChat AppId:414478124 + false + ); + print(versionName); + } +``` + +## LICENSE + Copyright 2021 rhymelph + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/modules/ability/r_upgrade-0.4.2/README_CN.md b/modules/ability/r_upgrade-0.4.2/README_CN.md new file mode 100644 index 00000000..9d0c8d17 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/README_CN.md @@ -0,0 +1,367 @@ +# r_upgrade +[![pub package](https://img.shields.io/pub/v/r_upgrade.svg)](https://pub.dartlang.org/packages/r_upgrade) + +![](screen/r_upgrade.png) + +Android和IOS的升级应用插件==Flutter应用升级插件 + +- [✔] 跳转链接方式升级 +- [✔] `Android`跳转到应用商店升级 +- [✔] `Android`获取已安装的应用商店列表 +- [✔] `Android`获取应用商店版本号(目前仅支持GooglePlay、小米、应用宝) +- [✔] `Android`使用下载链接下载APK + - [✔] 监听下载信息 + - [✔] 取消/暂停/继续下载 + - [✔] 根据ID安装应用 + - [✔] 根据ID获取下载状态 + - [✔] 获取最后一次下载ID(根据版本名和版本号) + - [✔] 修改通知栏显示的信息 +- [✔] `Android`热更新 +- [✔] `Android`增量升级 +- [✔] `Android`普通安装,静默安装 +- [✔] `IOS`根据APPID跳转AppStore升级 +- [✔] `IOS`根据APPID获取AppStore当前上架版本 + +# 外卖红包🧧 +微信扫一扫下方的二维码关注公众号,领取外卖红包,点外卖最高可免单!(希望点外卖的时候都能领取一下,我会得到几毛钱的收益,也是对这个插件的支持,非常感谢!) + +![](screen/extension.png) + +# 目录 + +- [r_upgrade](#r_upgrade) +- [外卖红包🧧](#外卖红包) +- [目录](#目录) + - [开始吧](#开始吧) + - [1.使用插件:](#1使用插件) + - [2.使用打开链接的方式进行更新(`Android`和`IOS`通用)](#2使用打开链接的方式进行更新android和ios通用) + - [Android平台](#android平台) + - [1.获取应用商店列表](#1获取应用商店列表) + - [2.获取对应的应用商店上架版本号](#2获取对应的应用商店上架版本号) + - [3.跳转到应用商店升级](#3跳转到应用商店升级) + - [4.通过下载链接进行apk下载](#4通过下载链接进行apk下载) + - [1.添加升级下载进度监听](#1添加升级下载进度监听) + - [2.立即升级你的应用](#2立即升级你的应用) + - [3. 取消下载](#3-取消下载) + - [4. 安装应用](#4-安装应用) + - [5. 暂停下载](#5-暂停下载) + - [6. 继续下载](#6-继续下载) + - [7. 获取最后一次下载的ID](#7-获取最后一次下载的id) + - [8. 获取ID对应的下载状态](#8-获取id对应的下载状态) + - [9. 增量升级](#9-增量升级) + - [10. 热更新](#10-热更新) + - [安卓平台通知栏](#安卓平台通知栏) + - [IOS平台](#ios平台) + - [1.跳转到AppStore进行更新](#1跳转到appstore进行更新) + - [2.获取AppStore中你的应用最后的版本名](#2获取appstore中你的应用最后的版本名) + - [LICENSE](#license) + + +## 开始吧 + +### 1.使用插件: + +在`pubspec.yaml`文件添加下面代码 +```yaml +dependencies: + r_upgrade: last version +``` + +### 2.使用打开链接的方式进行更新(`Android`和`IOS`通用) +```dart + void upgradeFromUrl()async{ + bool isSuccess =await RUpgrade.upgradeFromUrl( + 'https://www.baidu.com/', + ); + print(isSuccess); + } +``` + +## Android平台 + +### 1.获取应用商店列表 +```dart + void getAndroidStores() async { + final stores = await RUpgrade.androidStores; + } +``` + +### 2.获取对应的应用商店上架版本号 +```dart + void getVersionName() async { + final versionName = await RUpgrade.getVersionFromAndroidStore(AndroidStore.TENCENT); + } +``` + +### 3.跳转到应用商店升级 +```dart + void upgradeFromAndroidStore(){ + bool isSuccess = await RUpgrade.upgradeFromAndroidStore(AndroidStore.BAIDU); + print('${isSuccess?'跳转成功':'跳转失败'}'); + } +``` + +### 4.通过下载链接进行apk下载 + +> 注意,在Android应用中,请确保`AndroidManifest.xml`中声明以下权限,并在6.0系统上进行动态授权,不然会调用升级方法将抛出权限异常 +```xml + + + + + + + + +``` + +#### 1.添加升级下载进度监听 +```dart +RUpgrade.stream.listen((DownloadInfo info){ + ///... +}); +``` +info 里包含的信息如下: + +| 字段 | 含义 | +| - | - | +| (int) id | 当前下载任务的id | +| (int) max_length | 所需下载的总大小 (bytes) | +| (int) current_length | 当前已下载的大小 (bytes) | +| (double) percent | 当前下载进度(0-100) | +| (double) planTime | 计划下载完成所需时间/秒 (需要.toStringAsFixed(0)) | +| (String) path | 当前下载的文件路径 | +| (double) speed | 当前下载的速度kb/s | +| (DownloadStatus) status | 当前下载状态
`STATUS_PAUSED` 下载已暂停
`STATUS_PENDING`等待下载
`STATUS_RUNNING`下载中
`STATUS_SUCCESSFUL`下载成功
`STATUS_FAILED`下载失败
`STATUS_CANCEL`下载取消| + +注意: 部分http下载链接可能返回 `max_length = -1`,请自行判断 + +#### 2.立即升级你的应用 +目前分为两部分 +`useDownloadManager`: +- `true`: 调用系统的`DownloadManager`进行下载 + - 优势:接入简单,无需担心操作,下载全由系统管理 + - 劣势:无法使用http方式进行下载,无法在下载过程中点击通知栏进行暂停,无法根据有无网络进行暂停和继续下载,适配机型问题等 + - 支持的方法:`RUpgrade.stream`、`install`、`cancel` +- `false`: 调用`Service`进行下载(默认使用) + - 优势:功能较全,支持http/https下载,支持网络断开后自动暂停下载,连接上后继续下载,支持断点续传,支持查询最后一次下载等 + - 劣势:暂无发现,如果发现bug欢迎提issue. + - 支持的方法:默认全部 +```dart + // [installType] 下载完成后的安装类型,详情可以看[RUpgradeInstallType] + // [apkName] 安装包的名字(需要包含.apk) + // [notificationVisibility] 通知栏显示方式 + // [useDownloadManager] 是否使用DownloadManager,默认不使用(DownloadManager不支持http下载,下载手动暂停,断点续传等,不建议使用) + // [upgradeFlavor] 升级的口味,默认全量升级(默认) + void upgrade() async { + int id = await RUpgrade.upgrade( + 'https://raw.githubusercontent.com/rhymelph/r_upgrade/master/apk/app-release.apk', + apkName: 'app-release.apk',installType: RUpgradeInstallType.normal,); + } +``` +新增升级的口味:(不支持使用DownloadManager下载) +```dart +enum RUpgradeFlavor { + normal, // 全量升级 + hotUpgrade, // 热更新 + incrementUpgrade, // 增量升级 +} +``` + +#### 3. 取消下载 +```dart + void cancel() async { + bool isSuccess=await RUpgrade.cancel(id); + } +``` + +#### 4. 安装应用 + +- 使用下载的id进行安装应用 +```dart + void install() async { + bool isSuccess=await RUpgrade.install(id); + } +``` +- 使用文件路径进行安装应用 +```dart + void installByPath(String path) async { + bool isSuccess=await RUpgrade.installByPath(path); + } +``` +- 新增安装类型 +```dart +/// [RUpgrade.upgradeWithId]、[RUpgrade.upgrade]、[RUpgrade.install]、[RUpgrade.installByPath] +enum RUpgradeInstallType { + normal,//普通安装 + silent,//静默安装 + none,// 不进行安装 +} +``` + +#### 5. 暂停下载 +```dart + void pause() async { + bool isSuccess=await RUpgrade.pause(id); + } +``` + +#### 6. 继续下载 +```dart + void pause() async { + bool isSuccess=await RUpgrade.upgradeWithId(id); + // 返回 false 即表示从来不存在此ID + // 返回 true + // 调用此方法前状态为 [STATUS_PAUSED]、[STATUS_FAILED]、[STATUS_CANCEL],将继续下载 + // 调用此方法前状态为 [STATUS_RUNNING]、[STATUS_PENDING],不会发生任何变化 + // 调用此方法前状态为 [STATUS_SUCCESSFUL],将会安装应用 + // 当文件被删除时,重新下载 + } +``` + +#### 7. 获取最后一次下载的ID +该方法只会寻找当前应用版本名和版本号下下载过的ID +```dart + void getLastUpgradeId() async { + int id = await RUpgrade.getLastUpgradedId(); + } +``` + +#### 8. 获取ID对应的下载状态 +```dart + void getDownloadStatus()async{ + DownloadStatus status = await RUpgrade.getDownloadStatus(id); + } +``` + +#### 9. 增量升级 +- 1.下载[bsdiff](https://github.com/rhymelph/r_upgrade/releases/download/v0.3.0/bsdiff)工具到本地 +- 2.准备两个安装包,一个是即将需要升级的安装包(old.apk)、一个是你需要更新的安装包(new.apk) +- 3.在命令行切换到上面下载的`bsdiff`目录下,运行命令`./bsdiff old.apk new.apk increment.patch` +- 4.将上面生成的`increment.patch`上传到服务器 +- 5.调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)`方法进行下载,即可 +- 6.调用`RUpgrade.install(id)`进行安装 + +代码如下: +```dart + int id; + void incrementUpgrade(){ + id = await RUpgrade.upgrade( + 'https://mydata-1252536312.cos.ap-guangzhou.myqcloud.com/r_upgrade.patch', + fileName: 'r_upgrade.patch', + useDownloadManager: false, + installType: RUpgradeInstallType.none, + upgradeFlavor: RUpgradeFlavor.incrementUpgrade, + ); + } + + void install(){ + try { + await RUpgrade.install(id); + } catch (e) { + _state.currentState + .showSnackBar(SnackBar(content: Text('增量更新失败!'))); + } + } +``` + +#### 10. 热更新 +- 你可以使用升级返回的`id`进行热更新,下载的文件需要将新版本生成的`isolate_snapshot_data`、`kernel_blob.bin`、`vm_snapshot_data`打进zip文件中下载 +步骤: + - 运行 `flutter clean` 清理build文件 + - 运行 `flutter build bundle` 生成需要的产物,下面标记星号为必须文件 +``` +|- AssetManifest.json +|- FontManifest.json +|- fonts + |- ... +|- isolate_snapshot_data * +|- kernel-blob.bin * +|- LICENSE +|- packages + |- ... +|- vm_snapshot_data * +``` + - 将标记星号的文件打包成zip文件,上传到服务器 + - 调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`方法进行下载 + - 下载完成后,将上面获取到的id进行热更新,调用如下代码 + +```dart + bool isSuccess = await RUpgrade.install(id); + if (isSuccess) { + _state.currentState + .showSnackBar(SnackBar(content: Text('热更新成功,3s后退出应用,请重新进入'))); + Future.delayed(Duration(seconds: 3)).then((_){ + SystemNavigator.pop(animated: true); + }); + }else{ + _state.currentState + .showSnackBar(SnackBar(content: Text('热更新失败,请等待更新包下载完成'))); + } +``` + - 重启应用即可 + +> 注意:目前热更新尚处于测试阶段,只支持Flutter代码的变更,不支持资源文件等,热更新造成的一切的后果插件的作者概不负责,由使用者承担。 + + +## 安卓平台通知栏 + +如果你想自定义通知栏显示的内容, 可以这样做, 修改或添加文件路径为`project/android/app/main/res/values/r_upgrade_value.xml`,添加下面代码 +```xml + + + %.2fkb/s + 预计%.0f秒后完成 + 下载完成 + 下载被暂停 + 下载失败 + +``` +然后.当你使用`upgrade`方法时,你应该设置参数`notificationStyle`,默认为显示预计完成时间. +```dart +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, // 100kb/s 预计1秒后完成 + planTimeAndSpeech, // 预计1秒后完成 100kb/s + speech,// 100kb/s + planTime, // 预计1秒后完成 + none, // +} +``` + +## IOS平台 + +### 1.跳转到AppStore进行更新 +```dart + void upgradeFromAppStore() async { + bool isSuccess =await RUpgrade.upgradeFromAppStore( + '您的AppId',//例如:微信的AppId:414478124 + ); + print(isSuccess); + } +``` + +### 2.获取AppStore中你的应用最后的版本名 +```dart + void getVersionFromAppStore() async { + String versionName = await RUpgrade.getVersionFromAppStore( + '您的AppId',//例如:微信的AppId:414478124 + ); + print(versionName); + } +``` + +## LICENSE + Copyright 2021 rhymelph + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/_config.yml b/modules/ability/r_upgrade-0.4.2/_config.yml new file mode 100644 index 00000000..c4192631 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/analysis_options.yaml b/modules/ability/r_upgrade-0.4.2/analysis_options.yaml new file mode 100644 index 00000000..e69de29b diff --git a/modules/ability/r_upgrade-0.4.2/android/.gitignore b/modules/ability/r_upgrade-0.4.2/android/.gitignore new file mode 100644 index 00000000..c6cbe562 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/modules/ability/r_upgrade-0.4.2/android/build.gradle b/modules/ability/r_upgrade-0.4.2/android/build.gradle new file mode 100644 index 00000000..048c5d94 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/build.gradle @@ -0,0 +1,44 @@ +group 'com.example.r_upgrade' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + flatDir{ + dirs project(':r_upgrade').file('libs') + } + } +} + +apply plugin: 'com.android.library' + +android { + namespace "com.example.r_upgrade" + compileSdkVersion 33 + + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} + +dependencies { + implementation 'androidx.core:core:1.0.2' + implementation 'org.jsoup:jsoup:1.14.3' + implementation(name:"r_upgrade_lib",ext:"aar") +} diff --git a/modules/ability/r_upgrade-0.4.2/android/gradle.properties b/modules/ability/r_upgrade-0.4.2/android/gradle.properties new file mode 100644 index 00000000..755300e3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M + +android.useAndroidX=true +android.enableJetifier=true diff --git a/modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar b/modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar new file mode 100644 index 00000000..2eef399f Binary files /dev/null and b/modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar differ diff --git a/modules/ability/r_upgrade-0.4.2/android/settings.gradle b/modules/ability/r_upgrade-0.4.2/android/settings.gradle new file mode 100644 index 00000000..94542efb --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'r_upgrade' diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/AndroidManifest.xml b/modules/ability/r_upgrade-0.4.2/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..3552ee56 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java new file mode 100644 index 00000000..50ecd2b1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java @@ -0,0 +1,6 @@ +package com.example.r_upgrade; + +import androidx.core.content.FileProvider; + +public class RUpgradeFileProvider extends FileProvider { +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java new file mode 100644 index 00000000..93e056c2 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java @@ -0,0 +1,105 @@ +package com.example.r_upgrade; + +import android.app.Activity; +import android.content.Intent; + +import androidx.annotation.NonNull; + +import com.example.r_upgrade.common.DownloadPermissions; +import com.example.r_upgrade.common.manager.UpgradeManager; +import com.example.r_upgrade.common.UpgradeService; +import com.example.r_upgrade.method.RUpgradeMethodCallHandler; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.PluginRegistry; +//import io.flutter.plugin.common.PluginRegistry.Registrar; + +/** + * RUpgradePlugin + */ +public class RUpgradePlugin implements FlutterPlugin, ActivityAware { + private static final String PLUGIN_METHOD_NAME = "com.rhyme/r_upgrade_method"; + + private MethodChannel _channel; + private UpgradeManager upgradeManager; + private FlutterPluginBinding flutterPluginBinding; + + public RUpgradePlugin() { + + } + + private RUpgradePlugin(Activity activity, BinaryMessenger messenger, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + initPlugin(activity, messenger, permissionsRegistry); + } + + private void initPlugin(Activity activity, BinaryMessenger messenger, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + _channel = new MethodChannel(messenger, PLUGIN_METHOD_NAME); + upgradeManager = new UpgradeManager(activity, _channel, new DownloadPermissions(), permissionsRegistry); + _channel.setMethodCallHandler(new RUpgradeMethodCallHandler(upgradeManager)); + } + +// /** +// * Plugin registration. +// */ +// public static void registerWith(final Registrar registrar) { +// +// new RUpgradePlugin(registrar.activity(), registrar.messenger(), new DownloadPermissions.PermissionsRegistry() { +// @Override +// public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { +// registrar.addRequestPermissionsResultListener(handler); +// } +// }); +// } + + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + this.flutterPluginBinding = binding; + + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + onDetachedFromActivity(); + flutterPluginBinding = null; + } + + + @Override + public void onAttachedToActivity(@NonNull final ActivityPluginBinding binding) { + initPlugin(binding.getActivity(), flutterPluginBinding.getBinaryMessenger(), new DownloadPermissions.PermissionsRegistry() { + @Override + public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { + binding.addRequestPermissionsResultListener(handler); + } + }); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); + } + + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } + + @Override + public void onDetachedFromActivity() { + Intent intent = new Intent(flutterPluginBinding.getApplicationContext(), UpgradeService.class); + flutterPluginBinding.getApplicationContext().stopService(intent); + if (upgradeManager != null) { + upgradeManager.dispose(); + upgradeManager = null; + } + if (_channel != null) { + _channel.setMethodCallHandler(null); + _channel = null; + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java new file mode 100644 index 00000000..dfaaae42 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java @@ -0,0 +1,139 @@ +package com.example.r_upgrade.common; + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; + +import androidx.annotation.RequiresApi; +import androidx.annotation.VisibleForTesting; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import io.flutter.plugin.common.PluginRegistry; + +public class DownloadPermissions { + public interface PermissionsRegistry { + void addListener(PluginRegistry.RequestPermissionsResultListener handler); + } + + public interface ResultCallback { + void onResult(String errorCode, String errorDescription); + } + + private static final int STORAGE_REQUEST_ID = 9790; + private boolean ongoing = false; + + public void requestPermissions( + Activity activity, + PermissionsRegistry permissionsRegistry, + Integer notificationVisibility, + final ResultCallback callback) { + + if (Build.VERSION.SDK_INT >= 33) { + if (ongoing) { + callback.onResult("downloadPermission", "Notification permission request ongoing"); + } + if (notificationVisibility != 2&&!hasNotificationPermission(activity)) { + permissionsRegistry.addListener( + new StorageRequestPermissionsListener(new ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + ongoing = false; + callback.onResult(errorCode, errorDescription); + } + })); + ongoing = true; + ActivityCompat.requestPermissions( + activity, + new String[]{Manifest.permission.POST_NOTIFICATIONS}, + STORAGE_REQUEST_ID); + } else { + // Permissions already exist. Call the callback with success. + callback.onResult(null, null); + } + } else if (Build.VERSION.SDK_INT < 30 && (!hasReadStoragePermission(activity) || !hasWritePermission(activity))) { + if (ongoing) { + callback.onResult("downloadPermission", "Read/Write External Storage permission request ongoing"); + } + permissionsRegistry.addListener( + new StorageRequestPermissionsListener(new ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + ongoing = false; + callback.onResult(errorCode, errorDescription); + } + })); + ongoing = true; + ActivityCompat.requestPermissions( + activity, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, + STORAGE_REQUEST_ID); + } else { + // Permissions already exist. Call the callback with success. + callback.onResult(null, null); + } + } + + @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) + private boolean hasNotificationPermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasReadStoragePermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasWritePermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; + } + + @VisibleForTesting + public static final class StorageRequestPermissionsListener + implements PluginRegistry.RequestPermissionsResultListener { + + // There's no way to unregister permission listeners in the v1 embedding, so we'll be called + // duplicate times in cases where the user denies and then grants a permission. Keep track of if + // we've responded before and bail out of handling the callback manually if this is a repeat + // call. + boolean alreadyCalled = false; + + final ResultCallback callback; + + @VisibleForTesting + StorageRequestPermissionsListener(ResultCallback callback) { + this.callback = callback; + } + + @Override + public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) { + if (alreadyCalled || id != STORAGE_REQUEST_ID) { + return false; + } + if (Build.VERSION.SDK_INT >= 33) { + if (grantResults.length != 1) return false; + alreadyCalled = true; + + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("downloadPermission", "Notification permission not granted"); + } else { + callback.onResult(null, null); + } + return true; + } else { + if (grantResults.length != 2) return false; + alreadyCalled = true; + + if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("downloadPermission", "Read/Write External Storage permission not granted"); + } else { + callback.onResult(null, null); + } + return true; + } + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java new file mode 100644 index 00000000..d374f7e9 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java @@ -0,0 +1,24 @@ +package com.example.r_upgrade.common; + +public enum DownloadStatus { + STATUS_PAUSED(0), + STATUS_PENDING(1), + STATUS_RUNNING(2), + STATUS_SUCCESSFUL(3), + STATUS_FAILED(4), + STATUS_CANCEL(5); + + private int value; + + DownloadStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java new file mode 100644 index 00000000..b986b873 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java @@ -0,0 +1,27 @@ +package com.example.r_upgrade.common; + +import android.util.Log; + +public class RUpgradeLogger { + private static RUpgradeLogger _logger; + + public static RUpgradeLogger get() { + if (_logger == null) { + _logger = new RUpgradeLogger(); + } + return _logger; + } + + private boolean isDebug = true; + + + public void setDebug(boolean isDebug) { + this.isDebug = isDebug; + } + + public void d(String tag, String content) { + if (isDebug) { + Log.d(tag, content); + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java new file mode 100644 index 00000000..2a9d979a --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common; + + +import java.util.HashMap; +import java.util.Map; + +public class ResultMap { + private static ResultMap instance; + + private final Map map; + + private ResultMap() { + this.map = new HashMap(); + } + + public static ResultMap getInstance() { + if (instance == null) { + synchronized (ResultMap.class) { + if (instance == null) { + instance = new ResultMap(); + } + } + } + return instance; + } + + public ResultMap pubClear(String key, Object value) { + map.clear(); + map.put(key, value); + return instance; + } + + + public ResultMap put(String key, Object value) { + map.put(key, value); + return instance; + } + + public Map getMap(){ + return map; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java new file mode 100644 index 00000000..0ee09ba3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java @@ -0,0 +1,143 @@ +package com.example.r_upgrade.common; + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +import com.example.r_upgrade.R; +import com.example.r_upgrade.common.manager.UpgradeManager; + +public class UpgradeNotification { + public static final String TAG = "r_upgrade.Notification"; + + private static String CHANNEL_NAME; + + public static void createNotification(Context context, int id, String title,boolean indeterminate, Double percent, String contentText, int status) { + if (CHANNEL_NAME == null) { + try { + CHANNEL_NAME = context.getPackageName() + "_notification"; + } catch (Exception e) { + e.printStackTrace(); + CHANNEL_NAME = "r_upgrade_notification"; + } + } + if (status == DownloadStatus.STATUS_CANCEL.getValue()) { + removeNotification(context, id); + return; + } + Notification notification; + if (status == DownloadStatus.STATUS_RUNNING.getValue()) { + Intent pauseIntent = new Intent(); + pauseIntent.setAction(UpgradeService.RECEIVER_PAUSE); + pauseIntent.putExtra(UpgradeManager.PARAMS_ID, id); + pauseIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + + PendingIntent pausePendingIntent = + PendingIntent.getBroadcast(context, 0, pauseIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, pauseIntent, PendingIntent.FLAG_IMMUTABLE); + int current_length = percent.intValue(); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentText(indeterminate ? "" : contentText) + .setContentIntent(pausePendingIntent) + .setProgress(indeterminate ? 0 : 100, indeterminate ? 0 : current_length, indeterminate) + .build(); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + Intent installIntent = new Intent(); + installIntent.setAction(UpgradeManager.DOWNLOAD_INSTALL); + installIntent.putExtra(UpgradeService.DOWNLOAD_ID, id); + installIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent installPendingIntent = + PendingIntent.getBroadcast(context, 0, installIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, installIntent, PendingIntent.FLAG_IMMUTABLE); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(installPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_finish)) + .build(); + } else if (status == DownloadStatus.STATUS_PAUSED.getValue()) { + Intent reStartIntent = new Intent(); + reStartIntent.setAction(UpgradeService.RECEIVER_RESTART); + reStartIntent.putExtra(UpgradeManager.PARAMS_ID, id); + reStartIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent reStartPendingIntent = + PendingIntent.getBroadcast(context, 0, reStartIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, reStartIntent, PendingIntent.FLAG_IMMUTABLE); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(reStartPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_paused)) + .build(); + } else if (status == DownloadStatus.STATUS_FAILED.getValue()) { + Intent failedIntent = new Intent(); + failedIntent.setAction(UpgradeService.RECEIVER_RESTART); + failedIntent.putExtra(UpgradeManager.PARAMS_ID, id); + failedIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent reStartPendingIntent = + PendingIntent.getBroadcast(context, 0, failedIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, failedIntent, PendingIntent.FLAG_IMMUTABLE); + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(reStartPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_failed)) + .build(); + } else { + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setProgress(0, 0, true) + .build(); + } + NotificationManagerCompat compat = NotificationManagerCompat.from(context); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(createNotificationChannel()); + } + compat.notify(id, notification); + } + + private static int getPendingIntentFlag() { + int pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= 31) { + pendingFlag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; + } + return pendingFlag; + } + + public static void removeNotification(Context context, long id) { + NotificationManagerCompat compat = NotificationManagerCompat.from(context); + compat.cancel((int) id); + } + + @TargetApi(Build.VERSION_CODES.O) + private static NotificationChannel createNotificationChannel() { + String description = "Upgrade Application"; + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(CHANNEL_NAME, CHANNEL_NAME, importance); + channel.setDescription(description); + channel.enableVibration(false); + channel.setImportance(NotificationManager.IMPORTANCE_LOW); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + return channel; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java new file mode 100644 index 00000000..e0ce99fb --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java @@ -0,0 +1,31 @@ +package com.example.r_upgrade.common; + +import android.content.Context; + +import com.example.r_upgrade.R; + +public enum UpgradeNotificationStyle { + speechAndPlanTime, + planTimeAndSpeech, + speech, + planTime, + none; + + + public String getNotificationStyleString(Context context, double speech, double planTime) { + String speechString = context.getResources().getString(R.string.r_upgrade_download_speech, speech); + String planTimeString = context.getResources().getString(R.string.r_upgrade_download_planTime, planTime); + switch (this) { + case speech: + return speechString; + case planTime: + return planTimeString; + case planTimeAndSpeech: + return planTimeString + " " + speechString; + case speechAndPlanTime: + return speechString + " " + planTimeString; + } + return ""; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java new file mode 100644 index 00000000..8dd980e1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java @@ -0,0 +1,220 @@ +package com.example.r_upgrade.common; + +import android.content.ContentValues; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import androidx.annotation.Nullable; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + + +public class UpgradeSQLite extends SQLiteOpenHelper { + private static final String TAG = "r_upgrade.SQLite"; + private static final String DATABASE_NAME = "r_upgrade.db"; + private static final int DATABASE_VERSION = 2; + + private static UpgradeSQLite instance; + + public synchronized static UpgradeSQLite getInstance(Context context) { + if (instance == null) { + instance = new UpgradeSQLite(context); + } + return instance; + } + + public static final String VERSION_MANAGER = "version_manager"; + + public static final String ID = "id"; + public static final String URL = "url"; + public static final String APK_NAME = "apk_name"; + public static final String PATH = "path"; + + public static final String HEADER = "header"; + public static final String CURRENT_LENGTH = "current_length"; + public static final String MAX_LENGTH = "max_length"; + public static final String STATUS = "status"; + + public static final String VERSION_NAME = "version_name"; + public static final String VERSION_CODE = "version_code"; + public static final String UPGRADE_FLAVOR = "upgrade_flavor"; + public static final int UPGRADE_FLAVOR_Normal = 0; + public static final int UPGRADE_FLAVOR_HOT_UPDATE = 1; + public static final int UPGRADE_FLAVOR_INCREMENT = 2; + + private static final String DATABASE_CREATE = "create table if not exists " + VERSION_MANAGER + "(" + + ID + " integer primary key autoincrement," + + URL + " text," + + PATH + " text," + + APK_NAME + " text," + + HEADER + " text," + + CURRENT_LENGTH + " integer," + + MAX_LENGTH + " integer," + + STATUS + " integer," + + VERSION_NAME + " text," + + VERSION_CODE + " integer,"+ + UPGRADE_FLAVOR + " integer)"; + + public UpgradeSQLite(@Nullable Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(DATABASE_CREATE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + RUpgradeLogger.get().d(TAG, String.format(Locale.ENGLISH,"onUpgrade: oldVersion:%d , newVersion:%d", oldVersion, newVersion)); + if(oldVersion == 1){ + db.execSQL("delete from "+VERSION_MANAGER); + db.execSQL("alter table "+VERSION_MANAGER+" add column "+UPGRADE_FLAVOR+" integer"); + } + } + + public Integer queryIdByVersionNameAndVersionCode(String versionName, int versionCode) { + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + VERSION_NAME + "=?" + " and " + VERSION_CODE + "=? order by " + ID + " DESC LIMIT 1", new String[]{versionName, String + .valueOf(versionCode)}); + boolean canMoveNext = cursor.moveToNext(); + if (canMoveNext) { + int id = cursor.getInt(cursor.getColumnIndex(ID)); + RUpgradeLogger.get().d(TAG, "queryByVersionNameAndVersionCode: " + id); + cursor.close(); + return id; + } else { + cursor.close(); + return null; + } + } + + public Map queryById(long id) { + Map result = new HashMap<>(); + + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + ID + "=?", new String[]{String.valueOf(id)}); + boolean hasNext = cursor.moveToNext(); + if (hasNext) { + String path = cursor.getString(cursor.getColumnIndex(PATH)); + String url = cursor.getString(cursor.getColumnIndex(URL)); + String apkName = cursor.getString(cursor.getColumnIndex(APK_NAME)); + int status = cursor.getInt(cursor.getColumnIndex(STATUS)); + String header = cursor.getString(cursor.getColumnIndex(HEADER)); + int rUpgradeFlavor = cursor.getInt(cursor.getColumnIndex(UPGRADE_FLAVOR)); + result.put(PATH, path); + result.put(APK_NAME, apkName); + result.put(URL, url); + result.put(STATUS, status); + result.put(HEADER, header); + result.put(UPGRADE_FLAVOR, rUpgradeFlavor); + return result; + } else { + cursor.close(); + return null; + } + } + + + public Integer queryStatusById(int id) { + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + ID + "=?", new String[]{String.valueOf(id)}); + boolean canMoveNext = cursor.moveToNext(); + if (canMoveNext) { + int status = cursor.getInt(cursor.getColumnIndex(STATUS)); + cursor.close(); + return status; + } else { + cursor.close(); + return null; + } + } + + + //创建记录 + public long createRecord(Context context, String url, String apk_name, String header, int status, int upgradeFlavor) { + String versionName = ""; + int versionCode = 0; + try { + PackageManager manager = context.getPackageManager(); + PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); + versionName = info.versionName; + versionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(URL, url); + values.put(PATH, ""); + values.put(APK_NAME, apk_name); + values.put(HEADER, header); + values.put(CURRENT_LENGTH, 0); + values.put(MAX_LENGTH, 0); + values.put(STATUS, status); + values.put(VERSION_NAME, versionName); + values.put(VERSION_CODE, versionCode); + values.put(UPGRADE_FLAVOR, upgradeFlavor); + return writableDatabase.insert(VERSION_MANAGER, null, values); + } + + void update(long id, String url, String path, String apkName, String header, Long current_length, Long max_length, int status) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + if (current_length != null) { + values.put(CURRENT_LENGTH, current_length); + } + if (max_length != null) { + values.put(MAX_LENGTH, max_length); + } + if (url != null) { + values.put(URL, url); + } + + if (path != null) { + values.put(PATH, path); + } + + if (apkName != null) { + values.put(APK_NAME, apkName); + } + if (header != null) { + values.put(HEADER, header); + } + values.put(STATUS, status); + writableDatabase.update(VERSION_MANAGER, values, ID + "=?", new String[]{String.valueOf(id)}); + } + + void update(long id, Long current_length, Long max_length, int status) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + if (current_length != null) { + values.put(CURRENT_LENGTH, current_length); + } + if (max_length != null) { + values.put(MAX_LENGTH, max_length); + } + values.put(STATUS, status); + writableDatabase.update(VERSION_MANAGER, values, ID + "=?", new String[]{String.valueOf(id)}); + } + + void delete(long id) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + writableDatabase.delete(VERSION_MANAGER, ID + "=?", new String[]{String.valueOf(id)}); + } + + public void pauseDownloading() { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + writableDatabase.update(VERSION_MANAGER, values, STATUS + "=? or " + STATUS + "=?", new String[]{String.valueOf(DownloadStatus.STATUS_PENDING.getValue()), String.valueOf(DownloadStatus.STATUS_RUNNING.getValue()),}); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java new file mode 100644 index 00000000..54593028 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java @@ -0,0 +1,693 @@ +package com.example.r_upgrade.common; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.IBinder; + +import androidx.core.net.ConnectivityManagerCompat; + +import org.json.JSONObject; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.math.BigDecimal; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; + +import static com.example.r_upgrade.common.manager.UpgradeManager.DOWNLOAD_STATUS; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_APK_NAME; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_CURRENT_LENGTH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_ID; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_MAX_LENGTH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PACKAGE; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PATH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PERCENT; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PLAN_TIME; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_SPEED; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_STATUS; + +public class UpgradeService extends Service { + public static final String DOWNLOAD_ID = "download_id"; + public static final String DOWNLOAD_URL = "download_url"; + public static final String DOWNLOAD_Header = "download_header"; + public static final String DOWNLOAD_APK_NAME = "download_apkName"; + public static final String DOWNLOAD_RESTART = "download_restart"; + + + private static final String TAG = "r_upgrade.Service"; + private final Executor mExecutor = Executors.newSingleThreadExecutor(); + private UpgradeSQLite sqLite; + private UpgradeRunnable runnable; + private UpgradeService service; + private boolean isFirst = true; + + private final BroadcastReceiver actionReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String packageName = intent.getStringExtra(PARAMS_PACKAGE); + if (packageName == null || !packageName.equals(getPackageName())) { + return; + } + if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_CANCEL)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable.cancel(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_PAUSE)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable.pause(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_RESTART)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable = new UpgradeRunnable(true, (long) id, null, null, null, service, sqLite); + mExecutor.execute(runnable); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = ConnectivityManagerCompat.getNetworkInfoFromBroadcast(conMgr, intent); + handleNetworkChange(info != null && info.isConnected()); + } + } + }; + private ConnectivityManager.NetworkCallback networkCallback; + + public static final String RECEIVER_CANCEL = "com.example.r_upgrade.RECEIVER_CANCEL"; + public static final String RECEIVER_PAUSE = "com.example.r_upgrade.RECEIVER_PAUSE"; + public static final String RECEIVER_RESTART = "com.example.r_upgrade.RECEIVER_RESTART"; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + service = this; + sqLite = UpgradeSQLite.getInstance(this); + IntentFilter filter = new IntentFilter(); + filter.addAction(RECEIVER_CANCEL); + filter.addAction(RECEIVER_RESTART); + filter.addAction(RECEIVER_PAUSE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + networkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + super.onAvailable(network); + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = conMgr.getNetworkInfo(network); + handleNetworkChange(info != null && info.isConnected()); + } + + @Override + public void onLost(Network network) { + super.onLost(network); + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = conMgr.getNetworkInfo(network); + handleNetworkChange(info != null && info.isConnected()); + } + }; + conMgr.registerDefaultNetworkCallback(networkCallback); + } else { + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + } + registerReceiver(actionReceiver, filter); + + } + + private void handleNetworkChange(boolean isConnected) { + if (runnable == null || runnable.isFinish) { + return; + } + if (isConnected) { + RUpgradeLogger.get().d(TAG, "onReceive: 当前网络正在连接"); + if (isFirst) { + isFirst = false; + return; + } + long id = runnable.id; + runnable = new UpgradeRunnable(true, (long) id, runnable.url, runnable.header, runnable.apkName, service, sqLite); + mExecutor.execute(runnable); + } else { + if (isFirst) { + isFirst = false; + return; + } + runnable.handlerDownloadFinish(); + runnable.pause(-1); + isFirst = false; + RUpgradeLogger.get().d(TAG, "onReceive: 当前网络已断开"); + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent == null) return super.onStartCommand(null, flags, startId); + Bundle bundle = intent.getExtras(); + assert (bundle != null); + String url = bundle.getString(DOWNLOAD_URL); + int id = bundle.getInt(DOWNLOAD_ID); + + Map header; + if (bundle.get(DOWNLOAD_Header) != null && bundle.get(DOWNLOAD_Header) instanceof String) { + header = getMapForJson(bundle.getString(DOWNLOAD_Header)); + } else { + header = (Map) bundle.getSerializable(DOWNLOAD_Header); + } + String apkName = bundle.getString(DOWNLOAD_APK_NAME); + boolean isReStart = bundle.getBoolean(DOWNLOAD_RESTART); + + runnable = new UpgradeRunnable( + isReStart, + (long) id, + url, + header, + apkName, service, sqLite); + + mExecutor.execute(runnable); + + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + unregisterReceiver(actionReceiver); + if (runnable != null) { + runnable.handlerDownloadPause(); + } + super.onDestroy(); + } + + private static class UpgradeRunnable implements Runnable { + private String url; + private Long id; + private Map header; + private String apkName; + private UpgradeService upgradeService; + + private long maxLength = 0; + private long currentLength = 0; + private long lastCurrentLength = 0; + private long lastTime = System.currentTimeMillis(); + private File downloadFile = null; + private UpgradeSQLite sqLite; + private HttpURLConnection httpURLConnection; + private HttpsURLConnection httpsURLConnection; + + private Timer timer; + private boolean isRunning = true; + private boolean isReStart; + + private boolean isNewDownload; + + private boolean isFinish; + + UpgradeRunnable(boolean isReStart, Long id, String url, Map header, String apkName, UpgradeService upgradeService, UpgradeSQLite sqLite) { + this.id = id; + this.url = url; + this.header = header; + this.apkName = apkName == null ? "release.apk" : apkName; + this.upgradeService = upgradeService; + this.sqLite = sqLite; + this.isReStart = isReStart; + this.isFinish = false; + } + + /** + * cancel timer + */ + private void cancelTimer() { + if (timer != null) { + timer.cancel(); + } + } + + private void cancel(int id) { + if (isFinish) return; + if (this.id == id) { + cancelTimer(); + if (httpsURLConnection != null) { + httpsURLConnection.disconnect(); + } + if (httpURLConnection != null) { + httpURLConnection.disconnect(); + } + isRunning = false; + handlerDownloadCancel(); + boolean isSuccess = downloadFile.delete(); + RUpgradeLogger.get().d(TAG, "cancel: delete download file " + isSuccess); + + } + } + + private void pause(int id) { + if (isFinish) return; + + if (id == -1 || this.id == id) { + if (httpsURLConnection != null) { + httpsURLConnection.disconnect(); + } + if (httpURLConnection != null) { + httpURLConnection.disconnect(); + } + isRunning = false; + handlerDownloadPause(); + } + } + + private File getDownloadDirectory() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + return upgradeService.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); + } + return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + } + + private boolean handlerDownloadPending() { + if (isReStart) { + SQLiteDatabase readableDatabase = sqLite.getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + UpgradeSQLite.VERSION_MANAGER + " where " + UpgradeSQLite.ID + "=?", new String[]{String.valueOf(id)}); + boolean canMove = cursor.moveToNext(); + if (!canMove) { + // 重新下载 + File parentFile = getDownloadDirectory(); + if (!parentFile.exists()) { + parentFile.mkdir(); + } + downloadFile = new File(parentFile.getPath(), apkName); + JSONObject object = null; + if (header != null) { + object = new JSONObject(header); + } + //更新一条SQL + sqLite.update(id, url, downloadFile.getPath(), apkName, object == null ? "" : object.toString(), currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + cursor.close(); + return true; + } else { + boolean isNewDownload = false; + + //续传 + String path = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.PATH)); + downloadFile = new File(path); + //下载的文件已被删除 + if (!downloadFile.exists()) { + try { + boolean isSuccess = downloadFile.createNewFile(); + RUpgradeLogger.get().d(TAG, "handlerDownloadPending: download file create " + isSuccess); + } catch (IOException e) { + e.printStackTrace(); + } + currentLength = 0; + lastCurrentLength = currentLength; + isNewDownload = true; + } else { + currentLength = cursor.getLong(cursor.getColumnIndex(UpgradeSQLite.CURRENT_LENGTH)); + lastCurrentLength = currentLength; + maxLength = cursor.getLong(cursor.getColumnIndex(UpgradeSQLite.MAX_LENGTH)); + } + apkName = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.APK_NAME)); + url = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.URL)); + String header = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.HEADER)); + this.header = getMapForJson(header); + cursor.close(); + //更新一条SQL + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + + return isNewDownload; + } + } else { + // 重新下载 + File parentFile = getDownloadDirectory(); + downloadFile = new File(parentFile.getPath(), apkName); + JSONObject object = null; + if (header != null) { + object = new JSONObject(header); + } + //更新一条SQL + sqLite.update(id, url, downloadFile.getPath(), apkName, object == null ? "" : object.toString(), currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + return true; + } + } + + private void handlerDownloadRunning() { + try { + if (currentLength - lastCurrentLength > 0) { + double percent = new BigDecimal((currentLength * 1.0f / maxLength) * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + double speed = ((currentLength - lastCurrentLength) * 1000f / (System.currentTimeMillis() - lastTime)) / 1024; + //计划完成时间 + double planTime = (maxLength - currentLength) / (speed * 1024f); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_CURRENT_LENGTH, currentLength); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_RUNNING.getValue()); + intent.putExtra(PARAMS_PERCENT, percent); + intent.putExtra(PARAMS_MAX_LENGTH, maxLength); + intent.putExtra(PARAMS_SPEED, speed); + intent.putExtra(PARAMS_PLAN_TIME, planTime); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_RUNNING.getValue()); + RUpgradeLogger.get().d(TAG, "handlerDownloadRunning: running queryTask: 下载中\n" + + "url: " + + url + + "\n============>" + + "total:" + + maxLength + + "," + + "progress:" + + currentLength + + "," + + String.format("%.2f", percent) + + "% , " + + String.format("%.2f", speed) + + "kb/s , " + + "预计:" + + String.format("%.0f", planTime) + + "s"); + lastCurrentLength = currentLength; + lastTime = System.currentTimeMillis(); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + private void handlerDownloadCancel() { + RUpgradeLogger.get().d(TAG, "handlerDownloadCancel: "); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_CANCEL.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.delete(id); + } + + private void handlerDownloadPause() { + RUpgradeLogger.get().d(TAG, "handlerDownloadPause: downloadFile:" + downloadFile); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + if (downloadFile != null) { + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + } + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + if (upgradeService != null) { + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + } + if (sqLite != null) { + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_PAUSED.getValue()); + } + } + + private void handlerDownloadFinish() { + RUpgradeLogger.get().d(TAG, "handlerDownloadFinish: finish"); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.update(id, null, null, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + lastCurrentLength = 0; + isFinish = true; + } + + private void handlerDownloadFailure() { + RUpgradeLogger.get().d(TAG, "handlerDownloadFailure: failure"); + Intent intent = new Intent(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_FAILED.getValue()); + sqLite.update(id, null, null, DownloadStatus.STATUS_FAILED.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + } + + private long getMaxLength(HttpURLConnection connection) { + long maxLength = connection.getContentLength(); + if (maxLength < 0) { + List values = connection.getHeaderFields().get("content-Length"); + if (values != null && !values.isEmpty()) { + String sLength = values.get(0); + if (sLength != null) { + maxLength = Long.parseLong(sLength, 10); + } + } + } + return maxLength; + } + + private InputStream getInputStreamFromUrl(String inputUrl) throws IOException { + InputStream is = null; + URL url = new URL(inputUrl); + int code; + if (inputUrl.startsWith("https")) { + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setReadTimeout(6 * 60 * 1000); + connection.setConnectTimeout(6 * 60 * 1000); + if (header != null && !header.isEmpty()) { + for (Map.Entry entry : header.entrySet()) { + connection.setRequestProperty(entry.getKey(), (String) entry.getValue()); + } + } + if (!isNewDownload) { + connection.setRequestProperty("range", "bytes=" + currentLength + "-"); + } + connection.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault()); + connection.setDoInput(true); + code = connection.getResponseCode(); + RUpgradeLogger.get().d(TAG, "run: code=" + code); + if (code == 200 || code == 206) { + connection.connect(); + is = connection.getInputStream(); + if (isNewDownload) { + maxLength = getMaxLength(connection); + } + } else if (code == 301 || code == 302) { + URL redirectUrl = connection.getURL(); + RUpgradeLogger.get().d(TAG, "redirect to: " + redirectUrl.toString()); + is = getInputStreamFromUrl(redirectUrl.toString()); + } + } else { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(6 * 60 * 1000); + connection.setReadTimeout(6 * 60 * 1000); + connection.setRequestProperty("Accept-Encoding", "identity"); + if (header != null && !header.isEmpty()) { + for (Map.Entry entry : header.entrySet()) { + connection.setRequestProperty(entry.getKey(), (String) entry.getValue()); + } + } + if (!isNewDownload) { + connection.setRequestProperty("range", "bytes=" + currentLength + "-"); + } + connection.setDoInput(true); + code = connection.getResponseCode(); + RUpgradeLogger.get().d(TAG, "run: code=" + code); + if (code == 200 || code == 206) { + connection.connect(); + is = connection.getInputStream(); + if (isNewDownload) { + maxLength = getMaxLength(connection); + } + } else if (code == 301 || code == 302) { + URL redirectUrl = connection.getURL(); + RUpgradeLogger.get().d(TAG, "redirect to: " + redirectUrl.toString()); + is = getInputStreamFromUrl(redirectUrl.toString()); + } + } + return is; + } + + @Override + public void run() { + isNewDownload = handlerDownloadPending(); + //下载文件不存在,但是需要续下载? + if (!downloadFile.exists() && !isNewDownload) { + isNewDownload = true; + currentLength = 0; + + } + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + handlerDownloadRunning(); + } + }, 500, 500); + + InputStream is = null; + FileOutputStream fos = null; + RandomAccessFile raf = null; + + try { + if (isNewDownload) { + if (downloadFile.exists()) { + downloadFile.delete(); + } + downloadFile.createNewFile(); + fos = new FileOutputStream(downloadFile); + } else { + raf = new RandomAccessFile(downloadFile, "rwd"); + raf.seek(currentLength); + } + is = getInputStreamFromUrl(this.url); + if (is == null) { + handlerDownloadFailure(); + return; + } + assert (is != null); + RUpgradeLogger.get().d(TAG, "run: maxLength:" + maxLength); + + byte[] buff = new byte[1024]; + + int len = 0; + while ((len = is.read(buff)) != -1) { + if (!isRunning) { + break; + } + if (isNewDownload) { + assert (fos != null); + fos.write(buff, 0, len); + } else { + assert (raf != null); + raf.write(buff, 0, len); + } + currentLength += len; + } + if (isNewDownload) { + assert (fos != null); + fos.flush(); + fos.close(); + } else { + assert (raf != null); + raf.close(); + } + is.close(); + if (isRunning) { + handlerDownloadFinish(); + } + } catch (Exception e) { + timer.cancel(); + e.printStackTrace(); + if (is != null) { + try { + is.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + if (raf != null) { + try { + raf.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + //防止断网的情况,出现下载失败,而不是下载暂停的问题 + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + if (isRunning) { + handlerDownloadFailure(); + } + } + } + + private Map getMapForJson(String jsonStr) { + if (jsonStr == null || jsonStr.isEmpty()) return null; + + JSONObject jsonObject; + try { + jsonObject = new JSONObject(jsonStr); + + Iterator keyIter = jsonObject.keys(); + String key; + Object value; + Map valueMap = new HashMap(); + while (keyIter.hasNext()) { + key = keyIter.next(); + value = jsonObject.get(key); + valueMap.put(key, value); + } + return valueMap; + } catch (Exception e) { + e.printStackTrace(); + } + return new HashMap(); + } + + } + + private Map getMapForJson(String jsonStr) { + if (jsonStr == null || jsonStr.isEmpty()) return null; + + JSONObject jsonObject; + try { + jsonObject = new JSONObject(jsonStr); + + Iterator keyIter = jsonObject.keys(); + String key; + Object value; + Map valueMap = new HashMap(); + while (keyIter.hasNext()) { + key = keyIter.next(); + value = jsonObject.get(key); + valueMap.put(key, value); + } + return valueMap; + } catch (Exception e) { + e.printStackTrace(); + } + return new HashMap(); + } + + +} + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java new file mode 100644 index 00000000..e5c23947 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java @@ -0,0 +1,14 @@ +package com.example.r_upgrade.common.install; + +import android.content.Context; +import android.content.ContextWrapper; +import android.net.Uri; + +public abstract class BaseInstallFactory extends ContextWrapper { + + public BaseInstallFactory(Context base) { + super(base); + } + + public abstract boolean install(Uri uri); +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java new file mode 100644 index 00000000..4c0fade8 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java @@ -0,0 +1,32 @@ +package com.example.r_upgrade.common.install; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; + +import com.example.r_upgrade.common.RUpgradeLogger; + +public class NormalInstallFactory extends BaseInstallFactory { + + private static final String TAG = "NormalInstall"; + + public NormalInstallFactory(Context base) { + super(base); + } + + @Override + public boolean install(Uri uri) { + Intent install = new Intent(Intent.ACTION_VIEW); + RUpgradeLogger.get().d(TAG, uri.toString()); + install.setDataAndType(uri, "application/vnd.android.package-archive"); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + install.addCategory(Intent.CATEGORY_DEFAULT); + } + startActivity(install); + return true; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java new file mode 100644 index 00000000..04d02f1f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java @@ -0,0 +1,150 @@ +package com.example.r_upgrade.common.install; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageInstaller; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import com.example.r_upgrade.common.RUpgradeLogger; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class SilentInstallFactory extends BaseInstallFactory { + private static final String TAG = "SilentInstall"; + + public SilentInstallFactory(Context base) { + super(base); + } + + @Override + public boolean install(Uri uri) { + if (uri == null) return false; + File apkFile = new File(uri.getPath()); + if (!apkFile.exists()) { + return false; + } + RUpgradeLogger.get().d(TAG, "startSilentInstall:file path" + apkFile.getPath()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + PackageInstaller installer = getPackageManager().getPackageInstaller(); + PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(apkFile.getPath(), PackageManager.GET_ACTIVITIES | + PackageManager.GET_SERVICES); + PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( + PackageInstaller.SessionParams.MODE_FULL_INSTALL + ); + if (packageInfo != null) { + String packageName = packageInfo.packageName; + params.setAppPackageName(packageName); + } + params.setSize(apkFile.length()); + int sessionId = createSession(installer, params); + + PackageInstaller.Session session = copyInstallFile(installer, sessionId, apkFile.getPath()); + if (session != null) { + PendingIntent broadCastTest = PendingIntent.getBroadcast( + this, + sessionId, + new Intent(Intent.ACTION_PACKAGE_ADDED), + getPendingIntentFlag()); + session.commit(broadCastTest.getIntentSender()); + session.close(); + } + } + return true; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private void closeQuietly(Object obj) { + if (obj != null) { + if (obj instanceof PackageInstaller.Session) { + ((PackageInstaller.Session) obj).close(); + } else if (obj instanceof FileOutputStream) { + try { + ((FileOutputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof FileInputStream) { + try { + ((FileInputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof OutputStream) { + try { + ((OutputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof InputStream) { + try { + ((InputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private int createSession(PackageInstaller packageInstaller, + PackageInstaller.SessionParams sessionParams) { + int sessionId = -1; + try { + sessionId = packageInstaller.createSession(sessionParams); + } catch (IOException e) { + e.printStackTrace(); + } + return sessionId; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private PackageInstaller.Session copyInstallFile(PackageInstaller packageInstaller, + int sessionId, String apkFilePath) { + InputStream in = null; + OutputStream out = null; + PackageInstaller.Session session = null; + try { + File apkFile = new File(apkFilePath); + session = packageInstaller.openSession(sessionId); + out = session.openWrite("app_store_session", 0, apkFile.length()); + in = new FileInputStream(apkFile); + int total = 0; + byte[] buffer = new byte[65536]; + int len; + while ((len = in.read(buffer)) != -1) { + total += len; + out.write(buffer, 0, len); + RUpgradeLogger.get().d(TAG, "Write install session:" + len); + } + RUpgradeLogger.get().d(TAG, "Finish session total size:" + total); + session.fsync(out); + return session; + } catch (IOException e) { + e.printStackTrace(); + } finally { + closeQuietly(in); + closeQuietly(session); + closeQuietly(out); + } + return null; + } + + private static int getPendingIntentFlag() { + int pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= 31) { + pendingFlag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; + } + return pendingFlag; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java new file mode 100644 index 00000000..52629c6f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java @@ -0,0 +1,140 @@ +package com.example.r_upgrade.common.manager; + +import android.content.Context; +import android.content.ContextWrapper; +import android.net.Uri; +import android.os.ParcelFileDescriptor; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import io.flutter.util.PathUtils; + + +public class HotUpgradeManager extends ContextWrapper { + private static final String TAG = "HotUpgradeManager"; + private static final String FLUTTER_ASSETS = "flutter_assets"; + + public HotUpgradeManager(Context context) { + super(context); + } + + private File getFlutterAssets() { + return new File(PathUtils.getDataDirectory(this)); + } + + private File getHotAssets() { + File file; + file = new File(getFlutterAssets(), System.currentTimeMillis() + ".zip"); + if (!file.exists()) { + try { + boolean isSuccess = file.createNewFile(); + return isSuccess ? file : null; + } catch (IOException e) { + e.printStackTrace(); + } + } + return file; + } + + private void deleteFlutterAssets() { + File file = new File(getFlutterAssets(), FLUTTER_ASSETS); + if (file.exists()) { + if (file.isDirectory()) { + for (File item : file.listFiles()) { + if (item.exists()) { + item.delete(); + } + } + } + file.delete(); + } + } + + public Boolean hotUpgrade(Uri uri) { + //获取文件流 + try { + //复制下载的文件到资源文件中 + ParcelFileDescriptor descriptor = getContentResolver().openFileDescriptor(uri, "r"); + FileDescriptor fileDescriptor = descriptor.getFileDescriptor(); + if (fileDescriptor == null) return false; + FileInputStream stream = new FileInputStream(fileDescriptor); + File zipFile = getHotAssets(); + FileOutputStream outputStream = new FileOutputStream(zipFile); + byte[] buffer = new byte[1024]; + int byteRead; + while (-1 != (byteRead = stream.read(buffer))) { + outputStream.write(buffer, 0, byteRead); + } + stream.close(); + outputStream.flush(); + outputStream.close(); + + deleteFlutterAssets(); + unZipFile(zipFile.getPath(), getFlutterAssets().getPath() + File.separator + FLUTTER_ASSETS, true); + return true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + /** + * @param archive 解压文件得路径 + * @param decompressDir 解压文件目标路径 + * @param isDeleteZip 解压完毕是否删除解压文件 + * @throws IOException + */ + public static void unZipFile(String archive, String decompressDir, boolean isDeleteZip) throws IOException { + BufferedInputStream bi; + ZipFile zf = new ZipFile(archive); + Enumeration e = zf.entries(); + while (e.hasMoreElements()) { + ZipEntry ze2 = (ZipEntry) e.nextElement(); + String entryName = ze2.getName(); + String path = decompressDir + "/" + entryName; + if (ze2.isDirectory()) { + File decompressDirFile = new File(path); + if (!decompressDirFile.exists()) { + decompressDirFile.mkdirs(); + } + } else { + if (decompressDir.endsWith(".zip")) { + decompressDir = decompressDir.substring(0, decompressDir.lastIndexOf(".zip")); + } + File fileDirFile = new File(decompressDir); + if (!fileDirFile.exists()) { + fileDirFile.mkdirs(); + } + String substring = entryName.substring(entryName.lastIndexOf("/") + 1, entryName.length()); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + substring)); + bi = new BufferedInputStream(zf.getInputStream(ze2)); + byte[] readContent = new byte[1024]; + int readCount = bi.read(readContent); + while (readCount != -1) { + bos.write(readContent, 0, readCount); + readCount = bi.read(readContent); + } + bos.close(); + } + } + zf.close(); + if (isDeleteZip) { + File zipFile = new File(archive); + if (zipFile.exists() && zipFile.getName().endsWith(".zip")) { + zipFile.delete(); + } + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java new file mode 100644 index 00000000..dfd71826 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java @@ -0,0 +1,50 @@ +package com.example.r_upgrade.common.manager; + +import android.content.Context; +import android.content.ContextWrapper; +import android.os.Environment; +import android.util.Log; + + +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade_lib.RUpgradeLib; + +import java.io.File; + +public class IncrementUpgradeManager extends ContextWrapper { + private static final String TAG = "r_upgrade.Increment"; + private String oldApkPath; + private RUpgradeLib rUpgradeLib; + + public IncrementUpgradeManager(Context base) { + super(base); + oldApkPath = base.getPackageResourcePath(); + rUpgradeLib = new RUpgradeLib(); + } + + public String mixinAndGetNewApk(String patchPath) { + File parentFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + File newApkFile = new File(parentFile, oldApkPath.substring(oldApkPath.lastIndexOf("/") + 1)); + try { + File patchFile = new File(patchPath); + if (!patchFile.exists()) { + return null; + } + if (patchFile.length() == 0) { + return null; + } + if (newApkFile.exists()) { + newApkFile.delete(); + } + newApkFile.createNewFile(); + rUpgradeLib.mixinPatch(oldApkPath, patchPath, newApkFile.getPath()); + RUpgradeLogger.get().d(TAG, "mixinAndGetNewApk" + newApkFile.getPath()); + return newApkFile.getPath(); + } catch (Exception e) { + RUpgradeLogger.get().d(TAG, "合成失败:"); + e.printStackTrace(); + } + return null; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java new file mode 100644 index 00000000..1f8efb9b --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java @@ -0,0 +1,591 @@ +package com.example.r_upgrade.common.manager; + +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.example.r_upgrade.common.DownloadStatus; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.ResultMap; +import com.example.r_upgrade.common.DownloadPermissions; +import com.example.r_upgrade.common.UpgradeNotification; +import com.example.r_upgrade.common.UpgradeNotificationStyle; +import com.example.r_upgrade.common.UpgradeSQLite; +import com.example.r_upgrade.common.UpgradeService; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.NormalInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.tasks.CheckGooglePlayVersionTask; +import com.example.r_upgrade.common.tasks.CheckTencentStoreVersionTask; +import com.example.r_upgrade.common.tasks.CheckXiaoMiStoreVersionTask; +import com.example.r_upgrade.common.tasks.GenerateAndInstallAsyncTask; +import com.example.r_upgrade.common.tasks.GenerateAndInstallByPathAsyncTask; +import com.example.r_upgrade.common.tasks.VersionCallBack; + +import org.json.JSONObject; + +import java.io.File; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import io.flutter.plugin.common.MethodChannel; + + +public class UpgradeManager extends ContextWrapper { + private static final String TAG = "r_upgrade.Manager"; + //广播的action + public static final String DOWNLOAD_STATUS = "com.example.r_upgrade.DOWNLOAD_STATUS"; + public static final String DOWNLOAD_INSTALL = "com.example.r_upgrade.DOWNLOAD_INSTALL"; + + public static final String PARAMS_ID = "id"; + public static final String PARAMS_STATUS = "status"; + public static final String PARAMS_CURRENT_LENGTH = "current_length"; + public static final String PARAMS_MAX_LENGTH = "max_length"; + public static final String PARAMS_PLAN_TIME = "plan_time"; + public static final String PARAMS_SPEED = "speed"; + public static final String PARAMS_PERCENT = "percent"; + public static final String PARAMS_PATH = "path"; + public static final String PARAMS_APK_NAME = "apk_name"; + public static final String PARAMS_PACKAGE = "packages"; + //速度 + private double lastProgress = 0; + //最后更新的时间 + private long lastTime = 0; + + private Timer timer; + + private BaseInstallFactory installFactory; + + private boolean isUseDownloadManager = false; + + private Integer notificationVisibility = 0; + private UpgradeNotificationStyle notificationStyle = UpgradeNotificationStyle.none; + + + private BroadcastReceiver downloadReceiver; + + private MethodChannel channel; + + private DownloadPermissions.PermissionsRegistry permissionsRegistry; + private DownloadPermissions downloadPermissions; + private Activity activity; + + + public void dispose() { + unregisterReceiver(downloadReceiver); + } + + public UpgradeManager(Activity base, MethodChannel channel, DownloadPermissions storagePermissions, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + super(base); + this.activity = base; + this.downloadPermissions = storagePermissions; + this.permissionsRegistry = permissionsRegistry; + this.channel = channel; + UpgradeSQLite.getInstance(this).pauseDownloading(); + IntentFilter filter = new IntentFilter(); + filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE); + filter.addAction(UpgradeManager.DOWNLOAD_STATUS); + filter.addAction(UpgradeManager.DOWNLOAD_INSTALL); + downloadReceiver = createBroadcastReceiver(); + registerReceiver(downloadReceiver, filter); + } + + + public void upgrade(final String url, final Map header, final String apkName, final Integer notificationVisibility, Integer notificationStyle, Integer installType, Boolean useDownloadManager, final Integer upgradeFlavor, final MethodChannel.Result result) { + installFactory = installTypeToFactory(installType); + this.isUseDownloadManager = Boolean.TRUE == useDownloadManager; + if (notificationStyle != null) { + this.notificationStyle = UpgradeNotificationStyle.values()[notificationStyle]; + } else { + this.notificationStyle = UpgradeNotificationStyle.none; + } + this.notificationVisibility = notificationVisibility; + + downloadPermissions.requestPermissions(activity, permissionsRegistry, notificationVisibility,new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + long id = 0; + + if (isUseDownloadManager) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); + if (header != null) { + for (Map.Entry entry : header.entrySet()) { + request.addRequestHeader(entry.getKey(), entry.getValue()); + } + } + if (notificationVisibility != null) { + request.setNotificationVisibility(notificationVisibility); + } else { + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + } + request.setMimeType("application/vnd.android.package-archive"); + + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, apkName == null ? "release.apk" : apkName); + + request.setTitle(apkName == null ? "upgradePackage.apk" : apkName); + id = manager.enqueue(request); + if (timer != null) { + timer.cancel(); + } + timer = new Timer(); + final long finalId = id; + timer.schedule(new TimerTask() { + @Override + public void run() { + queryTask(finalId); + } + }, 0, 500); + RUpgradeLogger.get().d(TAG, "upgrade: " + id); + } else { + id = UpgradeSQLite.getInstance(activity).createRecord(activity, url, apkName, header == null ? "" : new JSONObject(header).toString(), DownloadStatus.STATUS_PENDING.getValue(), upgradeFlavor); + + Intent intent = new Intent(activity, UpgradeService.class); + Bundle bundle = new Bundle(); + bundle.putBoolean(UpgradeService.DOWNLOAD_RESTART, false); + bundle.putInt(UpgradeService.DOWNLOAD_ID, (int) id); + bundle.putString(UpgradeService.DOWNLOAD_URL, url); + bundle.putString(UpgradeService.DOWNLOAD_APK_NAME, apkName); + bundle.putSerializable(UpgradeService.DOWNLOAD_Header, (Serializable) header); + intent.putExtras(bundle); + startService(intent); + } + result.success(id); + } else { + result.error(errorCode, errorDescription, null); + } + } + }); + } + + //取消下载 + public boolean cancel(Integer id) { + if (id == null) return false; + if (isUseDownloadManager) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + return manager.remove(id) == 1; + } else { + Intent intent = new Intent(UpgradeService.RECEIVER_CANCEL); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + intent.putExtra(PARAMS_ID, id); + sendBroadcast(intent); + return true; + } + } + + //暂停下载 + public boolean pause(Integer id) { + if (id == null) return false; + Intent intent = new Intent(UpgradeService.RECEIVER_PAUSE); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + intent.putExtra(PARAMS_ID, id); + sendBroadcast(intent); + return true; + } + + + //查询进度 + public void queryTask(long id) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Query query = new DownloadManager.Query(); + Cursor cursor = manager.query(query.setFilterById(id)); + if (cursor != null && cursor.moveToFirst()) { + int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); + Intent intent = new Intent(); + switch (status) { + case DownloadManager.STATUS_PAUSED: + RUpgradeLogger.get().d(TAG, "queryTask: 下载被暂停"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + break; + case DownloadManager.STATUS_PENDING: + RUpgradeLogger.get().d(TAG, "queryTask: 下载延迟==========>总大小:"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PENDING.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + break; + case DownloadManager.STATUS_RUNNING: + //已经下载的字节数 + int progress = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); + if (lastProgress == 0) { + lastProgress = progress; + lastTime = System.currentTimeMillis(); + } + //下载的文件到本地的目录 + String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); + //总需下载的字节数 + int total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); + //下载速度 + double speed = ((progress - lastProgress) * 1000f / (System.currentTimeMillis() - lastTime)) / 1024; + //下载文件的URL链接 + String url = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)); + + //计划完成时间 + double planTime = (total - progress) / (speed * 1024f); + //当前进度 + double percent = new BigDecimal((progress * 1.0f / total) * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + if (progress - lastProgress > 0) { + RUpgradeLogger.get().d(TAG, "queryTask: 下载中\n" + + "url: " + + url + + "\n============>" + + "total:" + + total + + "," + + "progress:" + + progress + + "," + + String.format(Locale.getDefault(), "%.2f", percent) + + "% , " + + String.format(Locale.getDefault(), "%.2f", speed) + + "kb/s , " + + "预计:" + + String.format(Locale.getDefault(), "%.0f", planTime) + + "s"); + intent.setAction(DOWNLOAD_STATUS); + + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_CURRENT_LENGTH, progress); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_RUNNING.getValue()); + intent.putExtra(PARAMS_PERCENT, percent); + intent.putExtra(PARAMS_MAX_LENGTH, total); + intent.putExtra(PARAMS_SPEED, speed); + intent.putExtra(PARAMS_PLAN_TIME, planTime); + intent.putExtra(PARAMS_PATH, address); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = progress; + lastTime = System.currentTimeMillis(); + } + break; + case DownloadManager.STATUS_SUCCESSFUL: + RUpgradeLogger.get().d(TAG, "queryTask: 下载成功"); + if (timer != null) { + timer.cancel(); + timer = null; + } + installApkById((int) id); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = 0; + break; + case DownloadManager.STATUS_FAILED: + RUpgradeLogger.get().d(TAG, "queryTask: 下载失败"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_FAILED.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = 0; + break; + } + } + if (cursor != null) { + cursor.close(); + } + } + + + public void installApkById(int id) { + installApkById(id, -1, null); + } + + public void installApkById(final int id, int installType, final MethodChannel.Result result) { + if (installType != -1) { + installFactory = installTypeToFactory(installType); + } + if (installFactory == null) return; + downloadPermissions.requestPermissions(activity, permissionsRegistry,notificationVisibility, new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + new GenerateAndInstallAsyncTask(activity, isUseDownloadManager, result, installFactory).execute(id); + } else { + if (result != null) { + result.error(errorCode, errorDescription, null); + } + } + } + }); + } + + private BaseInstallFactory installTypeToFactory(int installType) { + BaseInstallFactory installFactory; + if (installType == 0) { + installFactory = new NormalInstallFactory(this); + } else if (installType == 1) { + installFactory = new SilentInstallFactory(this); + } else { + installFactory = null; + } + return installFactory; + } + + + public void installApkByPath(final String path, final int upgradeFlavor, int installType, final MethodChannel.Result result) { + installFactory = installTypeToFactory(installType); + + downloadPermissions.requestPermissions(activity, permissionsRegistry,notificationVisibility, new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + File installPath = new File(path); + if (installPath.exists()) { + new GenerateAndInstallByPathAsyncTask(activity, path, upgradeFlavor, result, installFactory).execute(); + + } else { + result.error("file not exists", "file path:" + path + " is not exists", null); + } + } else { + if (result != null) { + result.error(errorCode, errorDescription, null); + } + } + } + }); + } + + + public BroadcastReceiver createBroadcastReceiver() { + return new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String packageName = intent.getStringExtra(PARAMS_PACKAGE); + if (packageName == null || !packageName.equals(getPackageName())) { + return; + } + if (intent != null && intent.getAction() != null && intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { + if (timer != null) { + timer.cancel(); + timer = null; + } + long id = intent.getLongExtra("extra_download_id", 0); + queryTask(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(UpgradeManager.DOWNLOAD_STATUS)) { + + final long current_length = intent.getLongExtra(PARAMS_CURRENT_LENGTH, 0); + final long max_length = intent.getLongExtra(PARAMS_MAX_LENGTH, 0); + + double percent = intent.getDoubleExtra(PARAMS_PERCENT, 0); + + double speed = intent.getDoubleExtra(PARAMS_SPEED, 0); + + double planTime = intent.getDoubleExtra(PARAMS_PLAN_TIME, 0); + + int status = intent.getIntExtra(PARAMS_STATUS, 1); + + String apkName = intent.getStringExtra(PARAMS_APK_NAME); + + String path = intent.getStringExtra(PARAMS_PATH); + + long id = intent.getLongExtra(PARAMS_ID, 0L); + + if (!isUseDownloadManager) { + String contentText = notificationStyle == null ? "" : notificationStyle.getNotificationStyleString(context, speed, planTime); + if ((status == DownloadStatus.STATUS_RUNNING.getValue() || status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) && notificationVisibility == 1) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } else if (notificationVisibility == 0) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue() && notificationVisibility == 3) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } + if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + installApkById((int) id); + } + } + if (channel != null) + channel.invokeMethod("update", ResultMap.getInstance() + .pubClear(PARAMS_CURRENT_LENGTH, current_length) + .put(PARAMS_ID, id) + .put(PARAMS_PERCENT, percent) + .put(PARAMS_PLAN_TIME, planTime) + .put(PARAMS_STATUS, status) + .put(PARAMS_SPEED, speed) + .put(PARAMS_MAX_LENGTH, max_length) + .put(PARAMS_PATH, path) + .getMap()); + + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(UpgradeManager.DOWNLOAD_INSTALL)) { + int id = intent.getIntExtra(UpgradeService.DOWNLOAD_ID, 0); + installApkById(id); + UpgradeNotification.removeNotification(context, id); + } + } + }; + } + + public Integer getLastUpgradedId() { + String versionName = ""; + int versionCode = 0; + try { + PackageManager manager = this.getPackageManager(); + PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); + versionName = info.versionName; + versionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return UpgradeSQLite.getInstance(this).queryIdByVersionNameAndVersionCode(versionName, versionCode); + } + + public void upgradeWithId(final Integer id, Integer notificationVisibility, int installType, final MethodChannel.Result methodResult) { + this.notificationVisibility = notificationVisibility; + installFactory = installTypeToFactory(installType); + + final Map result = UpgradeSQLite.getInstance(this).queryById(id); + if (result == null) { + methodResult.success(false); + return; + } + String path = (String) result.get(UpgradeSQLite.PATH); + File downloadFile = new File(path); + + int status = (int) result.get(UpgradeSQLite.STATUS); + if (status == DownloadStatus.STATUS_PAUSED.getValue() || status == DownloadStatus.STATUS_FAILED.getValue() + || status == DownloadStatus.STATUS_CANCEL.getValue() || !downloadFile.exists()) { + downloadPermissions.requestPermissions(activity, permissionsRegistry, notificationVisibility,new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + Intent intent = new Intent(activity, UpgradeService.class); + Bundle bundle = new Bundle(); + bundle.putBoolean(UpgradeService.DOWNLOAD_RESTART, true); + bundle.putInt(UpgradeService.DOWNLOAD_ID, (int) id); + bundle.putString(UpgradeService.DOWNLOAD_URL, (String) result.get(UpgradeSQLite.URL)); + bundle.putString(UpgradeService.DOWNLOAD_APK_NAME, (String) result.get(UpgradeSQLite.APK_NAME)); + bundle.putSerializable(UpgradeService.DOWNLOAD_Header, (Serializable) result.get(UpgradeSQLite.HEADER)); + intent.putExtras(bundle); + startService(intent); + methodResult.success(true); + } else { + methodResult.error(errorCode, errorDescription, null); + } + } + }); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + installApkById(id, -1, methodResult); + } else { + // not known + methodResult.success(false); + } + } + + public Integer getDownloadStatus(Integer id) { + return UpgradeSQLite.getInstance(this).queryStatusById(id); + + } + + public boolean upgradeFromUrl(String url) { + Uri uri = Uri.parse(url); + try { + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } catch (Exception e) { + return false; + } + } + + public boolean upgradeFromAndroidStore(String store) { + Uri uri = Uri.parse("market://details?id=" + this.getApplicationInfo().packageName); + try { + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + if (store != null) { + intent.setPackage(store); + } + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } catch (Exception e) { + return false; + } + } + + public List getAndroidStores() { + List pkgs = new ArrayList<>(); + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.parse("market://details?id=")); + PackageManager pm = this.getPackageManager(); + // 通过queryIntentActivities获取ResolveInfo对象 + List infoList = pm.queryIntentActivities(intent, + 0); + if (infoList == null || infoList.size() == 0) + return pkgs; + int size = infoList.size(); + for (int i = 0; i < size; i++) { + String pkgName = ""; + try { + ActivityInfo activityInfo = infoList.get(i).activityInfo; + pkgName = activityInfo.packageName; + } catch (Exception e) { + e.printStackTrace(); + } + if (!TextUtils.isEmpty(pkgName)) + pkgs.add(pkgName); + } + return pkgs; + } + + public void getVersionFromAndroidStore(@Nullable String store, final MethodChannel.Result result) { + if (store == null) { + result.error("-1", "Please enter the package name.", null); + return; + } + VersionCallBack callBack = new VersionCallBack() { + @Override + public void versionName(String version) { + result.success(version); + } + }; + switch (store) { + case "com.android.vending": + new CheckGooglePlayVersionTask(getPackageName(), callBack).execute(); + break; + case "com.xiaomi.market": + new CheckXiaoMiStoreVersionTask(getPackageName(), callBack).execute(); + break; + case "com.tencent.android.qqdownloader": + new CheckTencentStoreVersionTask(getPackageName(), callBack).execute(); + break; + default: + result.error("-2", "Not Found AndroidStore.", null); + break; + } + } +} + + + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java new file mode 100644 index 00000000..67519e07 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckGooglePlayVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckGooglePlayVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Element element = Jsoup.connect("https://play.google.com/store/apps/details?id=" + packageName) + .timeout(30000) + .referrer("http://www.google.com/") + .get() + .select("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)") + .first(); + if (element != null) { + latestVersion = element.ownText(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java new file mode 100644 index 00000000..f178f9ef --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckTencentStoreVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckTencentStoreVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Document document = Jsoup.connect("https://a.app.qq.com/o/simple.jsp?pkgname="+packageName) + .timeout(30000) + .get(); + Element element = document.select("div.pp-comp > p.pp-comp-extra-p:eq(1)") + .first(); + if (element != null) { + latestVersion = element.ownText().split(":")[1]; + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java new file mode 100644 index 00000000..a60f94f6 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckXiaoMiStoreVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckXiaoMiStoreVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Element element = Jsoup.connect("https://app.mi.com/details?id="+packageName) + .timeout(30000) + .referrer("https://app.mi.com/") + .get() + .select("div.container:nth-child(1) > div:nth-child(6) > div:nth-child(1) > div:nth-child(2)") + .first(); + if (element != null) { + latestVersion = element.ownText(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java new file mode 100644 index 00000000..4ff0e7d8 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java @@ -0,0 +1,133 @@ +package com.example.r_upgrade.common.tasks; + +import android.app.DownloadManager; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; + +import com.example.r_upgrade.RUpgradeFileProvider; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.manager.HotUpgradeManager; +import com.example.r_upgrade.common.manager.IncrementUpgradeManager; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.UpgradeSQLite; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.Map; + +import io.flutter.plugin.common.MethodChannel; + +import static android.content.Context.DOWNLOAD_SERVICE; + +public class GenerateAndInstallAsyncTask extends AsyncTask { + private static final String TAG = "r_upgrade.AsyncTask"; + final WeakReference contextWrapper; + boolean isUserDownloadManager; + MethodChannel.Result result; + private BaseInstallFactory installFactory; + + public GenerateAndInstallAsyncTask(Context context, boolean isUserDownloadManager, MethodChannel.Result result, + BaseInstallFactory installFactory) { + this.contextWrapper = new WeakReference(context); + this.isUserDownloadManager = isUserDownloadManager; + this.result = result; + this.installFactory = installFactory; + } + + @Override + protected Uri doInBackground(Integer... integers) { + Uri uri = null; + try { + int id = integers[0]; + if (this.isUserDownloadManager) { + DownloadManager manager = (DownloadManager) contextWrapper.get().getSystemService(DOWNLOAD_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = manager.getUriForDownloadedFile(id); + } else { + DownloadManager.Query query = new DownloadManager.Query(); + Cursor cursor = manager.query(query.setFilterById(id)); + cursor.moveToNext(); + String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); + uri = Uri.parse(address); + cursor.close(); + } + } else { + Map map = UpgradeSQLite.getInstance(contextWrapper.get()).queryById(id); + if (map == null) return null; + int upgradeFlavor = (int) map.get(UpgradeSQLite.UPGRADE_FLAVOR); + String path = (String) map.get(UpgradeSQLite.PATH); + File file = new File(path); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if (installFactory != null && installFactory instanceof SilentInstallFactory) { + uri = Uri.parse(file.getPath()); + } + if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_INCREMENT) { + String newPath = new IncrementUpgradeManager(contextWrapper.get()).mixinAndGetNewApk(path); + RUpgradeLogger.get().d(TAG, "合成成功,新的安装包路径:" + newPath); + if (newPath == null) return null; + file = new File(newPath); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if (installFactory != null && installFactory instanceof SilentInstallFactory) { + uri = Uri.parse(file.getPath()); + } + } else if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_HOT_UPDATE) { + boolean isSuccess = new HotUpgradeManager(contextWrapper.get()).hotUpgrade(uri); + if (isSuccess) { + return Uri.parse(""); + } else { + return null; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return uri; + } + + @Override + protected void onPostExecute(Uri uri) { + super.onPostExecute(uri); + try { + if (uri != null) { + if (uri.toString().isEmpty()) { + //热更新实现 + postResult(true); + } else { + postResult(installApk(uri)); + } + } else { + postResult(false); + } + } catch (Exception e) { + e.printStackTrace(); + postResult(false); + + } + } + + private void postResult(boolean isSuccess) { + if (result != null) { + result.success(isSuccess); + } + } + + //安装apk + private boolean installApk(Uri uri) { + if (installFactory == null) return true; + return installFactory.install(uri); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java new file mode 100644 index 00000000..9edfcf89 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java @@ -0,0 +1,110 @@ +package com.example.r_upgrade.common.tasks; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; + +import com.example.r_upgrade.RUpgradeFileProvider; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.manager.HotUpgradeManager; +import com.example.r_upgrade.common.manager.IncrementUpgradeManager; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.UpgradeSQLite; + +import java.io.File; +import java.lang.ref.WeakReference; + +import io.flutter.plugin.common.MethodChannel; + +public class GenerateAndInstallByPathAsyncTask extends AsyncTask { + private static final String TAG = "r_upgrade.AsyncTask"; + final WeakReference contextWrapper; + MethodChannel.Result result; + final String path; + final int upgradeFlavor; + private BaseInstallFactory installFactory; + + public GenerateAndInstallByPathAsyncTask(Context context, String path, int upgradeFlavor, MethodChannel.Result result, BaseInstallFactory installFactory) { + this.contextWrapper = new WeakReference(context); + this.path = path; + this.upgradeFlavor = upgradeFlavor; + this.result = result; + this.installFactory = installFactory; + } + + @Override + protected Uri doInBackground(String... integers) { + Uri uri = null; + try { + File file = new File(path); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if(installFactory != null && installFactory instanceof SilentInstallFactory){ + uri= Uri.parse(file.getPath()); + } + if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_INCREMENT) { + String newPath = new IncrementUpgradeManager(contextWrapper.get()).mixinAndGetNewApk(path); + RUpgradeLogger.get().d(TAG, "合成成功,新的安装包路径:" + newPath); + if (newPath == null) return null; + file = new File(newPath); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if(installFactory != null && installFactory instanceof SilentInstallFactory){ + uri= Uri.parse(file.getPath()); + } + } else if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_HOT_UPDATE) { + boolean isSuccess = new HotUpgradeManager(contextWrapper.get()).hotUpgrade(uri); + if (isSuccess) { + return Uri.parse(""); + } else { + return null; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return uri; + } + + @Override + protected void onPostExecute(Uri uri) { + super.onPostExecute(uri); + try { + if (uri != null) { + if (uri.toString().isEmpty()) { + //热更新实现 + postResult(true); + } else { + postResult(installApk(uri)); + } + } else { + postResult(false); + } + } catch (Exception e) { + e.printStackTrace(); + postResult(false); + + } + } + + private void postResult(boolean isSuccess) { + if (result != null) { + result.success(isSuccess); + } + } + + //安装apk + private boolean installApk(Uri uri) { + if (installFactory == null) return true; + return installFactory.install(uri); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java new file mode 100644 index 00000000..3b959e26 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java @@ -0,0 +1,5 @@ +package com.example.r_upgrade.common.tasks; + +public interface VersionCallBack { + void versionName(String version); +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java new file mode 100644 index 00000000..07075d23 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java @@ -0,0 +1,13 @@ +package com.example.r_upgrade.method; + + +import com.example.r_upgrade.common.manager.UpgradeManager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +public interface IRUpgradeMethodHandler { + + void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result); + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java new file mode 100644 index 00000000..3d4ccd2e --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java @@ -0,0 +1,22 @@ +package com.example.r_upgrade.method; + +import androidx.annotation.NonNull; + +import com.example.r_upgrade.common.manager.UpgradeManager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +public class RUpgradeMethodCallHandler implements MethodChannel.MethodCallHandler { + private final UpgradeManager upgradeManager; + + public RUpgradeMethodCallHandler(UpgradeManager upgradeManager) { + this.upgradeManager = upgradeManager; + } + + @Override + public void onMethodCall(MethodCall call, @NonNull MethodChannel.Result result) { + RUpgradeMethodEnum methodEnum = RUpgradeMethodEnum.valueOf(call.method); + methodEnum.handler(upgradeManager,call, result); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java new file mode 100644 index 00000000..15a0a5ed --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java @@ -0,0 +1,103 @@ +package com.example.r_upgrade.method; + + +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.manager.UpgradeManager; + +import java.util.Map; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + + +public enum RUpgradeMethodEnum implements IRUpgradeMethodHandler { + setDebug { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + RUpgradeLogger.get().setDebug((Boolean) call.argument("isDebug") == Boolean.TRUE); + result.success(null); + } + }, + upgrade { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.upgrade((String) call.argument("url"), + (Map) call.argument("header"), + (String) call.argument("fileName"), + (Integer) call.argument("notificationVisibility"), + (Integer) call.argument("notificationStyle"), + (Integer) call.argument("installType"), + (Boolean) call.argument("useDownloadManager"), (Integer) call.argument("upgradeFlavor"), result); + } + }, + upgradeFromUrl { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.upgradeFromUrl((String) call.argument("url"))); + } + }, + + cancel { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.cancel((Integer) call.argument("id"))); + + } + }, + install { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.installApkById((Integer) call.argument("id"),(Integer) call.argument("installType"), result); + } + }, + installByPath { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.installApkByPath((String) call.argument("path"), (Integer) call.argument("flavor"), (Integer) call.argument("installType"), result); + } + }, + pause { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.pause((Integer) call.argument("id"))); + } + }, + upgradeWithId { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.upgradeWithId((Integer) call.argument("id"), (Integer) call.argument("notificationVisibility"), + (Integer) call.argument("installType"), result); + } + }, + getDownloadStatus { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getDownloadStatus((Integer) call.argument("id"))); + } + }, + getLastUpgradedId { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getLastUpgradedId()); + } + }, + upgradeFromAndroidStore { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.upgradeFromAndroidStore((String) call.argument("store"))); + } + }, + androidStores { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getAndroidStores()); + } + }, + getVersionFromAndroidStore { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.getVersionFromAndroidStore((String) call.argument("store"), result); + } + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml b/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml new file mode 100644 index 00000000..2561b25f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml @@ -0,0 +1,8 @@ + + + %.2f kb/s + %.0fs left + Download finished + Download paused + Download failed + \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml b/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..01ddeb6f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h new file mode 100644 index 00000000..9fb53282 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h @@ -0,0 +1,4 @@ +#import + +@interface RUpgradePlugin : NSObject +@end diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m new file mode 100644 index 00000000..72a970d2 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m @@ -0,0 +1,8 @@ +#import "RUpgradePlugin.h" +#import + +@implementation RUpgradePlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftRUpgradePlugin registerWithRegistrar:registrar]; +} +@end diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift b/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift new file mode 100644 index 00000000..1bfc3df1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift @@ -0,0 +1,132 @@ +import Flutter +import UIKit + +public class SwiftRUpgradePlugin: NSObject, FlutterPlugin { + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "com.rhyme/r_upgrade_method", binaryMessenger: registrar.messenger()) + let instance = SwiftRUpgradePlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "setDebug": + result(nil) + break + case "upgradeFromUrl": + print(call.arguments ?? "null") + guard let url = (call.arguments as? Dictionary)?["url"] as? String else { + result(FlutterError(code: "参数url不能为空", message: nil, details: nil)) + return + } + result(openUrl(url: url)) + break + case "upgradeFromAppStore": + print(call.arguments ?? "null") + guard let appId = (call.arguments as? Dictionary)?["appId"] as? String else { + result(FlutterError(code: "参数appId不能为空", message: nil, details: nil)) + return + } + guard let isChina = (call.arguments as? Dictionary)?["isChina"] as? Bool else { + result(FlutterError(code: "参数isChina不能为空", message: nil, details: nil)) + return + } + upgradeFromAppStore(appId: appId,isChina: isChina,result: result) + break; + case "getVersionFromAppStore": + print(call.arguments ?? "null") + guard let appId = (call.arguments as? Dictionary)?["appId"] as? String else{ + result(FlutterError(code: "参数appId不能为空", message: nil, details: nil)) + return + } + guard let isChina = (call.arguments as? Dictionary)?["isChina"] as? Bool else { + result(FlutterError(code: "参数isChina不能为空", message: nil, details: nil)) + return + } + getVersionFromAppStore(appId: appId,isChina:isChina,result: result) + break; + default: + result(FlutterMethodNotImplemented) + } + } + func openUrl(url:String) ->Bool{ + if let url = URL(string: url) { + //根据iOS系统版本,分别处理 + if #available(iOS 10, *) { + UIApplication.shared.open(url, options: [:],completionHandler: {(success) in }) + } else { + UIApplication.shared.openURL(url) + } + return true; + } + return false; + } + + //跳转到应用的AppStore页页面 + func upgradeFromAppStore(appId: String, isChina: Bool,result: @escaping FlutterResult) { + getInfoFromAppStore(appId: appId,isChina: isChina) { dict in + if dict == nil{ + result(false) + }else{ + let res = dict!["results"] as! NSArray + let xx = res[0] as! NSDictionary + let urlString = xx["trackViewUrl"] as! String + result(self.openUrl(url: urlString)) + } + + } error: { error in + result(false) + } + } + + //获取应用信息 + func getInfoFromAppStore(appId:String,isChina:Bool,complete:@escaping(_ result:NSDictionary?)->Void,error:@escaping(_ error:Error?)->Void) { + let checkLink = isChina == true ? "https://itunes.apple.com/cn/lookup?id=" : "https://itunes.apple.com/lookup?id=" + let appUrl = checkLink + appId + let url = NSURL(string: appUrl)! as URL + let request = NSMutableURLRequest(url: url, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 30) + request.httpMethod = "GET" + + let session = URLSession.shared + + let task = session.dataTask(with: request as URLRequest){(data,response,err) in + if err == nil{ + if data == nil{ + NSLog("获取appId:%@ 对应的appStore信息失败",appId) + complete(nil) + } + let httpRequest = response as! HTTPURLResponse + if httpRequest.statusCode == 200 { + let json = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary + if json["resultCount"] as! Int > 0{ + complete(json) + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败,未上架或ID不存在", appId) + complete(nil) + } + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败,未上架或ID不存在", appId) + complete(nil) + } + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败",appId) + error(err) + } + } + task.resume() + } + + func getVersionFromAppStore(appId:String,isChina:Bool,result: @escaping FlutterResult){ + getInfoFromAppStore(appId: appId,isChina: isChina) {dict in + if dict != nil { + let res = dict!["results"] as! NSArray + let xx = res[0] as! NSDictionary + result(xx["version"]! as! String) + }else{ + result(nil) + } + } error: { err in + result(nil) + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec b/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec new file mode 100644 index 00000000..d0df6ee3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'r_upgrade' + s.version = '0.0.1' + s.summary = 'A new Flutter project.' + s.description = <<-DESC +A new Flutter project. + DESC + s.homepage = 'http://example.com/' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' + s.swift_version='5.0' +end + diff --git a/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart b/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart new file mode 100644 index 00000000..8b109288 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart @@ -0,0 +1,484 @@ +// Copyright 2019 The rhyme_lph Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/services.dart'; + +class RUpgrade { + static MethodChannel? __methodChannel; + + /// single + static MethodChannel? get _methodChannel { + if (__methodChannel == null) { + __methodChannel = MethodChannel('com.rhyme/r_upgrade_method'); + __methodChannel!.setMethodCallHandler(_methodCallHandler); + } + return __methodChannel; + } + + /// handle download info call back. + static Future _methodCallHandler(MethodCall call) async { + if (call.method == 'update') { + _downloadInfo.add(DownloadInfo.formMap(call.arguments)); + } + return null; + } + + /// [isDebug] is true will print log. + static Future setDebug(bool isDebug) async { + return _methodChannel!.invokeMethod('setDebug', { + 'isDebug': isDebug, + }); + } + + /// Android and IOS + /// + /// if you want to upgrade in your website + /// + /// [url] your website url + /// + static Future upgradeFromUrl(String url) async { + return await _methodChannel!.invokeMethod("upgradeFromUrl", { + 'url': url, + }); + } + + /// Android + /// + /// if you want to upgrade form your store. + /// + /// [stores] if null,show all store list + /// + static Future upgradeFromAndroidStore(AndroidStore store) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("upgradeFromAndroidStore", { + 'store': store._packageName, + }); + } + + /// Android + /// + /// get android store list. + static Future?> get androidStores async { + assert(Platform.isAndroid, 'This method only support android application'); + return (await _methodChannel!.invokeListMethod('androidStores')) + ?.map((e) => AndroidStore.internal(e)) + .toList(); + } + + /// Android + /// + /// get version from android store. + static Future getVersionFromAndroidStore(AndroidStore store) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod('getVersionFromAndroidStore', { + 'store': store._packageName, + }); + } + + /// Android + /// + /// download broadcast + /// + static StreamController _downloadInfo = + StreamController.broadcast(); + + /// Android + /// + /// Download info stream . this will listen your upgrade progress and more info. + /// + static Stream get stream { + assert(Platform.isAndroid, 'This method only support android application'); + return _downloadInfo.stream; + } + + /// Android + /// + /// You can use this method upgrade your android application.If your application is ios. Oh,so sorry... + /// + /// * [url] download url. + /// * [header] download request header. + /// * [fileName] download filename and notification title name. + /// * [notificationVisibility] download running notification visibility mode. + /// * [notificationStyle] download notification show style about content text, only support [useDownloadManager]==false. + /// * [installType] download completed will install apk, use [RUpgradeInstallType.none] can not install. + /// * [useDownloadManager] if true will use DownloadManager,false will use my service , + /// * if true will no use [pause] , [upgradeWithId] , [getDownloadStatus] , [getLastUpgradedId] methods. + /// * [upgradeFlavor] you can use [RUpgradeFlavor.normal] , [RUpgradeFlavor.hotUpgrade] , [RUpgradeFlavor.incrementUpgrade] flavor + static Future upgrade( + String url, { + Map? header, + String? fileName, + NotificationVisibility notificationVisibility = + NotificationVisibility.VISIBILITY_VISIBLE, + NotificationStyle notificationStyle = NotificationStyle.planTime, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + bool useDownloadManager = false, + RUpgradeFlavor upgradeFlavor = RUpgradeFlavor.normal, + }) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('upgrade', { + 'url': url, + "header": header, + "fileName": fileName, + "notificationVisibility": notificationVisibility.value, + "notificationStyle": notificationStyle.index, + "installType": installType.index, + "useDownloadManager": useDownloadManager, + "upgradeFlavor": upgradeFlavor.index, + }); + } + + /// Android + /// + /// Cancel by the [id] download task . + /// + static Future cancel(int id) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('cancel', { + 'id': id, + }); + } + + /// Android + /// + /// Install your apk by [id]. + /// + static Future install( + int id, { + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("install", { + 'id': id, + 'installType': installType.index, + }); + } + + /// Android + /// + /// Install your apk by [path]. + /// + static Future installByPath( + String path, { + RUpgradeFlavor flavor = RUpgradeFlavor.normal, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("installByPath", { + 'path': path, + 'flavor': flavor.index, + 'installType': installType.index, + }); + } + + /// Android + /// + /// Pause by the [id] download task ,only use to [upgrade] params [useDownloadManager] is false. + /// + static Future pause(int id) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('pause', { + 'id': id, + }); + } + + /// Android + /// + /// Upgrade with ID ,only use to [upgrade] params [useDownloadManager] is false. + /// + /// * if download status is [STATUS_PAUSED] or [STATUS_FAILED] or [STATUS_CANCEL], will restart running. + /// * if download status is [STATUS_RUNNING] or [STATUS_PENDING], nothing happened. + /// * if download status is [STATUS_SUCCESSFUL] , will install apk. + /// + /// * if not found the id , will return [false]. + static Future upgradeWithId( + int id, { + NotificationVisibility notificationVisibility = + NotificationVisibility.VISIBILITY_VISIBLE, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("upgradeWithId", { + "id": id, + "notificationVisibility": notificationVisibility.value, + "installType": installType.index, + }); + } + + /// Android + /// + /// Get download status by ID , only use to [upgrade] params [useDownloadManager] is false. + /// + static Future getDownloadStatus(int id) async { + assert(Platform.isAndroid, 'This method only support android application'); + int? result = await _methodChannel!.invokeMethod("getDownloadStatus", { + "id": id, + }); + return result == null ? null : DownloadStatus._internal(result); + } + + /// Android + /// + /// Get the ID of the last upgrade by version name and version code , only use to [upgrade] params [useDownloadManager] is false. + /// + static Future getLastUpgradedId() async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod('getLastUpgradedId'); + } + + /// IOS + /// + /// [appId] your appId in appStore + /// [isChina] if true ,will check this link https://itunes.apple.com/cn/lookup. + /// + static Future upgradeFromAppStore(String appId, + [bool isChina = true]) async { + assert(Platform.isIOS, 'This method only support ios application'); + return await _methodChannel!.invokeMethod("upgradeFromAppStore", { + 'appId': appId, + 'isChina': isChina, + }); + } + + /// IOS + /// + /// [id] your appId in appStore + /// [isChina] if true ,will check this link https://itunes.apple.com/cn/lookup. + /// + static Future getVersionFromAppStore(String appId, + [bool isChina = true]) async { + assert(Platform.isIOS, 'This method only support ios application'); + return await _methodChannel!.invokeMethod("getVersionFromAppStore", { + 'appId': appId, + 'isChina': isChina, + }); + } +} + +/// +/// A model class is download info +/// +/// * [maxLength] download max bytes length +/// * [currentLength] download current bytes length +/// * [status] download status . you can watch [DownloadStatus] +/// * [planTime] download plan time /s +/// * [path] download file path +/// * [percent] download percent 0-100 +/// * [id] download id +/// * [speed] download speed kb/s +/// +class DownloadInfo { + final int? maxLength; + final int? currentLength; + final String? path; + final double? planTime; + final double? percent; + final int? id; + final double? speed; + final DownloadStatus? status; + + DownloadInfo( + {this.maxLength, + this.path, + this.planTime, + this.currentLength, + this.percent, + this.id, + this.status, + this.speed}); + + factory DownloadInfo.formMap(dynamic map) => DownloadInfo( + maxLength: map['max_length'], + currentLength: map['current_length'], + path: map['path'], + planTime: map['plan_time'], + percent: map['percent'], + id: map['id'], + status: DownloadStatus._internal(map['status']), + speed: map['speed'], + ); + + @override + String toString() { + return 'DownloadInfo{total: $maxLength, address: $path, planTime: $planTime, progress: $currentLength, percent: $percent, id: $id, speed: $speed, status: $status}'; + } + + String getSpeedString() { + double _speed = speed ?? 0; + String unit = 'kb/s'; + String result = _speed.toStringAsFixed(2); + if (_speed > 1024 * 1024) { + unit = 'gb/s'; + result = (_speed / (1024 * 1024)).toStringAsFixed(2); + } else if (_speed > 1024) { + unit = 'mb/s'; + result = (_speed / 1024).toStringAsFixed(2); + } + return '$result$unit'; + } +} + +/// +/// A model class is download status +/// +/// * [STATUS_PAUSED] download paused +/// * [STATUS_PENDING] download pending +/// * [STATUS_RUNNING] download running +/// * [STATUS_SUCCESSFUL] download successful +/// * [STATUS_FAILED] download failed +/// * [STATUS_CANCEL] download cancel +/// +class DownloadStatus { + final int? _value; + + int? get value => _value; + + const DownloadStatus._internal(this._value); + + static DownloadStatus from(int value) => DownloadStatus._internal(value); + + static const STATUS_PAUSED = const DownloadStatus._internal(0); + static const STATUS_PENDING = const DownloadStatus._internal(1); + static const STATUS_RUNNING = const DownloadStatus._internal(2); + static const STATUS_SUCCESSFUL = const DownloadStatus._internal(3); + static const STATUS_FAILED = const DownloadStatus._internal(4); + static const STATUS_CANCEL = const DownloadStatus._internal(5); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DownloadStatus && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + toString() => 'DownloadStatus($_value)'; +} + +/// +/// A model class is Notification Visibility +/// +/// * [VISIBILITY_VISIBLE] This download is visible but only shows in the notifications +/// * [VISIBILITY_VISIBLE_NOTIFY_COMPLETED] This download is visible and shows in the notifications while +/// * [VISIBILITY_HIDDEN] This download doesn't show in the UI or in the notifications. +/// * [VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION] This download shows in the notifications after completion ONLY. +/// +class NotificationVisibility { + final int _value; + + const NotificationVisibility._internal(this._value); + + int get value => _value; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is NotificationVisibility && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + toString() => 'NotificationVisibility($_value)'; + + static NotificationVisibility from(int value) => + NotificationVisibility._internal(value); + + /// This download is visible but only shows in the notifications + /// while it's in progress. + static const VISIBILITY_VISIBLE = const NotificationVisibility._internal(0); + + /// This download is visible and shows in the notifications while + /// in progress and after completion. + static const VISIBILITY_VISIBLE_NOTIFY_COMPLETED = + const NotificationVisibility._internal(1); + + /// This download doesn't show in the UI or in the notifications. + static const VISIBILITY_HIDDEN = const NotificationVisibility._internal(2); + + /// + /// This download shows in the notifications after completion ONLY. + /// + static const VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION = + const NotificationVisibility._internal(3); +} + +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, + planTimeAndSpeech, + speech, + planTime, + none, +} + +/// Upgrade Flavor +enum RUpgradeFlavor { + normal, + hotUpgrade, + incrementUpgrade, +} + +/// Install Type +enum RUpgradeInstallType { + normal, + silent, + none, +} + +/// +/// Android application store. +/// +/// [packageName] store package name. +class AndroidStore { + final String _packageName; + + String get packageName => _packageName; + + const AndroidStore.internal(this._packageName); + + //google play + static const GOOGLE_PLAY = const AndroidStore.internal('com.android.vending'); + + //应用宝 + static const TENCENT = + const AndroidStore.internal('com.tencent.android.qqdownloader'); + + //360手机助手 + static const QIHOO = const AndroidStore.internal('com.qihoo.appstore'); + + //百度手机助手 + static const BAIDU = const AndroidStore.internal('com.baidu.appsearch'); + + //小米应用商店 + static const XIAOMI = const AndroidStore.internal('com.xiaomi.market'); + + //豌豆荚 + static const WANDOU = const AndroidStore.internal('com.wandoujia.phoenix2'); + + //华为应用市场 + static const HUAWEI = const AndroidStore.internal('com.huawei.appmarket'); + + //淘宝手机助手 + static const TAOBAO = const AndroidStore.internal('com.taobao.appcenter'); + + //安卓市场 + static const HIAPK = const AndroidStore.internal('com.hiapk.marketpho'); + + //安智市场 + static const GOAPK = const AndroidStore.internal('cn.goapk.market'); + + //酷安 + static const COOLAPK = const AndroidStore.internal('com.coolapk.market'); + + @override + String toString() { + return 'AndroidStore{_packageName: $_packageName}'; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/pubspec.lock b/modules/ability/r_upgrade-0.4.2/pubspec.lock new file mode 100644 index 00000000..461388fe --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/pubspec.lock @@ -0,0 +1,189 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev/" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev/" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev/" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev/" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev/" + source: hosted + version: "1.19.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev/" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev/" + source: hosted + version: "10.0.7" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev/" + source: hosted + version: "3.0.8" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev/" + source: hosted + version: "3.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev/" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev/" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev/" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev/" + source: hosted + version: "1.9.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev/" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev/" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev/" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev/" + source: hosted + version: "1.3.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev/" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev/" + source: hosted + version: "0.7.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev/" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev/" + source: hosted + version: "14.3.0" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/modules/ability/r_upgrade-0.4.2/pubspec.yaml b/modules/ability/r_upgrade-0.4.2/pubspec.yaml new file mode 100644 index 00000000..63957e8e --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/pubspec.yaml @@ -0,0 +1,64 @@ +name: r_upgrade +description: A plugin for upgrade and install application ,Support Android and IOS. +version: 0.4.2 +homepage: https://github.com/rhymelph/r_upgrade + +environment: + sdk: '>=2.12.0 <3.0.0' + flutter: ">=1.12.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # This section identifies this Flutter project as a plugin project. + # The androidPackage and pluginClass identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.example.r_upgrade + pluginClass: RUpgradePlugin + ios: + pluginClass: RUpgradePlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart b/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart new file mode 100644 index 00000000..0f2805b6 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart @@ -0,0 +1,20 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const MethodChannel channel = MethodChannel('r_upgrade'); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { +// expect(await RUpgrade.upgrade(''), '42'); + }); +} diff --git a/packages/app_config/.gitignore b/modules/basic_system/app/.gitignore similarity index 100% rename from packages/app_config/.gitignore rename to modules/basic_system/app/.gitignore diff --git a/packages/app_config/.metadata b/modules/basic_system/app/.metadata similarity index 100% rename from packages/app_config/.metadata rename to modules/basic_system/app/.metadata diff --git a/packages/app_config/CHANGELOG.md b/modules/basic_system/app/CHANGELOG.md similarity index 100% rename from packages/app_config/CHANGELOG.md rename to modules/basic_system/app/CHANGELOG.md diff --git a/packages/app_config/LICENSE b/modules/basic_system/app/LICENSE similarity index 100% rename from packages/app_config/LICENSE rename to modules/basic_system/app/LICENSE diff --git a/packages/app_config/README.md b/modules/basic_system/app/README.md similarity index 100% rename from packages/app_config/README.md rename to modules/basic_system/app/README.md diff --git a/packages/app_config/analysis_options.yaml b/modules/basic_system/app/analysis_options.yaml similarity index 100% rename from packages/app_config/analysis_options.yaml rename to modules/basic_system/app/analysis_options.yaml diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart new file mode 100644 index 00000000..3849a58e --- /dev/null +++ b/modules/basic_system/app/lib/app.dart @@ -0,0 +1,31 @@ +library app; + +export 'app_config/bloc/bloc.dart'; +export 'app_config/repository/repository.dart'; +export 'app/cons/cons.dart'; +export 'app/cons/global_value.dart'; +export 'app/cons/path_unit.dart'; +export 'app/cons/sp.dart'; +export 'app/cons/str_unit.dart'; + +export 'app/res/toly_icon.dart'; +export 'app/theme/size_unit.dart'; +export 'app/theme/app_theme.dart'; +export 'app/style/unit_text_style.dart'; +export 'app/style/unit_color.dart'; +export 'app/style/gap.dart'; +export 'app/style/shape/coupon_shape_border.dart'; +export 'app/style/shape/techno_shape.dart'; +export 'app/style/behavior/no_scroll_behavior.dart'; + +export 'package:fx_platform_adapter/fx_platform_adapter.dart'; +export 'package:fx_go_router_ext/fx_go_router_ext.dart'; +export 'app_config/app_config.dart'; + +export 'app/action/action.dart'; +export 'app/router/app_route.dart'; +export 'view/view.dart'; +export 'http/http.dart'; +export 'event/api.dart'; +export 'news/news_bloc.dart'; +export 'news/cacheable.dart'; diff --git a/modules/basic_system/app/lib/app/action/action.dart b/modules/basic_system/app/lib/app/action/action.dart new file mode 100644 index 00000000..a49af120 --- /dev/null +++ b/modules/basic_system/app/lib/app/action/action.dart @@ -0,0 +1 @@ +export 'url.dart'; \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/action/url.dart b/modules/basic_system/app/lib/app/action/url.dart new file mode 100644 index 00000000..fd8b8297 --- /dev/null +++ b/modules/basic_system/app/lib/app/action/url.dart @@ -0,0 +1,17 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/foundation.dart'; +import 'package:url_launcher/url_launcher.dart'; + +void jumpURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } +} \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/cons/cons.dart b/modules/basic_system/app/lib/app/cons/cons.dart new file mode 100644 index 00000000..28212cbc --- /dev/null +++ b/modules/basic_system/app/lib/app/cons/cons.dart @@ -0,0 +1,92 @@ + +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../res/toly_icon.dart'; + + +class Cons { + + static const List tabColors = [ + Color(0xff44D1FD), + Color(0xffFD4F43), + Color(0xffB375FF), + Color(0xFF4CAF50), + Color(0xFFFF9800), + Color(0xFF00F1F1), + Color(0xFFDBD83F), + ]; + + + + static const List kFontFamilySupport = [ + 'local', + 'ComicNeue', + 'IndieFlower', + 'BalooBhai2', + 'Inconsolata', + 'Neucha' + ]; + + static const Map kWidgetFamilyLabelMap = { + WidgetFamily.stateless: "Stateless", + WidgetFamily.stateful: "Stateful", + WidgetFamily.singleChildRender: "SingleChild", + WidgetFamily.multiChildRender: "MultiChild", + WidgetFamily.sliver: "Sliver", + WidgetFamily.proxy: "Proxy", + WidgetFamily.other: "Other", + }; + + 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", + }; + +} + +enum ThemeColor { + red(Colors.red), + orange(Colors.orange), + yellow(Colors.yellow), + green(Colors.green), + blue(Colors.blue), + indigo(Colors.indigo), + purple(Colors.purple), + dark(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), + })); + + final MaterialColor color; + + const ThemeColor(this.color); + + String label(BuildContext context){ + return switch(this){ + ThemeColor.red => context.l10n.destructionRed, + ThemeColor.orange => context.l10n.rageOrange, + ThemeColor.yellow => context.l10n.warningYellow, + ThemeColor.green => context.l10n.camouflageGreen, + ThemeColor.blue => context.l10n.coldBlue, + ThemeColor.indigo => context.l10n.infiniteBlue, + ThemeColor.purple => context.l10n.mysteryPurple, + ThemeColor.dark => context.l10n.destinyBlack, + }; + } + +} diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart new file mode 100644 index 00000000..3e1babfa --- /dev/null +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -0,0 +1,42 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:storage/storage.dart'; +import 'package:flutter/foundation.dart'; +import 'package:uuid/uuid.dart'; + +double px1 = 1 / window.devicePixelRatio; + +String get kAppVersion => "3.2.0"; + +bool kIsDesk = + kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; + +late AppMeta kAppMeta; + +class AppMeta { + final String appVersion; + final String appId; + final String uuid; + + String get platform => Platform.operatingSystem; + + AppMeta(this.appVersion, this.appId, this.uuid); + + Map toHeaderJson() => { + 'X-App-Version': appVersion, + 'X-App-Id': appId, + 'X-Platform': platform, + 'X-Uuid': uuid, + }; +} + +Future initAppMeta() async { + String? uuid = SpStorage().spf.getString('uuid'); + if (uuid == null) { + uuid = const Uuid().v4(); + SpStorage().spf.setString('uuid', uuid); + } + String version = kAppVersion; + String appId = '1'; + kAppMeta = AppMeta(version, appId, uuid); +} diff --git a/modules/basic_system/app/lib/app/cons/path_unit.dart b/modules/basic_system/app/lib/app/cons/path_unit.dart new file mode 100644 index 00000000..274128ac --- /dev/null +++ b/modules/basic_system/app/lib/app/cons/path_unit.dart @@ -0,0 +1,16 @@ +/// create by 张风捷特烈 on 2021/1/17 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PathUnit { + static const baseUrl = 'http://82.157.176.209: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'; + + static const login = '/login'; +} diff --git a/packages/app_config/lib/app/cons/sp.dart b/modules/basic_system/app/lib/app/cons/sp.dart similarity index 100% rename from packages/app_config/lib/app/cons/sp.dart rename to modules/basic_system/app/lib/app/cons/sp.dart diff --git a/modules/basic_system/app/lib/app/cons/str_unit.dart b/modules/basic_system/app/lib/app/cons/str_unit.dart new file mode 100644 index 00000000..4345dadd --- /dev/null +++ b/modules/basic_system/app/lib/app/cons/str_unit.dart @@ -0,0 +1,40 @@ +import 'package:flutter/cupertino.dart'; +import 'package:l10n/l10n.dart'; + +/// create by 张风捷特烈 on 2020/11/29 +/// contact me by email 1981462002@qq.com +/// 说明: + +class StrUnit { + // 小文字大小 + static const String version = 'V3.2.0'; + static const String appName = 'Flutter Unit'; + + static String galleryDesc(BuildContext context) => """ +[ + { + "image":"assets/images/anim_draw.webp", + "name": "${context.l10n.basicDrawing}", + "info": "${context.l10n.basicDrawingDesc}" + }, + { + "image":"assets/images/draw_bg3.webp", + "name": "${context.l10n.animationGesture}", + "info": "${context.l10n.animationGestureDesc}" + }, + { + "image":"assets/images/base_draw.webp", + "name": "${context.l10n.particleDrawing}", + "info": "${context.l10n.particleDrawingDesc}" + }, + { + "image":"assets/images/draw_bg4.webp", + "name": "${context.l10n.interestingDrawing}", + "info": "${context.l10n.interestingDrawingDesc}"}, + { + "image":"assets/images/caver.webp", + "name": "${context.l10n.artGallery}", + "info": "${context.l10n.artGalleryDesc}"} +] +"""; +} diff --git a/modules/basic_system/app/lib/app/res/toly_icon.dart b/modules/basic_system/app/lib/app/res/toly_icon.dart new file mode 100644 index 00000000..012bb0a8 --- /dev/null +++ b/modules/basic_system/app/lib/app/res/toly_icon.dart @@ -0,0 +1,42 @@ +import 'package:flutter/widgets.dart'; +// Power By 张风捷特烈--- Generated file. Do not edit. +// 欢迎支持: https://github.com/toly1994328/FlutterUnit +class TolyIcon { + TolyIcon._(); + static const IconData icon_artifact = IconData(0xe726, fontFamily: "TolyIcon"); +static const IconData dark = IconData(0xe72f, fontFamily: "TolyIcon"); +static const IconData wb_sunny = IconData(0xe746, fontFamily: "TolyIcon"); +static const IconData icon_fast = IconData(0xe607, fontFamily: "TolyIcon"); +static const IconData icon_layout = IconData(0xe85e, fontFamily: "TolyIcon"); +static const IconData upload_success = IconData(0xe60b, fontFamily: "TolyIcon"); +static const IconData download = IconData(0xea51, fontFamily: "TolyIcon"); +static const IconData upload = IconData(0xea52, fontFamily: "TolyIcon"); +static const IconData error = IconData(0xe614, fontFamily: "TolyIcon"); +static const IconData dingzhi1 = IconData(0xe60e, fontFamily: "TolyIcon"); +static const IconData icon_collect = IconData(0xe672, fontFamily: "TolyIcon"); +static const IconData yonghu = IconData(0xe619, fontFamily: "TolyIcon"); +static const IconData icon_common = IconData(0xe634, fontFamily: "TolyIcon"); +static const IconData icon_see = IconData(0xe608, fontFamily: "TolyIcon"); +static const IconData icon_issues = IconData(0xe7a7, fontFamily: "TolyIcon"); +static const IconData icon_fork = IconData(0xe623, fontFamily: "TolyIcon"); +static const IconData icon_github_star = IconData(0xe7df, fontFamily: "TolyIcon"); +static const IconData icon_show = IconData(0xe648, fontFamily: "TolyIcon"); +static const IconData icon_hide = IconData(0xe649, fontFamily: "TolyIcon"); +static const IconData icon_email = IconData(0xe694, fontFamily: "TolyIcon"); +static const IconData icon_github = IconData(0xe689, fontFamily: "TolyIcon"); +static const IconData icon_juejin = IconData(0xe601, fontFamily: "TolyIcon"); +static const IconData icon_share = IconData(0xe613, fontFamily: "TolyIcon"); +static const IconData icon_background = IconData(0xe60a, fontFamily: "TolyIcon"); +static const IconData icon_code = IconData(0xe70b, fontFamily: "TolyIcon"); +static const IconData icon_item = IconData(0xe66f, fontFamily: "TolyIcon"); +static const IconData icon_kafei = IconData(0xe6aa, fontFamily: "TolyIcon"); +static const IconData icon_tag = IconData(0xe6e7, fontFamily: "TolyIcon"); +static const IconData icon_them = IconData(0xe6c2, fontFamily: "TolyIcon"); +static const IconData icon_bug = IconData(0xe7af, fontFamily: "TolyIcon"); +static const IconData icon_sound = IconData(0xe606, fontFamily: "TolyIcon"); +static const IconData icon_search = IconData(0xe604, fontFamily: "TolyIcon"); +static const IconData icon_star_ok = IconData(0xe6ae, fontFamily: "TolyIcon"); +static const IconData icon_star = IconData(0xe609, fontFamily: "TolyIcon"); +static const IconData icon_star_add = IconData(0xe68e, fontFamily: "TolyIcon"); + +} diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart new file mode 100644 index 00000000..626c0133 --- /dev/null +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -0,0 +1,42 @@ +enum AppRoute { + home('/', url: '/'), + splash('splash', url: '/splash'), + startError('start_error', url: '/start_error'), + globalError('404', url: '/404'), + + /// widget module + widget('widget', url: '/widget'), + widgetDetail('detail/:name', url: '/widget/detail/'), + collection('collection', url: '/collection'), + collectionDetail('widgets/:id', url: '/collection/widgets/'), + + note('note', url: '/note'), + moreNews('more_news', url: '/more_news'), + painter('painter', url: '/painter'), + knowledge('knowledge', url: '/knowledge'), + tools('tools', url: '/tools'), + + /// user/app + aboutApp('about_app', url: '/about_app'), + account('account', url: '/account'), + dataManage('data_manage', url: '/data_manage'), + aboutMe('about_me', url: '/about_me'), + supportMe('support_me', url: '/support_me'), + + /// settings + settings('settings', url: '/settings'), + darkModel('dark_mode', url: '/setting/dark_mode'), + codeStyle('code_style', url: '/setting/code_style'), + themeColor('theme_color', url: '/setting/theme_color'), + fontSetting('font_setting', url: '/setting/font_setting'), + version('version', url: '/settings/version'), + ; + + final String path; + final String url; + + const AppRoute( + this.path, { + required this.url, + }); +} diff --git a/modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart b/modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart new file mode 100644 index 00000000..82e89fe0 --- /dev/null +++ b/modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/16 +/// contact me by email 1981462002@qq.com +/// 说明: + +class NoScrollBehavior extends ScrollBehavior { + @override + Widget buildOverscrollIndicator( + BuildContext context, Widget child, ScrollableDetails details) => child; +} \ No newline at end of file diff --git a/packages/app_config/lib/app/style/gap.dart b/modules/basic_system/app/lib/app/style/gap.dart similarity index 75% rename from packages/app_config/lib/app/style/gap.dart rename to modules/basic_system/app/lib/app/style/gap.dart index 654cf477..2eed71fb 100644 --- a/packages/app_config/lib/app/style/gap.dart +++ b/modules/basic_system/app/lib/app/style/gap.dart @@ -11,7 +11,7 @@ class Gap{ static const Widget W5 = SizedBox(width: 5); static const Widget W10 = SizedBox(width: 10); - static const Widget sfl10 = SizedBox(height: 10,child: ColoredBox(color:UnitColor.scaffoldBgLight),); + static const Widget sfl10 = SizedBox(height: 10,); } \ No newline at end of file diff --git a/packages/app_config/lib/app/style/shape/coupon_shape_border.dart b/modules/basic_system/app/lib/app/style/shape/coupon_shape_border.dart similarity index 100% rename from packages/app_config/lib/app/style/shape/coupon_shape_border.dart rename to modules/basic_system/app/lib/app/style/shape/coupon_shape_border.dart diff --git a/packages/app_config/lib/app/style/shape/techno_shape.dart b/modules/basic_system/app/lib/app/style/shape/techno_shape.dart similarity index 100% rename from packages/app_config/lib/app/style/shape/techno_shape.dart rename to modules/basic_system/app/lib/app/style/shape/techno_shape.dart diff --git a/packages/app_config/lib/app/style/unit_color.dart b/modules/basic_system/app/lib/app/style/unit_color.dart similarity index 100% rename from packages/app_config/lib/app/style/unit_color.dart rename to modules/basic_system/app/lib/app/style/unit_color.dart diff --git a/packages/app_config/lib/app/style/unit_text_style.dart b/modules/basic_system/app/lib/app/style/unit_text_style.dart similarity index 98% rename from packages/app_config/lib/app/style/unit_text_style.dart rename to modules/basic_system/app/lib/app/style/unit_text_style.dart index 545663d3..1fdf7c19 100644 --- a/packages/app_config/lib/app/style/unit_text_style.dart +++ b/modules/basic_system/app/lib/app/style/unit_text_style.dart @@ -15,7 +15,7 @@ class UnitTextStyle { shadows: [ Shadow( color: Colors.black, - blurRadius: 1, + blurRadius: 0.5, offset: Offset(0.1, 0.1)) ], fontSize: 12); diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart new file mode 100644 index 00000000..7940d16a --- /dev/null +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -0,0 +1,129 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +ThemeData darkTheme(AppConfig state) { + Color scaffoldBackgroundColor = const Color(0xff010201); + + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.dark, + statusBarIconBrightness: Brightness.light, + ); + + return ThemeData( + scaffoldBackgroundColor: scaffoldBackgroundColor, + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), + tabBarTheme: const TabBarThemeData( + dividerColor: Colors.transparent, + ), + fontFamily: state.fontFamily, + useMaterial3: true, + brightness: Brightness.dark, + primaryColor: const Color(0xff4699FB), + listTileTheme: const ListTileThemeData( + tileColor: Color(0xff181818), + textColor: Color(0xffD6D6D6), + ), + + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: const Color(0xff181818), + iconTheme: const IconThemeData(color: Color(0xffCCCCCC)), + titleTextStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0xffCCCCCC))), + floatingActionButtonTheme: const FloatingActionButtonThemeData( + foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), + dividerTheme: DividerThemeData( + color: const Color(0xff2F2F2F), + space: px1, + thickness: px1, + ), + bottomNavigationBarTheme: const BottomNavigationBarThemeData( + backgroundColor: Color(0xff181818), + selectedItemColor: Color(0xff4699FB)), + ); +} + +ThemeData lightTheme(AppConfig state) { + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.light, + statusBarIconBrightness: Brightness.dark, + ); + + String fontFamily = state.fontFamily; + if (kAppEnv.isWindows) { + fontFamily = '宋体'; + } + return ThemeData( + fontFamily: fontFamily, + primaryColor: state.themeColor.color, + scaffoldBackgroundColor: const Color(0xffF3F4F6), + useMaterial3: true, + // Android 使用 Material3 + chipTheme: + const ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), + listTileTheme: const ListTileThemeData( + tileColor: Colors.white, textColor: Color(0xff333333)), + + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), + dividerTheme: DividerThemeData( + color: const Color(0xffDEE0E2), + space: px1, + thickness: px1, + ), + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), + tabBarTheme: TabBarThemeData( + dividerColor: Colors.transparent, + // labelStyle: TextStyle(fontFamily: fontFamily), + // unselectedLabelStyle: TextStyle(fontFamily: fontFamily), + + splashFactory: NoSplash.splashFactory, + overlayColor: WidgetStateProperty.resolveWith( + (Set states) { + return states.contains(WidgetState.focused) + ? null + : Colors.transparent; + }, + ), + ), + bottomNavigationBarTheme: + const BottomNavigationBarThemeData(backgroundColor: Colors.white), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: Colors.white, + titleTextStyle: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + fontFamily: fontFamily, + ), + ), + ); +} diff --git a/packages/app_config/lib/app/theme/size_unit.dart b/modules/basic_system/app/lib/app/theme/size_unit.dart similarity index 100% rename from packages/app_config/lib/app/theme/size_unit.dart rename to modules/basic_system/app/lib/app/theme/size_unit.dart diff --git a/modules/basic_system/app/lib/app_config/app_config.dart b/modules/basic_system/app/lib/app_config/app_config.dart new file mode 100644 index 00000000..0f31eb5d --- /dev/null +++ b/modules/basic_system/app/lib/app_config/app_config.dart @@ -0,0 +1,3 @@ +export 'bloc/state.dart'; +export 'bloc/bloc.dart'; +export 'repository/repository.dart'; \ No newline at end of file diff --git a/modules/basic_system/app/lib/app_config/bloc/bloc.dart b/modules/basic_system/app/lib/app_config/bloc/bloc.dart new file mode 100644 index 00000000..0380a6c2 --- /dev/null +++ b/modules/basic_system/app/lib/app_config/bloc/bloc.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:app/app.dart'; +// import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:storage/storage.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com +/// 说明: 全局信息的bloc + +class AppConfigBloc extends Cubit { + AppConfigBloc() : super(const AppConfig()); + + @override + Future close() async { + // _subscription.cancel(); + super.close(); + } + + void init(AppConfig state) { + emit(state); + } + + AppConfigCao get cao => SpStorage().appConfig; + + // 切换字体事件处理 : 固化索引 + 产出新状态 + void switchFontFamily(String family) async { + AppConfig newState = state.copyWith(fontFamily: family); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换语言事件处理 : 固化索引 + 产出新状态 + void switchLanguage(Language language) async { + AppConfig newState = state.copyWith(language: language); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换主题色事件处理 : 固化索引 + 产出新状态 + void switchThemeColor(ThemeColor color) async { + AppConfig newState = state.copyWith(themeColor: color); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换背景显示事件处理 : 固化数据 + 产出新状态 + void switchShowBg(bool show) async { + AppConfig newState = state.copyWith(showBackGround: show); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换背景显示事件处理 : 产出新状态 + void switchShowOver(bool show) async { + AppConfig newState = state.copyWith(showPerformanceOverlay: show); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换code样式事件处理 : 固化索引 + 产出新状态 + void switchCoderTheme(int codeStyleIndex) async { + AppConfig newState = state.copyWith(codeStyleIndex: codeStyleIndex); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + // 切换item样式事件处理 : 固化索引 + 产出新状态 + void changeItemStyle(int index) async { + AppConfig newState = state.copyWith(itemStyleIndex: index); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + void changeThemeMode(ThemeMode style) async { + AppConfig newState = state.copyWith(themeMode: style); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + + void switchShowTool(bool show) async { + AppConfig newState = state.copyWith(showOverlayTool: show); + cao.write(newState.toAppConfigPo()); + emit(newState); + } +} diff --git a/modules/basic_system/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart new file mode 100644 index 00000000..7da9703c --- /dev/null +++ b/modules/basic_system/app/lib/app_config/bloc/state.dart @@ -0,0 +1,136 @@ +import 'dart:io'; + +import 'package:app/app.dart'; +import 'package:app/app/cons/cons.dart'; +// import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +import 'package:storage/storage.dart'; +import 'package:toly_ui/code/code.dart'; + +/// create by 张风捷特烈 on 2020-04-11 +/// contact me by email 1981462002@qq.com +/// 说明: 全局状态类 + +class AppConfig extends Equatable { + /// [fontFamily] 文字字体 + final String fontFamily; + + /// [themeColor] 主题色 + final ThemeColor themeColor; + + /// [showBackGround] 是否显示主页背景图 + final bool showBackGround; + + /// [codeStyleIndex] 代码样式 索引 + final int codeStyleIndex; + + /// [itemStyleIndex] 主页item样式 索引 + final int itemStyleIndex; + + /// [showPerformanceOverlay] 是否显示性能浮层 + final bool showPerformanceOverlay; + + /// [showOverlayTool] 是否显示浮动工具 + final bool showOverlayTool; + + /// [appStyle] app 深色样式; + final ThemeMode themeMode; + + // final ConnectivityResult netConnect; + + final Language language; + + const AppConfig({ + this.fontFamily = '宋体', + this.language = Language.zh_CN, + this.themeColor = ThemeColor.indigo, + this.themeMode = ThemeMode.system, + this.showBackGround = true, + this.codeStyleIndex = 0, + this.itemStyleIndex = 0, + this.showPerformanceOverlay = false, + this.showOverlayTool = true, + // this.netConnect = ConnectivityResult.none, + }); + + String get localeValue => language.locale.toString(); + + @override + List get props => [ + fontFamily, + themeColor, + showBackGround, + codeStyleIndex, + itemStyleIndex, + themeMode, + showOverlayTool, + showPerformanceOverlay, + // netConnect, + language, + ]; + + AppConfig copyWith({ + String? fontFamily, + String? dbPath, + ThemeColor? themeColor, + bool? showBackGround, + Language? language, + int? codeStyleIndex, + int? itemStyleIndex, + bool? showPerformanceOverlay, + bool? showOverlayTool, + ThemeMode? themeMode, + // ConnectivityResult? netConnect, + }) => + AppConfig( + fontFamily: fontFamily ?? this.fontFamily, + language: language ?? this.language, + themeColor: themeColor ?? this.themeColor, + showBackGround: showBackGround ?? this.showBackGround, + codeStyleIndex: codeStyleIndex ?? this.codeStyleIndex, + showOverlayTool: showOverlayTool ?? this.showOverlayTool, + itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex, + themeMode: themeMode ?? this.themeMode, + showPerformanceOverlay: + showPerformanceOverlay ?? this.showPerformanceOverlay, + // netConnect: netConnect ?? this.netConnect, + ); + + // 将 AppState 状态数据转换为配置对象,以便存储 + AppConfigPo toAppConfigPo() => AppConfigPo( + showBackGround: showBackGround, + showOverlayTool: showOverlayTool, + showPerformanceOverlay: showPerformanceOverlay, + fontFamilyIndex: Cons.kFontFamilySupport.indexOf(fontFamily), + themeColorIndex: themeColor.index, + codeStyleIndex: codeStyleIndex, + themeModeIndex: themeMode.index, + itemStyleIndex: itemStyleIndex, + languageIndex: language.index, + ); + + // 根据存储的配置信息对象,形成 AppState 状态数据 + factory AppConfig.fromPo(AppConfigPo po) { + return AppConfig( + fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], + themeColor: ThemeColor.values[po.themeColorIndex], + showBackGround: po.showBackGround, + language: Language.values[po.languageIndex], + codeStyleIndex: po.codeStyleIndex, + itemStyleIndex: po.itemStyleIndex, + showPerformanceOverlay: po.showPerformanceOverlay, + showOverlayTool: po.showOverlayTool, + themeMode: ThemeMode.values[po.themeModeIndex], + ); + } + + HighlighterStyle get codeStyle => + Cons.codeThemeSupport.keys.toList()[codeStyleIndex]; + + @override + String toString() { + return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; + } +} diff --git a/modules/basic_system/app/lib/app_config/repository/repository.dart b/modules/basic_system/app/lib/app_config/repository/repository.dart new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/modules/basic_system/app/lib/app_config/repository/repository.dart @@ -0,0 +1 @@ + diff --git a/modules/basic_system/app/lib/event/api.dart b/modules/basic_system/app/lib/event/api.dart new file mode 100644 index 00000000..04dce8d9 --- /dev/null +++ b/modules/basic_system/app/lib/event/api.dart @@ -0,0 +1,13 @@ +import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void sendEvent(int id, {String? extra}) async { + if (kDebugMode) return; + Host host = FxDio()(); + ApiRet ret = await host.post( + '/event', + data: {"event": id}, + convertor: (data) => data, + ); +} diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart new file mode 100644 index 00000000..3250b8d3 --- /dev/null +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -0,0 +1,21 @@ +import 'dart:async'; +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +class UnitUpgradeApi implements UpgradeApi { + @override + Future> fetch(int appId, String locale) async { + Host host = FxDio()(); + String path = ScienceApi.appVersion.path; + return host.get( + path, + queryParameters: { + 'app_id': 1, + 'os': kAppEnv.os.name, + 'locale': locale, + }, + convertor: (data) => AppInfo.fromMap(data), + ); + } +} diff --git a/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart new file mode 100644 index 00000000..a5dcce2e --- /dev/null +++ b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart @@ -0,0 +1,35 @@ +import 'package:fx_dio/fx_dio.dart'; + +class UnitHost extends Host { + const UnitHost(); + + @override + Map get value => { + HostEnv.release: 'api.toly1994.com', + HostEnv.dev: '127.0.0.1', + }; + + @override + HostConfig get config => const HostConfig( + scheme: 'http', + port: 8080, + apiNest: '/api/v1', + ); + + @override + HostEnv get env => HostEnv.dev; +} + +enum UnitApi { + hello("/hello"), + repository("/repository/name/FlutterUnit"), + point("/point"), + pointComment("/pointComment/"), + appInfo("/appInfo/name/"), + ; + + final String path; + final Method? method; + + const UnitApi(this.path, [this.method = Method.get]); +} diff --git a/modules/basic_system/app/lib/http/http.dart b/modules/basic_system/app/lib/http/http.dart new file mode 100644 index 00000000..f1473952 --- /dev/null +++ b/modules/basic_system/app/lib/http/http.dart @@ -0,0 +1,5 @@ +export 'flutter_unit/api/upgrade_api.dart'; +export 'flutter_unit/unit_host.dart'; +export 'science/science_host.dart'; +export 'science/science_rep_interceptor.dart'; +export 'register.dart'; diff --git a/modules/basic_system/app/lib/http/register.dart b/modules/basic_system/app/lib/http/register.dart new file mode 100644 index 00000000..9b53dcdd --- /dev/null +++ b/modules/basic_system/app/lib/http/register.dart @@ -0,0 +1,18 @@ +import 'dart:async'; + +import 'package:app/app.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'http.dart'; + +void registerHttpClient() { + FxDio() + .register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); + FxDio().register(const UnitHost()); + + FxDio().auth(ScienceAuth()); +} + +class ScienceAuth extends ApiAuth { + @override + FutureOr> get buildHeaders => kAppMeta.toHeaderJson(); +} diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart new file mode 100644 index 00000000..4f129ae2 --- /dev/null +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -0,0 +1,33 @@ +import 'package:flutter/foundation.dart'; +import 'package:fx_dio/fx_dio.dart'; + +class ScienceHost extends Host { + const ScienceHost(); + + @override + Map get value => { + HostEnv.release: 'toly1994.com', + HostEnv.dev: '172.20.10.4', + // HostEnv.dev: '192.168.1.107', + }; + + @override + HostConfig get config => const HostConfig( + scheme: 'http', + port: 3000, + apiNest: '/api/v1', + ); + + @override + HostEnv get env => HostEnv.release; +} + +enum ScienceApi { + appVersion("/app_version"), + ; + + final String path; + final Method? method; + + const ScienceApi(this.path, [this.method = Method.get]); +} diff --git a/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart b/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart new file mode 100644 index 00000000..87848ae6 --- /dev/null +++ b/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart @@ -0,0 +1,48 @@ +import 'package:dio/dio.dart'; +import 'package:fx_trace/fx_trace.dart'; + +class ScienceRepInterceptor extends InterceptorsWrapper { + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + handleResponse(response); + super.onResponse(response, handler); + } + + void handleResponse(Response response) { + if (response.statusCode == HttpCode.ok.value) { + bool success = response.data?['status'] == true; + String message = response.data['msg']; + if (success) { + response.data = response.data['data']; + response.statusMessage = message; + } else { + throw ApiTrace(message: message, error: response.data); + } + return; + } + throw ApiTrace(message: response.statusMessage ?? '', error: response.data); + } +} + +class ApiTrace with Code, Trace { + @override + final int? value; + + @override + final String message; + + @override + final Object error; + + ApiTrace({ + this.value, + required this.message, + required this.error, + }); + + @override + Code? get code => this; + + @override + StackTrace? get stack => null; +} diff --git a/modules/basic_system/app/lib/news/cacheable.dart b/modules/basic_system/app/lib/news/cacheable.dart new file mode 100644 index 00000000..5b033ed9 --- /dev/null +++ b/modules/basic_system/app/lib/news/cacheable.dart @@ -0,0 +1,84 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:storage/storage.dart'; +import 'package:fx_dao/fx_dao.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +mixin Cacheable { + FutureOr save(V po); + + FutureOr find({bool shouldRemove = true}); + + FutureOr remove(); +} + +mixin TimeoutCache on Cacheable { + String get cacheKey; + + int get maxCacheMs => 1000 * 60 * 30; + + SharedPreferences get spf => SpStorage().spf; + + ConvertorList get convertor; + + @override + FutureOr find({bool shouldRemove = true}) async { + String? data = spf.getString(cacheKey); + if (data == null || data.isEmpty) return null; + try { + dynamic map = jsonDecode(data); + dynamic jsonValue = map['value']; + if (jsonValue == null) return null; + + int time = map['time'] ?? 0; + int nowMs = DateTime.now().millisecondsSinceEpoch; + int deadMs = time + maxCacheMs; + if (nowMs > deadMs && shouldRemove) { + await remove(); + return null; + } + List v = jsonDecode(jsonValue); + return convertor(v); + } catch (e) { + print(e); + } + + return null; + } + + @override + FutureOr save(V po) async { + String data = json.encode(TimeoutPo.value(json.encode(po))); + return spf.setString(cacheKey, data); + } + + @override + FutureOr remove() { + return spf.remove(cacheKey); + } +} + +class TimeoutPo extends Po { + final int time; + final String data; + + TimeoutPo.value(this.data) : time = DateTime.now().millisecondsSinceEpoch; + + TimeoutPo({ + required this.time, + required this.data, + }); + + @override + Map toJson() => { + 'time': time, + 'value': data, + }; + + factory TimeoutPo.fromJson(dynamic map) { + return TimeoutPo( + time: map['time'], + data: map['value'], + ); + } +} diff --git a/modules/basic_system/app/lib/news/news_bloc.dart b/modules/basic_system/app/lib/news/news_bloc.dart new file mode 100644 index 00000000..7fe8ccdd --- /dev/null +++ b/modules/basic_system/app/lib/news/news_bloc.dart @@ -0,0 +1,48 @@ +// import 'package:flutter_bloc/flutter_bloc.dart'; +// import 'package:fx_dao/src/model/po.dart'; +// import 'package:fx_dao/src/table/dao.dart'; +// import 'package:note/note.dart'; +// import 'package:fx_dio/fx_dio.dart'; +// import 'cacheable.dart'; +// +// class NewsBloc extends Cubit +// with Cacheable>, TimeoutCache> { +// NewsBloc() : super(NewsState(headerNews: [])); +// +// ArticleRepository _repository = HttpArticleRepository(); +// +// @override +// String get cacheKey => 'flutter.unit.news'; +// +// void load() async { +// List? retCache = await find(); +// if (retCache != null) { +// print("=====load in cache========="); +// emit(NewsState(headerNews: retCache)); +// return; +// } +// refreshFromNet(); +// } +// +// Future refreshFromNet() async { +// ApiRet> ret = await _repository.getArticlesByTag(1); +// print("=====load in net========="); +// if (ret.success) { +// save(ret.data); +// emit(NewsState(headerNews: ret.data)); +// } +// } +// +// @override +// ConvertorList> get convertor => (e) { +// return e.map(ArticlePo.fromCache).toList(); +// }; +// } +// +// class NewsState { +// final List headerNews; +// +// NewsState({ +// required this.headerNews, +// }); +// } diff --git a/lib/app/views/about/about_app_page.dart b/modules/basic_system/app/lib/view/about/about_app_page.dart similarity index 76% rename from lib/app/views/about/about_app_page.dart rename to modules/basic_system/app/lib/view/about/about_app_page.dart index 737f26c2..59eb8325 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/modules/basic_system/app/lib/view/about/about_app_page.dart @@ -1,59 +1,65 @@ /// create by 张风捷特烈 on 2020-04-13 /// contact me by email 1981462002@qq.com /// 说明: ... -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; +import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/views/time_line/flutter_unit_time_line.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; + class AboutAppPage extends StatelessWidget { const AboutAppPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - height: 150, - width: MediaQuery.of(context).size.width, - margin: const EdgeInsets.only(bottom: 50), - child: Image.asset( - 'assets/images/sabar.webp', - fit: BoxFit.cover, + return Theme( + data: ThemeData( + brightness: Brightness.light + ), + child: Scaffold( + backgroundColor: Colors.white, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: 150, + width: MediaQuery.of(context).size.width, + margin: const EdgeInsets.only(bottom: 50), + child: Image.asset( + 'assets/images/sabar.webp', + fit: BoxFit.cover, + ), + ), + _buildBar(context), + Positioned( + bottom: 0, + left: 50, + child: FeedbackWidget( + onEnd : (){ + Navigator.push(context, SlidePageRoute(child: const FlutterUnitTimeLine())); + }, + child: CircleImage( + size: 100, + shadowColor: Theme.of(context).primaryColor, + image: const AssetImage('assets/images/icon_head.webp'), + ), + )), + ], + ), + Expanded( + child: SingleChildScrollView( + child: Container( + margin: const EdgeInsets.all(24), + child: _buildInfo(), ), - ), - _buildBar(context), - Positioned( - bottom: 0, - left: 50, - child: FeedbackWidget( - onEnd : (){ - Navigator.push(context, Right2LeftRouter(child: const FlutterUnitTimeLine())); - }, - child: CircleImage( - size: 100, - shadowColor: Theme.of(context).primaryColor, - image: const AssetImage('assets/images/icon_head.webp'), - ), - )), - ], - ), - Expanded( - child: SingleChildScrollView( - child: Container( - margin: const EdgeInsets.all(24), - child: _buildInfo(), ), ), - ), - ], + ], + ), ), ); } @@ -112,7 +118,7 @@ class AboutAppPage extends StatelessWidget { children: [ FeedbackWidget( onPressed: () => - _launchURL("https://github_model.com/toly1994328/FlutterUnit"), + _launchURL("https://github.com/toly1994328/FlutterUnit"), child: Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, @@ -175,7 +181,7 @@ class AboutAppPage extends StatelessWidget { InfoPanel( title: 'Flutter Unit 2.0 ', info: - '○ 317 的 Flutter 组件收录和详情介绍。\n' + '○ 317 个 Flutter 组件收录和详情介绍。\n' '○ 绘制集录用于收录绘制相关的优秀示例。\n' '○ 要点集录用于收录 Flutter 相关的小知识。\n' '○ 时光轴,查看 FlutterUnit 重要事件。\n' @@ -198,6 +204,7 @@ class InfoPanel extends StatelessWidget { @override Widget build(BuildContext context) { return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/app/views/about/about_me_page.dart b/modules/basic_system/app/lib/view/about/about_me_page.dart similarity index 95% rename from lib/app/views/about/about_me_page.dart rename to modules/basic_system/app/lib/view/about/about_me_page.dart index dcbd4b8e..1c435bac 100644 --- a/lib/app/views/about/about_me_page.dart +++ b/modules/basic_system/app/lib/view/about/about_me_page.dart @@ -1,9 +1,9 @@ /// create by 张风捷特烈 on 2020-04-13 /// contact me by email 1981462002@qq.com /// 说明: ... -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -12,7 +12,11 @@ class AboutMePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return Theme( + data: ThemeData( + brightness: Brightness.light + ), + child:Scaffold( backgroundColor: Colors.white, body: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -54,7 +58,7 @@ class AboutMePage extends StatelessWidget { ), ], ), - ); + )); } Widget _buildBar(BuildContext context) { @@ -156,7 +160,7 @@ class AboutMePage extends StatelessWidget { )), FeedbackWidget( onPressed: () => - _launchURL("https://github_model.com/toly1994328"), + _launchURL("https://github.com/toly1994328"), child: Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, diff --git a/modules/basic_system/app/lib/view/about/version/version_shower.dart b/modules/basic_system/app/lib/view/about/version/version_shower.dart new file mode 100644 index 00000000..905c247b --- /dev/null +++ b/modules/basic_system/app/lib/view/about/version/version_shower.dart @@ -0,0 +1,23 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.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(); + } + + @override + Widget build(BuildContext context) { + return Text('Version $kAppVersion'); + } +} diff --git a/lib/app/views/about/version_info.dart b/modules/basic_system/app/lib/view/about/version_info.dart similarity index 77% rename from lib/app/views/about/version_info.dart rename to modules/basic_system/app/lib/view/about/version_info.dart index 135df912..601322da 100644 --- a/lib/app/views/about/version_info.dart +++ b/modules/basic_system/app/lib/view/about/version_info.dart @@ -1,9 +1,11 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -18,10 +20,13 @@ class VersionInfo extends StatelessWidget { @override Widget build(BuildContext context) { + + Color? bgColor = Theme.of(context).listTileTheme.tileColor; + return Scaffold( - backgroundColor: Colors.white, + backgroundColor: bgColor, appBar: AppBar( - backgroundColor: Colors.white, + backgroundColor: bgColor, elevation: 0, iconTheme: const IconThemeData( color: Colors.grey @@ -41,7 +46,7 @@ class VersionInfo extends StatelessWidget { const Spacer(), Padding( padding: const EdgeInsets.only(bottom:8.0), - child: buildBottom(), + child: buildBottom(context), ) ], @@ -74,15 +79,15 @@ class VersionInfo extends StatelessWidget { children: [ const Divider(height: 1,), ListTile( - title: const Text('应用详情',style: labelStyle,), + title: Text(context.l10n.appDetails,style: labelStyle,), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.about_app), + onTap: () => context.push('/about_app'), ), const Divider(height: 1,indent: 10), const AppUpdatePanel(), const Divider(height: 1,indent: 10), ListTile( - title: const Text('检查数据库新版本',style: labelStyle), + title: Text(context.l10n.checkDatabaseNewVersion,style: labelStyle), trailing: _nextIcon(context), onTap: () async{ @@ -98,7 +103,7 @@ class VersionInfo extends StatelessWidget { Widget _nextIcon(BuildContext context) => const Icon(Icons.chevron_right, color: Colors.grey); - Widget buildBottom() { + Widget buildBottom(BuildContext context) { return Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, @@ -106,11 +111,11 @@ class VersionInfo extends StatelessWidget { children: [ FeedbackWidget( onPressed: (){ - _launchURL("https://github_model.com/toly1994328/FlutterUnit"); + _launchURL("https://github.com/toly1994328/FlutterUnit"); }, - child: const Text('《查看本项目Github仓库》',style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), + child: Text(context.l10n.viewThisProjectGithubRepository,style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), const Text('Power By 张风捷特烈',style: TextStyle(fontSize: 12,color: Colors.grey),), - const Text('Copyright © 2008-2020 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),), + const Text('Copyright © 2018-2024 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),), ], ); } diff --git a/modules/basic_system/app/lib/view/account/desk/desk_account_page.dart b/modules/basic_system/app/lib/view/account/desk/desk_account_page.dart new file mode 100644 index 00000000..538dbdd8 --- /dev/null +++ b/modules/basic_system/app/lib/view/account/desk/desk_account_page.dart @@ -0,0 +1,101 @@ +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'sliver_cellection_panel.dart'; +import 'sliver_list_panel.dart'; +import 'sliver_share_panel.dart'; +import 'user_header.dart'; + +class DeskAccountPage extends StatefulWidget { + const DeskAccountPage({super.key}); + + @override + State createState() => _DeskAccountPageState(); +} + +class _DeskAccountPageState extends State + with SingleTickerProviderStateMixin { + late TabController tabController; + int activeIndex = 0; + + @override + void initState() { + super.initState(); + tabController = TabController(length: 3, vsync: this); + } + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + List tabs = [ + context.l10n.homeAccountTabInfo, + context.l10n.homeAccountTabMe, + context.l10n.homeAccountSupport, + ]; + + return Scaffold( + body: Column( + children: [ + // DeskAccountTopBar( + // leading: Row( + // children: [ + // FlutterUnitText( + // text: 'Flutter Unit', + // color: Theme.of(context).primaryColor, + // fontSize: 24, + // ), + // const SizedBox( + // width: 20, + // ), + // Text( + // context.l10n.slogan, + // style: TextStyle(color: Colors.grey), + // ) + // ], + // ), + // ), + Expanded( + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: UserHeader(), + ), + SliverPinnedHeader( + color: isDark ? Color(0xff2C3036) : Colors.white, + child: TabBar( + onTap: (i) { + setState(() { + activeIndex = i; + }); + }, + tabAlignment: TabAlignment.start, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + // indicator: RoundRectTabIndicator( + // borderSide: BorderSide(color: themeColor, width: 3), + // ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + // labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + // indicatorColor: themeColor, + tabs: tabs + .map((String name) => Tab(text: name)) + .toList(), + )), + if (activeIndex == 0) const SliverCollectionPanel(), + if (activeIndex == 1) const SliverSharePanel(), + if (activeIndex == 2) const SliverListPanel(), + ], + )) + ], + ), + ); + } +} diff --git a/modules/basic_system/app/lib/view/account/desk/sliver_cellection_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_cellection_panel.dart new file mode 100644 index 00000000..9097f13e --- /dev/null +++ b/modules/basic_system/app/lib/view/account/desk/sliver_cellection_panel.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +import '../../about/about_app_page.dart'; + +class SliverCollectionPanel extends StatelessWidget { + const SliverCollectionPanel({super.key}); + + @override + Widget build(BuildContext context) { + List items = [ + InfoPanel( + title: '项目简介', + info: 'Flutter Unit 是一个非盈利性的开源项目,' + '旨在提供全面的 Flutter 学习指南及编程者的交流技术的接口。' + '由【张风捷特烈】提供技术支持和全权维护。唯一开源网站网址:\n ' + 'https://github.com/toly1994328/FlutterUnit', + ), + const SizedBox(height: 10,), + 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' + '○ 搜索功能和组件星级分类。', + ), + const SizedBox(height: 10,), + InfoPanel( + title: 'Flutter Unit 2.0 ', + info: + '○ 317 个 Flutter 组件收录和详情介绍。\n' + '○ 绘制集录用于收录绘制相关的优秀示例。\n' + '○ 要点集录用于收录 Flutter 相关的小知识。\n' + '○ 时光轴,查看 FlutterUnit 重要事件。\n' + '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。' + ), + const SizedBox(height: 10,), + InfoPanel( + title: 'Flutter Unit 3.0 ', + info: + '○ 335 个 Flutter 组件收录和详情介绍。\n' + '○ 知识宝库收录 Flutter 精品文章。\n' + '○ 算法演绎尝试基于 Flutter 可视化展示算法流程。\n' + '○ 工具宝箱,通过 Flutter 界面交互实现一些全平台辅助工具。\n' + '○ 功能全面升级,多语言、暗色模式、Navigator2.0 支持。' + ), + const SizedBox(height: 20,) + ]; + + + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 48.0), + child: items[index], + ), + childCount: items.length), + ); + } +} diff --git a/modules/basic_system/app/lib/view/account/desk/sliver_list_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_list_panel.dart new file mode 100644 index 00000000..6d54fbd5 --- /dev/null +++ b/modules/basic_system/app/lib/view/account/desk/sliver_list_panel.dart @@ -0,0 +1,94 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../../about/about_app_page.dart'; + +class SliverListPanel extends StatelessWidget { + const SliverListPanel({super.key}); + + //coffee1.webp + @override + Widget build(BuildContext context) { + List items = [ + InfoPanel( + title: '开源不易,请我喝咖啡 ~', + info: 'Flutter Unit 是一个非盈利性的开源项目,' + '旨在提供全面的 Flutter 学习指南及编程者的交流技术的接口。' + '由【张风捷特烈】提供技术支持和全权维护。唯一开源网站网址:\n ' + 'https://github.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: '○ 317 个 Flutter 组件收录和详情介绍。\n' + '○ 绘制集录用于收录绘制相关的优秀示例。\n' + '○ 要点集录用于收录 Flutter 相关的小知识。\n' + '○ 时光轴,查看 FlutterUnit 重要事件。\n' + '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。') + ]; + + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 28.0), + child: 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( + '开源不易,请我喝咖啡 ~', + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ], + ), + Row( + children: [ + Expanded( + child: Image.asset( + 'assets/images/coffee_zfb.webp', + ), + ), + const SizedBox(width: 8,), + Expanded( + child: Image.asset( + 'assets/images/coffee_wx.webp', + ), + ), + const SizedBox(width: 8,), + Expanded( + child: Image.asset( + 'assets/images/coffee_wx_ac.webp', + ), + ), + ], + ) + ], + ), + ), + ); + } +} diff --git a/modules/basic_system/app/lib/view/account/desk/sliver_share_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_share_panel.dart new file mode 100644 index 00000000..c98eba0e --- /dev/null +++ b/modules/basic_system/app/lib/view/account/desk/sliver_share_panel.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +class SliverSharePanel extends StatelessWidget { + const SliverSharePanel({super.key}); + + @override + Widget build(BuildContext context) { + List items = [ + const SizedBox(height: 12), + const Text( + '邮箱: 1981462002@qq.com\n' + '微信群: 编程技术交流圣地 -【Flutter群】\n' + '公众号: 编程之王\n' + '愿青梅煮酒,与君天涯共话。', + style: TextStyle(color: Colors.grey)), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Image.asset( + 'assets/images/wechat.webp', + width: 200, + height: 200, + ), + ), + const Center( + child: Text( + '我的微信', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ], + ), + const SizedBox(width: 20,), + Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Image.asset( + 'assets/images/wxgzh.webp', + width: 200, + height: 200, + ), + ), + const Center( + child: Text( + '我的公众号', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ], + ), + ], + ), + + ]; + + + return SliverToBoxAdapter( + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + children: items, + ), + ); + } +} diff --git a/modules/basic_system/app/lib/view/account/desk/user_header.dart b/modules/basic_system/app/lib/view/account/desk/user_header.dart new file mode 100644 index 00000000..c392fb26 --- /dev/null +++ b/modules/basic_system/app/lib/view/account/desk/user_header.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; + +class UserHeader extends StatelessWidget { + const UserHeader({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'anim_draw.webp':'base_draw.webp'; + + return Stack( + // clipBehavior: Clip.none, + children: [ + Column( + children: [ + Image.asset( + 'assets/images/$image', + height: 150, + fit: BoxFit.fitWidth, + width: MediaQuery.of(context).size.width, + ), + Container( + alignment: Alignment.topLeft, + padding: EdgeInsets.only(left: 32 + 100 + 16, top: 12), + color: isDark?Color(0xff2C3036):Colors.white, + height: 86, + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '张风捷特烈', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + ), + Text( + '海的彼岸有我未曾见证的风采', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + Text( + '公众号@编程之王', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ) + ], + ), + ) + ], + ), + Positioned( + bottom: 16, + left: 32, + child: CircleImage( + size: 100, + shadowColor: Theme.of(context) + .primaryColor + .withAlpha(33), // image: NetworkImage(state.user.userAvatar), + image: const AssetImage("assets/images/icon_head.webp"), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart new file mode 100644 index 00000000..a2a714dc --- /dev/null +++ b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart @@ -0,0 +1,150 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; +import 'package:storage/storage.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:authentication/views/authentic_widget.dart'; +import 'package:utils/utils.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import 'package:path/path.dart' as path; +import 'package:sqflite/sqflite.dart'; +import 'package:widget_module/views/mobile/category_page/sync/category_api.dart'; +import 'package:widget_module/widget_module.dart'; + +/// create by 张风捷特烈 on 2021/2/26 +/// contact me by email 1981462002@qq.com +/// 说明: +/// + +class DataManagePage extends StatelessWidget { + const DataManagePage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(context.l10n.dataManagement), + ), + body: Builder( + builder: (ctx) => ListView( + children: [ + const SizedBox( + height: 8, + ), + AuthenticWidget.just( + ListTile( + trailing: Icon( + TolyIcon.upload, + color: Theme.of(context).primaryColor, + ), + title: const Text('备份收藏集数据'), + onTap: () => _doUploadCategoryData(ctx), + ), + ), + AuthenticWidget.just(const Divider()), + AuthenticWidget.just(ListTile( + trailing: Icon( + TolyIcon.download, + color: Theme.of(context).primaryColor, + ), + title: const Text('同步收藏集数据'), + onTap: () => _doSync(ctx), + )), + AuthenticWidget.just(const Divider()), + ListTile( + trailing: Icon( + Icons.refresh, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.favoritesCollectionDataReset), + // trailing: _nextIcon(context), + onTap: () => _recallDatabase(ctx), + ), + const 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(const EventLoadCategory()); + BlocProvider.of(context).add(const EventLoadLikeData()); + Toast.toast(context, '重置成功!'); + } + + void _doUploadCategoryData(BuildContext context) async { + // CategoryRepository rep = BlocProvider.of(context).repository; + // List loadCategories = await rep.loadCategoryData(); + // + // List likeData = await AppStorage().flutter().likeWidgetIds(); + // + // String json = jsonEncode(loadCategories); + // String likeJson = jsonEncode(likeData); + // + // TaskResult result = + // await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); + // + // if (result.success) { + // Toast.toast(context, '数据集备份成功!'); + // } else { + // Toast.toast(context, '数据集备份失败!'); + // } + } + + void _doSync(BuildContext context) async { + TaskResult result = await CategoryApi.getCategoryData(); + + if (result.success) { + // 说明请求成功 + if (result.data != null) { + //说明有后台备份数据,进行同步操作 + CategoryRepository repository = + BlocProvider.of(context).repository; + await repository.syncCategoryByData( + result.data!.data, result.data!.likeData); + BlocProvider.of(context).add(const EventLoadCategory()); + BlocProvider.of(context).add(const EventLoadLikeData()); + } else { + // 说明还没有后台数据, + // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 + // CategoryRepository rep = + // BlocProvider.of(context).repository; + // List loadCategories = await rep.loadCategoryData(); + // List likeData = await AppStorage().flutter().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/modules/basic_system/app/lib/view/setting/app_style_setting.dart b/modules/basic_system/app/lib/view/setting/app_style_setting.dart new file mode 100644 index 00000000..56d99b51 --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/app_style_setting.dart @@ -0,0 +1,73 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +/// create by 张风捷特烈 on 2020-04-10 +/// contact me by email 1981462002@qq.com +/// 说明: + + +void showAppStyleSelectDialog(BuildContext context) { + // List data = Cons.kAppStyleStringMap.values.toList(); + showCupertinoModalPopup( + context: context, + builder: (context) => AppThemeSettingDialog( + data: [], + )); +} + +class AppThemeSettingDialog extends StatelessWidget { + final List data; + + + const AppThemeSettingDialog({Key? key,required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + child: SizedBox( + height: 350, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + const Padding( + padding: EdgeInsets.all(16.0), + child: Text( + '选择应用风格样式', + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + ), + const Divider(height: 1,), + Expanded( + child: ListView.builder( + padding: EdgeInsets.zero, + itemBuilder: _buildItem, + itemCount: data.length, + ), + ) + ], + ), + // color: Colors.orange, + ), + ); + } + + Widget? _buildItem(BuildContext context, int index) { + // AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; + // AppStyle style = BlocProvider.of(context).state.appStyle; + // bool checked = style == locale; + // Color color = Theme.of(context).primaryColor; + // return ListTile( + // title: Text(data[index]), + // onTap: () => _onSelect(context, index), + // trailing: checked ? Icon(Icons.check, size: 20, color: color) : null, + // ); + } + void _onSelect(BuildContext context, int index) { + // AppStyle appStyle = Cons.kAppStyleStringMap.keys.toList()[index]; + // BlocProvider.of(context).changeThemeMode(appStyle); + // Navigator.of(context).pop(); + } +} diff --git a/lib/app/views/setting/code_style_setting.dart b/modules/basic_system/app/lib/view/setting/code_style_setting.dart similarity index 85% rename from lib/app/views/setting/code_style_setting.dart rename to modules/basic_system/app/lib/view/setting/code_style_setting.dart index bd834719..dba01045 100644 --- a/lib/app/views/setting/code_style_setting.dart +++ b/modules/basic_system/app/lib/view/setting/code_style_setting.dart @@ -1,6 +1,6 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -31,9 +31,8 @@ class Hello { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: '代码高亮样式'), - body: BlocBuilder( + appBar: AppBar(title: Text(context.l10n.codeHighlightStyle)), + body: BlocBuilder( builder: (_, state) => _buildFontCell(context, Cons.codeThemeSupport.keys.toList(), state.codeStyleIndex)), ); @@ -47,7 +46,7 @@ class Hello { a: 0.95, duration: const Duration(milliseconds: 200), onPressed: (){ - BlocProvider.of(context).switchCoderTheme(i); + BlocProvider.of(context).switchCoderTheme(i); }, child: Stack( fit: StackFit.passthrough, diff --git a/modules/basic_system/app/lib/view/setting/font_setting.dart b/modules/basic_system/app/lib/view/setting/font_setting.dart new file mode 100644 index 00000000..8321d6b9 --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/font_setting.dart @@ -0,0 +1,100 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +/// create by 张风捷特烈 on 2020-04-10 +/// contact me by email 1981462002@qq.com +/// 说明: + +class FontSettingPage extends StatelessWidget { + const FontSettingPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (_, state) =>Scaffold( + appBar: AppBar(title: Text('字体设置 - font setting',style: TextStyle(fontFamily:state.fontFamily ),)), + body: _buildFontCell( + context, Cons.kFontFamilySupport, state.fontFamily)), + ); + } + + Widget _buildFontCell( + BuildContext context, List fontFamilySupport, String fontFamily) { + return GridView.count( + padding: const EdgeInsets.only(top: 20, left: 10, right: 10), + crossAxisCount: kIsDesk?4:2, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + childAspectRatio: 1.5, + children: fontFamilySupport.map((e) { + return FontCell( + active: fontFamily == e, + fontFamily: e, + onSelect: (font) { + BlocProvider.of(context).switchFontFamily(font); + }, + ); + }).toList(), + ); + } +} + +class FontCell extends StatelessWidget { + final bool active; + final ValueChanged onSelect; + final String fontFamily; + + const FontCell( + {Key? key, + required this.active, + required this.onSelect, + required this.fontFamily}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return FeedbackWidget( + a: 0.95, + duration: const Duration(milliseconds: 200), + onPressed: () => onSelect(fontFamily), + child: GridTile( + header: Container( + padding: const EdgeInsets.only(left: 10, right: 5), + height: 30, + color: active + ? Colors.blue.withAlpha(88) + : Colors.grey.withAlpha(88), + child: Row( + children: [ + Text(fontFamily, + style: TextStyle( + color: Colors.black, + fontFamily: fontFamily, + )), + const Spacer(), + if (active) + Circle(color: Theme.of(context).primaryColor) + ], + ), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + gradient: LinearGradient(colors: [ + Colors.blueAccent.withAlpha(22), + Colors.blueAccent.withAlpha(22), + Theme.of(context).primaryColor.withAlpha(88) + ])), + alignment: const Alignment(0, 0.4), + child: Text( + '张风捷特烈\n@toly1994', + style: TextStyle(fontFamily: fontFamily, fontSize: 16), + )), + )); + } +} diff --git a/modules/basic_system/app/lib/view/setting/item_style_setting.dart b/modules/basic_system/app/lib/view/setting/item_style_setting.dart new file mode 100644 index 00000000..6037a588 --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/item_style_setting.dart @@ -0,0 +1,58 @@ +// import 'package:app/app.dart'; +// import 'package:components/components.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_bloc/flutter_bloc.dart'; +// +// /// create by 张风捷特烈 on 2020-04-10 +// /// contact me by email 1981462002@qq.com +// /// 说明: item样式切换支持 +// +// class ItemStyleSettingPage extends StatelessWidget { +// const ItemStyleSettingPage({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// backgroundColor: UnitColor.scaffoldBgLight, +// appBar: const UnitAppbar(title: 'item样式设置'), +// body: BlocBuilder(builder: (_, state) { +// return _buildCell(context, state.itemStyleIndex); +// }), +// ); +// } +// +// List get items=> HomeItemSupport.itemSimples(); +// +// Widget _buildCell(BuildContext context, int index) { +// return ListView.builder( +// itemCount: items.length, +// itemBuilder: (_, i) => Padding( +// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), +// child: FeedbackWidget( +// a: 0.95, +// duration: const Duration(milliseconds: 200), +// onPressed: () { +// BlocProvider.of(context).changeItemStyle(i); +// }, +// child: Stack( +// children: [ +// items[i], +// if (index == i) +// Positioned( +// left: 25, +// top: 15, +// child: Circle( +// color: Theme.of(context).primaryColor, +// radius: 10, +// child: const Icon( +// Icons.check, +// color: Colors.white, +// size: 15, +// ), +// ), +// ) +// ], +// )), +// )); +// } +// } diff --git a/modules/basic_system/app/lib/view/setting/language_setting.dart b/modules/basic_system/app/lib/view/setting/language_setting.dart new file mode 100644 index 00000000..cc520b14 --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/language_setting.dart @@ -0,0 +1,76 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; + +class LanguageSettingPage extends StatelessWidget { + const LanguageSettingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(context.l10n.settingLanguage), + ), + body: const LanguageSetting(), + ); + } +} + +class LanguageSetting extends StatelessWidget { + const LanguageSetting({super.key}); + + @override + Widget build(BuildContext context) { + List languages = Language.values; + Language activeLanguage = + context.select((bloc) => bloc.state.language); + Color iconColor = Theme.of(context).primaryColor; + + return ListView.separated( + padding: const EdgeInsets.only(top: 8), + separatorBuilder: (_, __) => const Divider(), + itemBuilder: (_, index) { + Language language = languages[index]; + return ListTile( + title: Text(language.label), + onTap: () { + context.read().switchLanguage(language); + }, + trailing: activeLanguage == language + ? Icon(Icons.check, size: 20, color: iconColor) + : null, + ); + }, + itemCount: languages.length, + ); + } +} + +class LanguageSwitchTile extends StatelessWidget { + const LanguageSwitchTile({super.key}); + + @override + Widget build(BuildContext context) { + Language activeLanguage = + context.select((bloc) => bloc.state.language); + Color color = Theme.of(context).primaryColor; + return ListTile( + leading: Icon( + Icons.language, + color: color, + ), + title: Text(context.l10n.settingLanguageText, + style: TextStyle(fontSize: 16)), + subtitle: Text( + '${activeLanguage.label}: ${activeLanguage.locale}', + style: TextStyle(fontSize: 12), + ), + trailing: Icon(Icons.chevron_right, color: color), + onTap: () { + showModalBottomSheet( + context: context, builder: (_) => LanguageSettingPage()); + }, + ); + } +} diff --git a/modules/basic_system/app/lib/view/setting/setting_page.dart b/modules/basic_system/app/lib/view/setting/setting_page.dart new file mode 100644 index 00000000..789fc4c8 --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/setting_page.dart @@ -0,0 +1,176 @@ +import 'package:app/app.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'language_setting.dart'; +import 'package:app_update/app_update.dart'; + +class SettingPage extends StatelessWidget { + const SettingPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + const Widget divider = Divider(height: 1); + + return DragToMoveWrapper( + child: Scaffold( + appBar: AppBar(title: Text(context.l10n.appSettings)), + body: ListView( + children: [ + Container(height: 15), + ListTile( + leading: Icon( + Icons.style, + color: Theme.of(context).primaryColor, + ), + title: + Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) { + String info = switch (state.themeMode) { + ThemeMode.system => context.l10n.followSystem, + ThemeMode.light => context.l10n.lightMode, + ThemeMode.dark => context.l10n.darkMode, + }; + return Text(info, + style: const TextStyle(fontSize: 12, color: Colors.grey)); + }, + ), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/dark_mode'), + ), + divider, + ListTile( + leading: Icon( + Icons.palette, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.themeColorSetting, + style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) => Text( + state.themeColor.label(context), + style: TextStyle(color: state.themeColor.color, fontSize: 12), + ), + ), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/theme_color'), + ), + // divider, + Container(height: 10), + ListTile( + leading: Icon( + Icons.translate, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.fontSetting, + style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) => Text( + state.fontFamily, + style: TextStyle(fontSize: 12), + ), + ), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/font_setting'), + ), + divider, + const LanguageSwitchTile(), + divider, + ListTile( + leading: Icon( + TolyIcon.icon_code, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.codeHighlightStyle, + style: TextStyle(fontSize: 16)), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/code_style'), + ), + // divider, + Container( + height: 10, + ), + // _buildShowBg(context), + divider, + _buildShowOver(context), + // divider, + // _buildShowTool(context), + divider, + // Container( height: 10), + VersionTiled(), + ], + ), + ), + ); + } + + Widget _buildShowOver(BuildContext context) => + BlocBuilder( + builder: (_, state) => TolySwitchListTile( + secondary: Icon( + TolyIcon.icon_background, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.displayPerformanceFloatingLayer, + style: TextStyle(fontSize: 16)), + value: state.showPerformanceOverlay, + onChanged: (bool value) { + BlocProvider.of(context).switchShowOver(value); + }, + )); + + Widget _nextIcon(BuildContext context) => + Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); +} + +class VersionTiled extends StatelessWidget { + const VersionTiled({super.key}); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + Widget title = Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)); + + UpdateState state = context.watch().state; + + if (state is ShouldUpdateState) { + title = Wrap( + spacing: 8, + crossAxisAlignment: WrapCrossAlignment.center, + children: [title, AppUpgradeTips(state: state)], + ); + } + + return ListTile( + leading: Icon(Icons.info, color: themeColor), + title: title, + trailing: Icon(Icons.chevron_right, color: themeColor), + onTap: () => context.push('/settings/version'), + ); + } +} + +class AppUpgradeTips extends StatelessWidget { + final ShouldUpdateState state; + + const AppUpgradeTips({super.key, required this.state}); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + bool downloading = state.isDownloading; + String text = downloading ? state.progressDisplay : '新版本'; + Color color = downloading ? themeColor : Colors.redAccent; + return Container( + decoration: + BoxDecoration(color: color, borderRadius: BorderRadius.circular(4)), + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4), + child: Text( + text, + style: TextStyle(color: Colors.white, fontSize: 10, height: 1), + )); + } +} diff --git a/modules/basic_system/app/lib/view/setting/theme_color_setting.dart b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart new file mode 100644 index 00000000..e43a687a --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart @@ -0,0 +1,92 @@ +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; +/// create by 张风捷特烈 on 2020-04-10 +/// contact me by email 1981462002@qq.com +/// 说明: + +class ThemeColorSettingPage extends StatelessWidget { + const ThemeColorSettingPage({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: UnitColor.scaffoldBgLight, + appBar: const UnitAppbar(title:'主题色设置'), + body: BlocBuilder( + builder: (_, state) => _buildCell( + context, ThemeColor.values, state.themeColor)), + ); + } + + Widget _buildCell( + BuildContext context, List themeColorSupport, ThemeColor color) { + return GridView.count( + padding: const EdgeInsets.only(top: 20, left: 10, right: 10), + shrinkWrap: true, + crossAxisCount: kIsDesk?4:2, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + childAspectRatio: 1.5, + children: themeColorSupport + .map((ThemeColor c) => FeedbackWidget( + a: 0.95, + duration: const Duration(milliseconds: 200), + onPressed: () => BlocProvider.of(context).switchThemeColor(c), + child: GridTile( + header: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.only(topLeft: Radius.circular(10),topRight: Radius.circular(10)), + color: color == c + ? Colors.blue.withAlpha(88): + Colors.grey.withAlpha(55), + ), + padding: const EdgeInsets.only(left: 10, right: 5), + height: 30, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(), + Text(colorString(c.color), + style: const TextStyle( + color: Colors.white, + )), + const Spacer(), + if (color == c) const Padding( + padding: EdgeInsets.only(right:8.0), + child: Circle(color: Colors.white,radius: 7,), + ) + ], + ), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(10)), + gradient: LinearGradient(colors: [ + c.color.shade50, + c.color.shade100, + c.color.shade200, + c.color.shade300, + c.color.shade400, + c.color.shade500, + c.color.shade600, + c.color.shade700, + c.color.shade800, + c.color.shade900, + ])), + alignment: const Alignment(0,0.35), + child: Text( + c.label(context), + style: const TextStyle(fontSize: 18,color: Colors.white,fontWeight: FontWeight.bold), + )), + ))) + .toList(), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/basic_system/app/lib/view/setting/theme_model_setting.dart b/modules/basic_system/app/lib/view/setting/theme_model_setting.dart new file mode 100644 index 00000000..aa6450ae --- /dev/null +++ b/modules/basic_system/app/lib/view/setting/theme_model_setting.dart @@ -0,0 +1,76 @@ +import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class ThemeModelSetting extends StatelessWidget { + const ThemeModelSetting({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + ThemeMode mode = context + .select((bloc) => bloc.state.themeMode); + Color iconColor = Theme.of(context).primaryColor; + String dark = context.l10n.darkMode; + String light = context.l10n.lightMode; + String followSystem = context.l10n.followSystem; + String manualSetting = context.l10n.manualSetting; + String info = + context.l10n.afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode; + return Scaffold( + appBar: AppBar(title: Text(dark)), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 15, + ), + TolySwitchListTile( + title: Text(followSystem, + style: + const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + subtitle: Text( + info, + style: const TextStyle(fontSize: 12, color: Colors.grey), + ), + value: mode == ThemeMode.system, + onChanged: (bool value) { + ThemeMode newModel; + if (value) { + newModel = ThemeMode.system; + } else { + newModel = ThemeMode.light; + } + context.read().changeThemeMode(newModel); + }, + ), + Padding( + padding: const EdgeInsets.only(left: 10, top: 16, bottom: 6), + child: Text(manualSetting), + ), + ListTile( + title: Text(light), + onTap: () { + context.read().changeThemeMode(ThemeMode.light); + }, + trailing: mode == ThemeMode.light + ? Icon(Icons.check, size: 20, color: iconColor) + : null, + ), + const Divider(), + ListTile( + title: Text(dark), + onTap: () { + context.read().changeThemeMode(ThemeMode.dark); + }, + trailing: mode == ThemeMode.dark + ? Icon(Icons.check, size: 20, color: iconColor) + : null, + ) + ], + ), + ); + ; + } +} diff --git a/lib/app/views/unit_todo/attr_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/attr_unit_page.dart similarity index 98% rename from lib/app/views/unit_todo/attr_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/attr_unit_page.dart index b0ffb70b..7b58610a 100644 --- a/lib/app/views/unit_todo/attr_unit_page.dart +++ b/modules/basic_system/app/lib/view/unit_todo/attr_unit_page.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; class AttrUnitPage extends StatelessWidget { diff --git a/lib/app/views/unit_todo/layout_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/layout_unit_page.dart similarity index 98% rename from lib/app/views/unit_todo/layout_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/layout_unit_page.dart index 1b329a1e..ae7beee7 100644 --- a/lib/app/views/unit_todo/layout_unit_page.dart +++ b/modules/basic_system/app/lib/view/unit_todo/layout_unit_page.dart @@ -1,6 +1,6 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/unit_todo/paint_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/paint_unit_page.dart similarity index 98% rename from lib/app/views/unit_todo/paint_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/paint_unit_page.dart index b3dece21..bf9ae950 100644 --- a/lib/app/views/unit_todo/paint_unit_page.dart +++ b/modules/basic_system/app/lib/view/unit_todo/paint_unit_page.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/unit_todo/point_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/point_unit_page.dart similarity index 95% rename from lib/app/views/unit_todo/point_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/point_unit_page.dart index b0d5f5de..92ac9be8 100644 --- a/lib/app/views/unit_todo/point_unit_page.dart +++ b/modules/basic_system/app/lib/view/unit_todo/point_unit_page.dart @@ -1,6 +1,6 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; class BugUnitPage extends StatelessWidget { const BugUnitPage({Key? key}) : super(key: key); @@ -26,7 +26,7 @@ class BugUnitPage extends StatelessWidget { children: [ FeedbackWidget( onPressed: (){ - Navigator.of(context).pushNamed(UnitRouter.issues_point); + // Navigator.of(context).pushNamed(UnitRouter.issues_point); }, child: const CircleImage( image: AssetImage('assets/images/icon_head.webp'), diff --git a/modules/basic_system/app/lib/view/view.dart b/modules/basic_system/app/lib/view/view.dart new file mode 100644 index 00000000..c42f28f1 --- /dev/null +++ b/modules/basic_system/app/lib/view/view.dart @@ -0,0 +1,13 @@ +export 'about/about_app_page.dart'; +export 'about/about_me_page.dart'; +export 'about/version_info.dart'; +export 'account/desk/desk_account_page.dart'; +export 'setting/setting_page.dart'; +export 'setting/app_style_setting.dart'; +export 'setting/font_setting.dart'; +export 'setting/item_style_setting.dart'; +export 'setting/language_setting.dart'; +export 'setting/theme_color_setting.dart'; +export 'setting/code_style_setting.dart'; +export 'setting/theme_model_setting.dart'; +export 'data_manage/data_manage_page.dart'; \ No newline at end of file diff --git a/lib/app/navigation/overlay_tool_wrapper.dart b/modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart similarity index 94% rename from lib/app/navigation/overlay_tool_wrapper.dart rename to modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart index 027e0554..0e3a3b10 100644 --- a/lib/app/navigation/overlay_tool_wrapper.dart +++ b/modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart @@ -1,10 +1,6 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; - - /// create by 张风捷特烈 on 2020/10/21 /// contact me by email 1981462002@qq.com @@ -157,7 +153,7 @@ class OverlayToolWrapperState extends State // 处理 菜单 item 点击事件 void _toSetting() { - Navigator.of(context).pushNamed(UnitRouter.setting); + // Navigator.of(context).pushNamed(UnitRouter.setting); } void _toWidget() {} @@ -167,8 +163,8 @@ class OverlayToolWrapperState extends State } void _toPoint() { - BlocProvider.of(context).add(EventLoadPoint()); - Navigator.of(context).pushNamed(UnitRouter.point); + // BlocProvider.of(context).add(EventLoadPoint()); + // Navigator.of(context).pushNamed(UnitRouter.point); } void _doClose() { diff --git a/modules/basic_system/app/pubspec.yaml b/modules/basic_system/app/pubspec.yaml new file mode 100644 index 00000000..04484de6 --- /dev/null +++ b/modules/basic_system/app/pubspec.yaml @@ -0,0 +1,48 @@ +name: app +description: A new Flutter package project. +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/app_config/test/app_config_test.dart b/modules/basic_system/app/test/app_config_test.dart similarity index 100% rename from packages/app_config/test/app_config_test.dart rename to modules/basic_system/app/test/app_config_test.dart diff --git a/packages/app_update/.gitignore b/modules/basic_system/app_update/.gitignore similarity index 100% rename from packages/app_update/.gitignore rename to modules/basic_system/app_update/.gitignore diff --git a/packages/app_update/.metadata b/modules/basic_system/app_update/.metadata similarity index 100% rename from packages/app_update/.metadata rename to modules/basic_system/app_update/.metadata diff --git a/packages/app_update/CHANGELOG.md b/modules/basic_system/app_update/CHANGELOG.md similarity index 100% rename from packages/app_update/CHANGELOG.md rename to modules/basic_system/app_update/CHANGELOG.md diff --git a/packages/app_update/LICENSE b/modules/basic_system/app_update/LICENSE similarity index 100% rename from packages/app_update/LICENSE rename to modules/basic_system/app_update/LICENSE diff --git a/packages/app_update/README.md b/modules/basic_system/app_update/README.md similarity index 100% rename from packages/app_update/README.md rename to modules/basic_system/app_update/README.md diff --git a/packages/app_update/analysis_options.yaml b/modules/basic_system/app_update/analysis_options.yaml similarity index 100% rename from packages/app_update/analysis_options.yaml rename to modules/basic_system/app_update/analysis_options.yaml diff --git a/modules/basic_system/app_update/lib/app_update.dart b/modules/basic_system/app_update/lib/app_update.dart new file mode 100644 index 00000000..ee3abb43 --- /dev/null +++ b/modules/basic_system/app_update/lib/app_update.dart @@ -0,0 +1,10 @@ +library app_update; + +export 'bloc/bloc.dart'; +export 'bloc/state.dart'; +export 'bloc/event.dart'; +export 'repository/model/app_info.dart'; +export 'views/app_update_panel.dart'; +export 'views/update_red_point.dart'; + +export 'repository/api/upgrade_api.dart'; \ No newline at end of file diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart new file mode 100644 index 00000000..e19fe683 --- /dev/null +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -0,0 +1,102 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:app/app.dart'; +import 'package:app_update/repository/api/upgrade_api.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:open_file/open_file.dart'; + +import 'package:path_provider/path_provider.dart'; +import 'package:r_upgrade/r_upgrade.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../repository/model/app_info.dart'; + +import 'event.dart'; +import 'state.dart'; +import 'package:path/path.dart' as p; + +class UpgradeBloc extends Bloc { + final UpgradeApi api; + + UpgradeBloc({required this.api}) : super(const NoUpdateState()) { + on(_onCheckUpdate); + on(_onDownloadEvent); + on(_onProgressChangeEvent); + } + + void _onCheckUpdate(CheckUpdate event, Emitter emit) async { + emit(const CheckLoadingState()); + ApiRet ret = await api.fetch(event.appId, event.locale); + if (ret.failed) { + emit(UpdateErrorState(error: ret.msg)); + return; + } + AppInfo result = ret.data; + if (result.shouldUpgrade(kAppVersion)) { + emit(ShouldUpdateState(oldVersion: kAppVersion, info: result)); + } else { + int time = DateTime.now().millisecondsSinceEpoch; + emit(NoUpdateState(isChecked: true, checkTime: time)); + } + } + + void _onDownloadEvent(DownloadEvent event, Emitter emit) async { + UpdateState curState = state; + if (curState is! ShouldUpdateState) return; + String url = event.appInfo.url; + + if (kAppEnv.isMacOS) { + launchUrl(Uri.parse(url)); + return; + } + + void onProgressChange(double progress) { + add(ProgressChangeEvent(progress: progress)); + } + + onProgressChange(0.001); + + if (kIsDesk) { + handleDesk(url, onProgressChange); + return; + } + handleAndroid(url, onProgressChange); + } + + void handleDesk(String url, OnProgressChange callback) async { + Dio dio = Dio(); + Directory dir = await getTemporaryDirectory(); + String filePath = p.join(dir.path, p.basename(url)); + Response rep = await dio.download( + url, + filePath, + onReceiveProgress: (c, t) => callback(c / t), + ); + if (rep.statusCode == 200) { + await OpenFile.open(filePath); + } + } + + late int? id; + StreamSubscription? subscription; + + void handleAndroid(String url, OnProgressChange callback) async { + id = await RUpgrade.upgrade(url, fileName: p.basename(url)); + subscription = RUpgrade.stream.listen((DownloadInfo info) { + double progress = (info.percent ?? 0) / 100; + if (info.status == DownloadStatus.STATUS_SUCCESSFUL) { + progress = 1; + subscription?.cancel(); + } + callback(progress); + }); + } + + FutureOr _onProgressChangeEvent( + ProgressChangeEvent event, Emitter emit) async { + UpdateState curState = state; + if (curState is! ShouldUpdateState) return; + emit(curState.copyWith(progress: event.progress)); + } +} diff --git a/modules/basic_system/app_update/lib/bloc/event.dart b/modules/basic_system/app_update/lib/bloc/event.dart new file mode 100644 index 00000000..f1fcfdae --- /dev/null +++ b/modules/basic_system/app_update/lib/bloc/event.dart @@ -0,0 +1,36 @@ +import 'package:equatable/equatable.dart'; + +import '../repository/model/app_info.dart'; + +sealed class UpdateEvent extends Equatable { + const UpdateEvent(); +} + +// 检查更新 ---> 校验,转换状态 +class CheckUpdate extends UpdateEvent { + final int appId; + final String locale; + + const CheckUpdate({required this.appId,required this.locale, }); + + @override + List get props => [appId]; +} + +class DownloadEvent extends UpdateEvent { + final AppInfo appInfo; + + const DownloadEvent({required this.appInfo}); + + @override + List get props => [appInfo]; +} + +class ProgressChangeEvent extends UpdateEvent { + final double progress; + + const ProgressChangeEvent({required this.progress}); + + @override + List get props => [progress]; +} diff --git a/modules/basic_system/app_update/lib/bloc/state.dart b/modules/basic_system/app_update/lib/bloc/state.dart new file mode 100644 index 00000000..b149263d --- /dev/null +++ b/modules/basic_system/app_update/lib/bloc/state.dart @@ -0,0 +1,70 @@ +import 'package:equatable/equatable.dart'; + +import '../repository/model/app_info.dart'; + +sealed class UpdateState extends Equatable { + const UpdateState(); +} + +class NoUpdateState extends UpdateState { + final bool isChecked; + final int checkTime; + + const NoUpdateState({this.isChecked = false, this.checkTime = 0}); + + @override + List get props => [isChecked, checkTime]; +} + +class CheckLoadingState extends UpdateState { + const CheckLoadingState(); + + @override + List get props => []; +} + + +class UpdateErrorState extends UpdateState { + final String error; + + const UpdateErrorState({required this.error}); + + @override + List get props => [error]; + + @override + String toString() { + return 'CheckErrorState{error: $error}'; + } +} + +class ShouldUpdateState extends UpdateState { + final String oldVersion; + final double progress; + final AppInfo info; + + const ShouldUpdateState({ + required this.oldVersion, + required this.info, + this.progress = 0, + }); + + @override + List get props => [oldVersion, info,progress]; + + @override + String toString() { + return 'ShouldUpdateState{oldVersion: $oldVersion, info: $info}'; + } + + bool get isDownloading => progress > 0 && progress != 1; + String get progressDisplay => "${(progress * 100).toStringAsFixed(2)}%"; + + UpdateState copyWith({double? progress}) { + return ShouldUpdateState( + oldVersion: oldVersion, + info: info, + progress: progress ?? this.progress, + ); + } +} diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart new file mode 100644 index 00000000..683c1264 --- /dev/null +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -0,0 +1,12 @@ +import 'package:app/app.dart'; + +import '../model/app_info.dart'; +import 'package:fx_dio/fx_dio.dart'; + +typedef OnProgressChange = void Function(double progress); + +abstract class UpgradeApi with CheckUpgrade {} + +mixin CheckUpgrade { + Future> fetch(int appId,String locale); +} diff --git a/modules/basic_system/app_update/lib/repository/model/app_info.dart b/modules/basic_system/app_update/lib/repository/model/app_info.dart new file mode 100644 index 00000000..4be0e71e --- /dev/null +++ b/modules/basic_system/app_update/lib/repository/model/app_info.dart @@ -0,0 +1,71 @@ +import 'package:path/path.dart' as p; + +class AppInfo { + final String version; + final String url; + final int size; + final String? description; + final String? sha256; + + const AppInfo({ + required this.version, + required this.url, + required this.size, + required this.description, + required this.sha256, + }); + + String get appName => p.basename(url); + + factory AppInfo.fromMap(dynamic map) => AppInfo( + version: map['version'] ?? '', + url: map['url'] ?? '', + size: map['size'] ?? 0, + description: map['description'] ?? '', + sha256: map['sha256'] ?? '', + ); + + @override + String toString() { + return 'AppInfo{appName: $appName, appVersion: $version, appUrl: $url, appSize: $size}'; + } + + bool shouldUpgrade(String current) => needsUpdate(current, version); +} + +bool needsUpdate( + String oldVersion, + String newVersion, { + int versionParts = 3, // 默认三位版本号 + String prefix = '', // 默认无前缀 +}) { + // 去除版本号前缀并将其解析为整数列表 + List parseVersion(String version) { + if (prefix.isNotEmpty && version.startsWith(prefix)) { + version = version.substring(prefix.length); // 移除前缀 + } + + final parts = version.split('.'); + if (parts.length != versionParts) { + throw FormatException( + '版本号格式错误,应为包含 $versionParts 位版本号的格式,如 ${prefix}1.0.0'); + } + + return parts.map(int.parse).toList(); + } + + final oldParts = parseVersion(oldVersion); + final newParts = parseVersion(newVersion); + + // 按位比较版本号 + for (int i = 0; i < versionParts; i++) { + if (newParts[i] > oldParts[i]) { + return true; // 新版本号更大,需要更新 + } else if (newParts[i] < oldParts[i]) { + return false; // 新版本号更小,不需要更新 + } + } + + // 版本号相同,不需要更新 + return false; +} diff --git a/modules/basic_system/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart new file mode 100644 index 00000000..32e0741f --- /dev/null +++ b/modules/basic_system/app_update/lib/views/app_update_panel.dart @@ -0,0 +1,152 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:utils/utils.dart'; +import 'package:l10n/l10n.dart'; + +import '../bloc/bloc.dart'; +import '../bloc/event.dart'; +import '../bloc/state.dart'; +import 'dialog/update_dialog.dart'; + +class AppUpdatePanel extends StatelessWidget { + const AppUpdatePanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocConsumer( + builder: _buildByUpdateState, + listener: _listenerByUpdateState, + ); + } + + Widget _buildProgress(BuildContext context, double progress, int appSize) { + return Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Column( + children: [ + Text( + '${(progress * 100).toStringAsFixed(2)} %', + style: const TextStyle( + height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox( + height: 5, + ), + Text( + '${convertFileSize((appSize * progress).floor())}/${convertFileSize(appSize)}', + style: const 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: progress, + ), + ) + ]); + } + + Widget _buildByUpdateState(BuildContext context, UpdateState state) { + String info = context.l10n.checkUpdate; + Widget trail = const SizedBox.shrink(); + if (state is ShouldUpdateState) { + if (state.progress > 0) { + info = context.l10n.downloadingNewVersion; + trail = _buildProgress(context, state.progress, state.info.size); + } else { + info = context.l10n.downloadNewVersion; + trail = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + '${state.oldVersion} --> ${state.info.version} ', + style: const TextStyle( + height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox(width: 5), + const Icon(Icons.update, color: Colors.green) + ]); + } + } + if (state is CheckLoadingState) { + trail = const CupertinoActivityIndicator(); + } + + return ListTile( + title: Text( + info, + style: const TextStyle(fontSize: 13), + ), + trailing: trail, + onTap: () => _tapByState(state, context), + ); + } + + void _tapByState(UpdateState state, BuildContext context) { + if (state is NoUpdateState) { + String locale = Localizations.localeOf(context).toString(); + context.read().add( CheckUpdate(appId: 1,locale: locale)); + } + + if (state is ShouldUpdateState) { + showDialog( + barrierDismissible: false, + context: context, + builder: (ctx) => UpdateDialog( + result: state.info, + onConfirm: () { + context + .read() + .add(DownloadEvent(appInfo: state.info)); + }, + )); + // if(Platform.isIOS){ + // // ios 跳转应用商店 + // RUpgrade.upgradeFromAppStore('6450545123', false); + // return; + // } + // // 处理下载的事件 + // BlocProvider.of(context).add(DownloadEvent(appInfo: state.info)); + } + } + + void _listenerByUpdateState(BuildContext context, UpdateState state) { + if (state is NoUpdateState) { + if (state.isChecked) { + Toast.success(context, context.l10n.currentIsNew); + } + } + // if (state is ShouldUpdateState) { + // showDialog( + // barrierDismissible: false, + // context: context, + // builder: (ctx) => FeiShuUpdateDialog( + // result: state.info, + // onConfirm: () {}, + // )); + // } + } + + String convertFileSize(int size) { + 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/modules/basic_system/app_update/lib/views/dialog/top_bar.dart b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart new file mode 100644 index 00000000..29ff58ec --- /dev/null +++ b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class UpdateTopBar extends StatelessWidget { + final String text; + const UpdateTopBar({Key? key, required this.text}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 68, + decoration: BoxDecoration( + color: Colors.blue, + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.8, 1), + colors: [ + Color(0xff4181b4), + Color(0xff1fbcfd), + Color(0xff46d1fd), + ], + // Gradient from https://learnui.design/tools/gradient-generator.html + tileMode: TileMode.mirror, + ), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), topRight: Radius.circular(8))), + alignment: Alignment.center, + child: Text( + text, + style: TextStyle( + color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold), + ), + ); + } +} diff --git a/modules/basic_system/app_update/lib/views/dialog/update_dialog.dart b/modules/basic_system/app_update/lib/views/dialog/update_dialog.dart new file mode 100644 index 00000000..2fc3a81b --- /dev/null +++ b/modules/basic_system/app_update/lib/views/dialog/update_dialog.dart @@ -0,0 +1,262 @@ +import 'dart:ui'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../bloc/bloc.dart'; +import '../../bloc/state.dart'; +import '../../repository/model/app_info.dart'; +import 'top_bar.dart'; + +class UpdateDialog extends StatefulWidget { + final AppInfo result; + final ValueChanged? onDownloadSuccess; + final VoidCallback? onBackHide; + final VoidCallback? onConfirm; + + const UpdateDialog({ + super.key, + required this.result, + this.onDownloadSuccess, + this.onBackHide, + this.onConfirm, + }); + + @override + State createState() => _UpdateDialogState(); +} + +class _UpdateDialogState extends State { + final TextStyle noticeStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + + final TextStyle subTextStyle = const TextStyle( + color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); + + @override + Widget build(BuildContext context) { + UpdateState state = context.watch().state; + return WillPopScope( + onWillPop: () async { + // UpdateCubit.isShowDialog = false; + return true; + }, + child: Dialog( + elevation: 0, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Container( + height: 360, + alignment: Alignment.topLeft, + width: kIsDesk ? 400 : 320, + // color: Colors.green, + child: Column( + mainAxisSize: MainAxisSize.min, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //大小为 ${(widget.result.appSize!/1024/1024).toStringAsFixed(1)}M + buildTitle(state), + Expanded(child: buildContent(state)), + buildButtons(state), + ], + ), + ), + ), + ); + } + + Widget buildContent(UpdateState state) { + if (state is ShouldUpdateState) { + if (state.progress > 0) { + return downloadProgress(state.progress); + } + return _buildUpdateInfo(); + } + return const SizedBox.shrink(); + } + + Widget downloadProgress(double progress) { + return Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + progress == 1 ? "文件校验中..." : '下载中...', + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox( + height: 10, + ), + LinearProgressIndicator( + minHeight: 10, + value: progress, + ), + const SizedBox( + height: 10, + ), + Row( + children: [ + Text("${(progress * 100).toStringAsFixed(1)}%", + style: + TextStyle(height: 1, fontSize: 12, color: Colors.grey)), + Spacer(), + Text( + "${convertFileSize(((widget.result.size) * (progress)).toInt())}/${convertFileSize(widget.result.size)}", + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ) + ], + ) + ], + ), + ), + ); + } + + 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"; + } + } + + Widget _buildUpdateInfo() { + return SingleChildScrollView( + child: Container( + width: 500, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '更新内容: ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 6, + ), + Text( + widget.result.description ?? '', + style: TextStyle(color: Colors.grey), + ), + ], + ), + ), + ); + } + + Widget buildTitle(UpdateState state) { + String text = ''; + if (state is ShouldUpdateState) { + text = "FlutterUnit v${state.info.version} 准备就绪"; + if (state.progress > 0) { + text = "正在下载更新.."; + } + } + return UpdateTopBar(text: text); + } + + Widget buildButtons(UpdateState state) { + if (state is ShouldUpdateState) { + if(state.progress>0){ + // 下载中 + return Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // widget.onBackHide?.call(); + Navigator.of(context).pop(); + // UpdateCubit.isShowDialog = false; + }, + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + height: 50, + child: Text( + '后台执行', + style: TextStyle( + color: Theme.of(context).primaryColor, fontSize: 16), + ), + ), + )), + ], + ); + } + return Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pop(false); + // UpdateCubit.isShowDialog = false; + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '稍后再说', + style: cancelTextStyle, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + widget.onConfirm?.call(); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '立即升级', + style: TextStyle( + color: Theme.of(context).primaryColor, fontSize: 16), + ), + ), + )), + ], + ); + } + + return const SizedBox.shrink(); + } + + void upgradeWindows() async { + // context.read().doUpdate(); + } +} diff --git a/packages/app_update/lib/views/update_red_point.dart b/modules/basic_system/app_update/lib/views/update_red_point.dart similarity index 85% rename from packages/app_update/lib/views/update_red_point.dart rename to modules/basic_system/app_update/lib/views/update_red_point.dart index 9108d97a..607b7df1 100644 --- a/packages/app_update/lib/views/update_red_point.dart +++ b/modules/basic_system/app_update/lib/views/update_red_point.dart @@ -7,7 +7,7 @@ import '../bloc/state.dart'; class UpdateRedPoint extends StatelessWidget { - const UpdateRedPoint({Key? key}) : super(key: key); + const UpdateRedPoint({super.key}); @override Widget build(BuildContext context) { @@ -16,7 +16,7 @@ class UpdateRedPoint extends StatelessWidget { height: 8, decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle), ); - return BlocBuilder( + return BlocBuilder( builder: (BuildContext context, UpdateState state) { if (state is ShouldUpdateState) { return radPoint; diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml new file mode 100644 index 00000000..21876a66 --- /dev/null +++ b/modules/basic_system/app_update/pubspec.yaml @@ -0,0 +1,69 @@ +name: app_update +description: A new Flutter package project. +version: 0.0.1 +homepage: +publish_to: none +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + flutter_bloc: ^8.1.6 # 状态管理 + dio: ^5.7.0 + convert: ^3.1.2 + equatable: ^2.0.5 # 相等辅助 + shared_preferences: ^2.5.1 # xml 固化 + r_upgrade: + path: ../../ability/r_upgrade-0.4.2 + open_file: ^3.5.9 # 打开文件 + url_launcher: ^6.3.0 # url + package_info_plus: ^8.1.4 + path_provider: ^2.1.5 + fx_dio: 0.0.4+3 + + utils: + path: ../utils + app: + path: ../app + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/basic_system/app_update/test/app_update_test.dart b/modules/basic_system/app_update/test/app_update_test.dart new file mode 100644 index 00000000..41b0517b --- /dev/null +++ b/modules/basic_system/app_update/test/app_update_test.dart @@ -0,0 +1,15 @@ +import 'package:app/app.dart'; +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void main() async { + FxDio().register(const UnitHost()); + + Host host = FxDio()(); + String path = UnitApi.appInfo.path; + ApiRet info = await host.get(path, queryParameters: { + 'app_id': 1, + 'os': kAppEnv.os.name, + }, convertor: (dynamic data) => AppInfo.fromMap(data['data'])); + print(info.data); +} diff --git a/packages/authentication/.gitignore b/modules/basic_system/authentication/.gitignore similarity index 100% rename from packages/authentication/.gitignore rename to modules/basic_system/authentication/.gitignore diff --git a/packages/authentication/.metadata b/modules/basic_system/authentication/.metadata similarity index 100% rename from packages/authentication/.metadata rename to modules/basic_system/authentication/.metadata diff --git a/packages/authentication/CHANGELOG.md b/modules/basic_system/authentication/CHANGELOG.md similarity index 100% rename from packages/authentication/CHANGELOG.md rename to modules/basic_system/authentication/CHANGELOG.md diff --git a/packages/authentication/LICENSE b/modules/basic_system/authentication/LICENSE similarity index 100% rename from packages/authentication/LICENSE rename to modules/basic_system/authentication/LICENSE diff --git a/packages/authentication/README.md b/modules/basic_system/authentication/README.md similarity index 100% rename from packages/authentication/README.md rename to modules/basic_system/authentication/README.md diff --git a/packages/authentication/analysis_options.yaml b/modules/basic_system/authentication/analysis_options.yaml similarity index 100% rename from packages/authentication/analysis_options.yaml rename to modules/basic_system/authentication/analysis_options.yaml diff --git a/packages/authentication/lib/authentication.dart b/modules/basic_system/authentication/lib/authentication.dart similarity index 84% rename from packages/authentication/lib/authentication.dart rename to modules/basic_system/authentication/lib/authentication.dart index c763807f..0147e563 100644 --- a/packages/authentication/lib/authentication.dart +++ b/modules/basic_system/authentication/lib/authentication.dart @@ -8,8 +8,11 @@ export 'blocs/authentic/event.dart'; export 'blocs/register/event.dart'; export 'blocs/register/state.dart'; export 'blocs/register/bloc.dart'; +export 'blocs/user/bloc.dart'; +export 'blocs/user/state.dart'; export 'views/mobile/user/page_item.dart'; export 'views/mobile/user/unit_drawer_header.dart'; export 'views/mobile/user/user_page.dart'; +export 'views/mobile/user/support_me.dart'; export 'views/mobile/login/login_page.dart'; export 'views/mobile/register/register_page.dart'; \ No newline at end of file diff --git a/modules/basic_system/authentication/lib/blocs/authentic/bloc.dart b/modules/basic_system/authentication/lib/blocs/authentic/bloc.dart new file mode 100644 index 00000000..5ce6c466 --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/authentic/bloc.dart @@ -0,0 +1,112 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:app/app.dart'; +import 'package:authentication/authentication.dart'; +import 'package:authentication/models/user.dart'; +import 'package:bloc/bloc.dart'; + +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:utils/utils.dart'; + +import 'event.dart'; +import 'state.dart'; + +class AuthBloc extends Bloc { + + final AuthRepository repository; + + AuthBloc({required this.repository}) : super(const AuthInitial()){ + on(_onAppStarted); + on(_onAuthByPassword); + on(_onAuthByRegister); + on(_onLoggedOut); + } + + void _onAppStarted(AuthEvent event, Emitter emit) async{ + SharedPreferences sp = await SharedPreferences.getInstance(); + + if (event is AppStarted) { + String? token = sp.getString(SpKey.tokenKey); + String? userJson = sp.getString(SpKey.userKey); + if (token != null && userJson != null) { + bool disable = JwtDecoder.isExpired(token); + if (!disable) { + HttpUtil.instance.setToken(token); + emit(AuthSuccess(User.fromJson(json.decode(userJson)))); + }else{ + // 说明 token 过期 + await _removeToken(sp); + await _removeUser(sp); + } + } + } + + if (event is Logout) { + + } + } + + // 持久化 token + Future _persistToken(String token,SharedPreferences sp) async { + await sp.setString(SpKey.tokenKey, token); + } + + + // 持久化 token + Future _removeToken(SharedPreferences sp) async { + await sp.remove(SpKey.tokenKey); + } + + // 持久化 token + Future _removeUser(SharedPreferences sp) async { + await sp.remove(SpKey.userKey); + } + + // 持久化 user + Future _persistUser(User user,SharedPreferences sp) async { + await sp.setString(SpKey.userKey, json.encode(user)); + } + + + + FutureOr _onAuthByPassword(AuthByPassword event, Emitter emit) async{ + emit (AuthLoading()); + await Future.delayed(const Duration(milliseconds: 500)); + TaskResult result = await repository.login(username: event.username, password: event.password); + + if (result.success&& result.data!=null) { + // 登录成功 + SharedPreferences sp = await SharedPreferences.getInstance(); + HttpUtil.instance.setToken(result.msg); + await _persistToken(result.msg,sp); + await _persistUser(result.data!,sp); + emit (AuthSuccess(result.data!)); + } else { + emit (const AuthFailure('用户名和密码不匹配')); + } + } + + FutureOr _onAuthByRegister(AuthByRegister event, Emitter emit) async{ + emit(AuthLoading()); + TaskResult result = await repository.register(email: event.email, code: event.code); + + // if(result.data == null){ + // emit(const RegisterError('注册失败')); + // }else{ + // if (result.data!=null&&result.data!) { + // // 注册成功 + // emit( RegisterSuccess(event.email)); + // }else{ + // emit( RegisterError(result.msg)); + // } + // } + } + + FutureOr _onLoggedOut(Logout event, Emitter emit) async{ + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.remove(SpKey.tokenKey); + emit(const AuthInitial()); + } +} diff --git a/modules/basic_system/authentication/lib/blocs/authentic/event.dart b/modules/basic_system/authentication/lib/blocs/authentic/event.dart new file mode 100644 index 00000000..1bfd237d --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/authentic/event.dart @@ -0,0 +1,46 @@ +import 'package:equatable/equatable.dart'; + +///********************************验证行为******************************** + +abstract class AuthEvent extends Equatable { + const AuthEvent(); + + @override + List get props => []; +} + +class AppStarted extends AuthEvent { + const AppStarted(); +} + +// 发送 邮箱验证 +class AuthByPassword extends AuthEvent { + final String username; + final String password; + + const AuthByPassword({required this.username,required this.password}); + + @override + List get props => [username,password]; +} + +// 用户注册也是认证的一部分 +class AuthByRegister extends AuthEvent{ + final String email; + final String code; + + const AuthByRegister(this.email, this.code); +} + +class Logout extends AuthEvent { + + final bool clearUser; + final bool tokenDisable; + + const Logout({this.clearUser=true,this.tokenDisable=false}); +} + +class TokenDisabled extends AuthEvent { + + const TokenDisabled(); +} \ No newline at end of file diff --git a/modules/basic_system/authentication/lib/blocs/authentic/state.dart b/modules/basic_system/authentication/lib/blocs/authentic/state.dart new file mode 100644 index 00000000..13a074b7 --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/authentic/state.dart @@ -0,0 +1,53 @@ + +import 'package:authentication/models/user.dart'; +import 'package:equatable/equatable.dart'; + +enum AuthType{ + login, + register, + visitor +} + +///********************************校验状态******************************** +abstract class AuthState extends Equatable { + const AuthState(); + @override + List get props => []; +} + +class AuthInitial extends AuthState { +const AuthInitial(); +} + + +class AuthFailure extends AuthState { + final String error; + + const AuthFailure(this.error); + + @override + List get props => [error]; + + @override + String toString() { + return 'AuthFailure{message: $error}'; + } +} + + +class LogOuted extends AuthState {} + +class AuthSuccess extends AuthState { + final User user; + + const AuthSuccess(this.user); + + @override + String toString() { + return 'AuthSuccess{loginResult: $user}'; + } +} + +class AuthLoading extends AuthState { + +} \ No newline at end of file diff --git a/modules/basic_system/authentication/lib/blocs/register/bloc.dart b/modules/basic_system/authentication/lib/blocs/register/bloc.dart new file mode 100644 index 00000000..51c03b35 --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/register/bloc.dart @@ -0,0 +1,37 @@ +// import 'package:authentication/authentication.dart'; +// import 'package:flutter_bloc/flutter_bloc.dart'; +// import 'package:utils/algorithm.dart'; +// +// import 'event.dart'; +// import 'state.dart'; +// +// /// create by 张风捷特烈 on 2021/1/17 +// /// contact me by email 1981462002@qq.com +// /// 说明: +// +// class RegisterBloc extends Bloc { +// final AuthRepository repository; +// +// RegisterBloc({required this.repository}) : super(RegisterNone()){ +// on(_onRegisterEvent); +// } +// +// void _onRegisterEvent(RegisterEvent event,Emitter emit) async { +// if (event is DoRegister) { +// emit(RegisterLoading()); +// TaskResult result = +// await repository.register(email: event.email, code: event.code); +// +// if(result.data == null){ +// emit(const RegisterError('注册失败')); +// }else{ +// if (result.data!=null&&result.data!) { +// // 注册成功 +// emit( RegisterSuccess(event.email)); +// }else{ +// emit( RegisterError(result.msg)); +// } +// } +// } +// } +// } diff --git a/modules/basic_system/authentication/lib/blocs/register/event.dart b/modules/basic_system/authentication/lib/blocs/register/event.dart new file mode 100644 index 00000000..fbbd19bb --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/register/event.dart @@ -0,0 +1,20 @@ +// import 'package:equatable/equatable.dart'; +// +// /// create by 张风捷特烈 on 2020-03-03 +// /// contact me by email 1981462002@qq.com +// /// 说明: +// +// abstract class RegisterEvent extends Equatable { +// const RegisterEvent(); +// +// @override +// List get props => []; +// } +// +// // 发送 邮箱验证 +// class DoRegister extends RegisterEvent { +// final String email; +// final String code; +// +// const DoRegister(this.email, this.code); +// } diff --git a/modules/basic_system/authentication/lib/blocs/register/state.dart b/modules/basic_system/authentication/lib/blocs/register/state.dart new file mode 100644 index 00000000..1389c43e --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/register/state.dart @@ -0,0 +1,46 @@ +// import 'package:equatable/equatable.dart'; +// +// /// create by 张风捷特烈 on 2020-03-03 +// /// contact me by email 1981462002@qq.com +// /// 说明: 主页 Widget 列表 状态类 +// +// abstract class RegisterState extends Equatable { +// const RegisterState(); +// +// @override +// List get props => []; +// } +// +// class RegisterLoading extends RegisterState { +// @override +// List get props => []; +// } +// +// class RegisterNone extends RegisterState { +// @override +// List get props => []; +// } +// +// +// class RegisterError extends RegisterState { +// final String message; +// +// const RegisterError(this.message); +// +// @override +// List get props => [message]; +// +// @override +// String toString() { +// return 'RegisterError{message: $message}'; +// } +// } +// +// class RegisterSuccess extends RegisterState { +// final String username; +// +// const RegisterSuccess(this.username); +// +// @override +// List get props => [username]; +// } diff --git a/modules/basic_system/authentication/lib/blocs/user/bloc.dart b/modules/basic_system/authentication/lib/blocs/user/bloc.dart new file mode 100644 index 00000000..35f81586 --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/user/bloc.dart @@ -0,0 +1,7 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'state.dart'; + +class UserBloc extends Cubit { + UserBloc() : super(UserPerformance.fromJson({})); +} diff --git a/modules/basic_system/authentication/lib/blocs/user/state.dart b/modules/basic_system/authentication/lib/blocs/user/state.dart new file mode 100644 index 00000000..a21bd989 --- /dev/null +++ b/modules/basic_system/authentication/lib/blocs/user/state.dart @@ -0,0 +1,82 @@ + + +class UserPerformance { + final String username; + final int userId; + final String phone; + final String email; + final int emailVerified; + final String weiChat; + final String avatar; + + + String get showEmail { + String prefix = email.split('@')[0]; + String tail = email.split('@')[1]; + String result = ''; + if (prefix.length > 8) { + result = + "${prefix.substring(0, 3)}***${prefix.substring(prefix.length - 2)}"; + } else { + result = prefix; + } + return '$result@$tail'; + } + + String get showPhone => + "${phone.substring(0, 3)}***${phone.substring(phone.length - 4)}"; + + UserPerformance({ + required this.username, + required this.userId, + required this.email, + required this.emailVerified, + required this.weiChat, + required this.phone, + required this.avatar, + }); + + UserPerformance copyWith({ + String? username, + int? userId, + String? phone, + String? avatar, + String? email, + int? emailVerified, + String? weiChat, + bool? hasPwd, + int? pollenCoin, + int? honeyCoin, + }) => + UserPerformance( + weiChat: weiChat ?? this.weiChat, + username: username ?? this.username, + userId: userId ?? this.userId, + phone: phone ?? this.phone, + avatar: avatar ?? this.avatar, + email: email ?? this.email, + emailVerified: emailVerified ?? this.emailVerified, + ); + + static UserPerformance fromJson(Map map) => UserPerformance( + username: map["username"] ?? '', + userId: map["userId"] ?? 0, + phone: map["phone"] ?? '', + avatar: map["avatar"] ?? '', + email: map["email"] ?? '', + weiChat: map["weiChat"] ?? '', + emailVerified: map["emailVerified"] ?? 0, + ); + + Map toJson() => { + "username": username, + "userId": userId, + "phone": phone, + "avatar": avatar, + "weiChat": weiChat, + "email": email, + "emailVerified": emailVerified, + }; + + +} \ No newline at end of file diff --git a/packages/authentication/lib/models/user.dart b/modules/basic_system/authentication/lib/models/user.dart similarity index 100% rename from packages/authentication/lib/models/user.dart rename to modules/basic_system/authentication/lib/models/user.dart diff --git a/packages/authentication/lib/repository/auth_repository.dart b/modules/basic_system/authentication/lib/repository/auth_repository.dart similarity index 99% rename from packages/authentication/lib/repository/auth_repository.dart rename to modules/basic_system/authentication/lib/repository/auth_repository.dart index 16d579f1..adcd817e 100644 --- a/packages/authentication/lib/repository/auth_repository.dart +++ b/modules/basic_system/authentication/lib/repository/auth_repository.dart @@ -3,6 +3,7 @@ import 'package:utils/utils.dart'; import '../models/user.dart'; abstract class AuthRepository { + // 用户登录接口 Future> login({ required String username, diff --git a/modules/basic_system/authentication/lib/repository/impl/http_auth_repository.dart b/modules/basic_system/authentication/lib/repository/impl/http_auth_repository.dart new file mode 100644 index 00000000..ccb37ac1 --- /dev/null +++ b/modules/basic_system/authentication/lib/repository/impl/http_auth_repository.dart @@ -0,0 +1,88 @@ +import 'package:authentication/models/user.dart'; + +import 'package:utils/src/http_utils/task_result.dart'; +import 'package:utils/utils.dart'; + +import '../auth_repository.dart'; + +const String kSendEmail = '/sendEmail/'; +const String kLogin = '/login'; +const String kRegister = '/register'; + +class HttpAuthRepository implements AuthRepository { + @override + Future> login({ + required String username, + required String password, + }) async { + String errorMsg = ""; + + try { + var result = await HttpUtil.instance.client.post( + kLogin, + data: { + "username": username, + "password": password, + }, + ); + + if (result.data != null) { + if (result.data['status']) { + return TaskResult( + msg: result.data['msg'], + data: User.fromJson(result.data['data']), + success: result.data['status'], + ); + } else { + return TaskResult( + msg: result.data['msg'], + data: null, + success: false, + ); + } + } + } catch (e) { + errorMsg = e.toString(); + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } + + @override + Future> register({ + required String email, + required String code, + }) async { + String errorMsg = ""; + + try { + var result = await HttpUtil.instance.client + .post(kRegister, data: {"email": email, "activeCode": code}); + + if (result.data != null) { + return TaskResult.success(data: result.data); + } + } catch (e) { + errorMsg = e.toString(); + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } + + @override + Future> sendEmail({required String email}) async { + try { + var result = await HttpUtil.instance.client.post(kSendEmail + email); + if (result.data != null) { + if(result.data['status']){ + return TaskResult.success(data: result.data); + }else{ + return TaskResult.error(msg: result.data['msg']); + } + } + } catch (e) { + print(e); + } + return const TaskResult.error(msg: '请求错误'); + } +} diff --git a/packages/authentication/lib/views/authentic_widget.dart b/modules/basic_system/authentication/lib/views/authentic_widget.dart similarity index 100% rename from packages/authentication/lib/views/authentic_widget.dart rename to modules/basic_system/authentication/lib/views/authentic_widget.dart diff --git a/packages/authentication/lib/views/mobile/login/login_form.dart b/modules/basic_system/authentication/lib/views/mobile/login/login_form.dart similarity index 86% rename from packages/authentication/lib/views/mobile/login/login_form.dart rename to modules/basic_system/authentication/lib/views/mobile/login/login_form.dart index 91aa2b2e..372f8f4e 100644 --- a/packages/authentication/lib/views/mobile/login/login_form.dart +++ b/modules/basic_system/authentication/lib/views/mobile/login/login_form.dart @@ -1,8 +1,8 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; import '../../../authentication.dart'; @@ -27,14 +27,14 @@ class _LoginFromState extends State { mainAxisSize: MainAxisSize.min, children: [ const Text( - "FlutterUnit 登录", + "Flutter Unit 登录", style: TextStyle(fontSize: 25), ), const SizedBox( height: 5, ), const Text( - "更多精彩,更多体验 ~", + "登录账号,更多精彩,更多体验 ~", style: TextStyle(color: Colors.grey), ), const SizedBox( @@ -50,33 +50,37 @@ class _LoginFromState extends State { child: Icon(_showPwd ? TolyIcon.icon_show : TolyIcon.icon_hide)) ], ), - Row( - children: [ - Checkbox(value: true, onChanged: (e) => {}), - const Text( - "自动登录", - style: TextStyle(color: Color(0xff444444), fontSize: 14), - ), - const Spacer(), - FeedbackWidget( - onEnd: () { - Navigator.of(context).pushReplacementNamed(UnitRouter.register); - }, - child: const Text( - "用户注册", - style: TextStyle( - color: Colors.blue, - fontSize: 14, - decoration: TextDecoration.underline), - ), - ) - ], - ), + // Row( + // children: [ + // Checkbox(value: true, onChanged: (e) => {}), + // const Text( + // "自动登录", + // style: TextStyle(color: Color(0xff444444), fontSize: 14), + // ), + // const Spacer(), + // + // ], + // ), BlocConsumer( listener: _listenLoginState, builder: _buildBtnByState, ), - buildOtherLogin(), + GestureDetector( + onTap: () { + // Navigator.of(context).pushReplacementNamed(UnitRouter.register); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: const Text( + "没有账号,立即注册", + style: TextStyle( + color: Colors.blue, + fontSize: 14, + decoration: TextDecoration.underline,decorationColor: Colors.blue), + ), + ), + ), + // buildOtherLogin(), const Spacer(flex: 4), ], ); @@ -242,11 +246,11 @@ class _LoginFromState extends State { elevation: 0, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(20))), - backgroundColor: Colors.blue.withOpacity(0.4), + backgroundColor: Colors.blue, ), onPressed: _doLogIn, child: const Text("进入 Unit 世界", - style: TextStyle(color: Colors.white, fontSize: 18)), + style: TextStyle(color: Colors.white, fontSize: 14,fontWeight: FontWeight.bold)), )); } diff --git a/modules/basic_system/authentication/lib/views/mobile/login/login_page.dart b/modules/basic_system/authentication/lib/views/mobile/login/login_page.dart new file mode 100644 index 00000000..ef87276c --- /dev/null +++ b/modules/basic_system/authentication/lib/views/mobile/login/login_page.dart @@ -0,0 +1,52 @@ +import 'package:authentication/authentication.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../register/arc_clipper.dart'; +import 'login_form.dart'; + +/// create by 张风捷特烈 on 2020/4/24 +/// contact me by email 1981462002@qq.com +/// 说明: + +// class AuthenticScope extends StatelessWidget { +// const AuthenticScope({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// final AuthRepository repository = context.read().repository; +// return MultiBlocProvider(providers: [ +// BlocProvider(create: (_) => RegisterBloc(repository: repository)), +// ], child: const LoginPage()); +// } +// } + +class LoginPage extends StatelessWidget { + const LoginPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Size winSize = MediaQuery.of(context).size; + + return Scaffold( + body: SingleChildScrollView( + child: Wrap(children: [ + Stack(children: [ + UnitArcBackground(height: winSize.height * 0.3), + const Positioned(top: 24, child: BackButton(color: Colors.white)), + ]), + Container( + // color: Colors.green, + height: winSize.height * 0.68, + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.only(left: 20.0, right: 20, top: 10), + child: Stack( + alignment: Alignment.center, + children: const [ + LoginFrom(), + ], + )) + ]), + )); + } +} diff --git a/packages/authentication/lib/views/mobile/register/arc_clipper.dart b/modules/basic_system/authentication/lib/views/mobile/register/arc_clipper.dart similarity index 97% rename from packages/authentication/lib/views/mobile/register/arc_clipper.dart rename to modules/basic_system/authentication/lib/views/mobile/register/arc_clipper.dart index c6ee159a..3f1a6689 100644 --- a/packages/authentication/lib/views/mobile/register/arc_clipper.dart +++ b/modules/basic_system/authentication/lib/views/mobile/register/arc_clipper.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/packages/authentication/lib/views/mobile/register/register_page.dart b/modules/basic_system/authentication/lib/views/mobile/register/register_page.dart similarity index 85% rename from packages/authentication/lib/views/mobile/register/register_page.dart rename to modules/basic_system/authentication/lib/views/mobile/register/register_page.dart index 5c937678..a4210538 100644 --- a/packages/authentication/lib/views/mobile/register/register_page.dart +++ b/modules/basic_system/authentication/lib/views/mobile/register/register_page.dart @@ -1,5 +1,5 @@ import 'package:authentication/authentication.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:utils/utils.dart'; @@ -46,24 +46,24 @@ class _RegisterPageState extends State { body: SingleChildScrollView( child: Wrap(children: [ Stack(children: [ - UnitArcBackground(height: winSize.height * 0.32), + UnitArcBackground(height: winSize.height * 0.30), const Positioned(top: 20, child: BackButton(color: Colors.white)), ]), Container( width: winSize.width, height: winSize.height * 0.68, - padding: const EdgeInsets.only(left: 20.0, right: 20, top: 20), + padding: const EdgeInsets.only(left: 20.0, right: 20, top: 10), child: Column( children: [ const Text( - "FlutterUnit 注册", + "Flutter Unit 注册", style: TextStyle(fontSize: 25), ), const SizedBox( height: 5, ), const Text( - "更多精彩,更多体验 ~", + "登录账号,更多精彩,更多体验 ~", style: TextStyle(color: Colors.grey), ), const Spacer( @@ -84,7 +84,7 @@ class _RegisterPageState extends State { buildInputWithSend(), const Spacer(flex: 1), _buildBtn(), - const Spacer(flex: 4), + const Spacer(flex: 6), ], )) ]), @@ -141,19 +141,19 @@ class _RegisterPageState extends State { margin: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 0), height: 40, width: MediaQuery.of(context).size.width, - child: BlocConsumer( + child: BlocConsumer( builder: _build, listener: _listener, ), ); void _doRegister() { - BlocProvider.of(context) - .add(DoRegister(_emailCtrl.text, _codeCtrl.text)); + BlocProvider.of(context) + .add(AuthByRegister(_emailCtrl.text, _codeCtrl.text)); } Widget _build(BuildContext context, state) { - bool enable = state is RegisterLoading || state is RegisterSuccess; + bool enable = state is AuthLoading || state is AuthSuccess; String info = enable ? '注册中...' : '开启 Unit 新世界'; return BlocListener( listener: _listenerLogin, @@ -170,22 +170,24 @@ class _RegisterPageState extends State { ), onPressed: (enable || !value) ? null : _doRegister, child: Text(info, - style: const TextStyle(color: Colors.white, fontSize: 18))); + style: TextStyle(color: Colors.white, fontSize: 14,fontWeight: FontWeight.bold)), + + ); }, )); } - void _listener(BuildContext context, RegisterState state) { - if (state is RegisterError) { - Toast.toast(context, '注册失败 : ${state.message}!', + void _listener(BuildContext context, AuthState state) { + if (state is AuthFailure) { + Toast.toast(context, '注册失败 : ${state.error}!', color: Colors.red, duration: const Duration(seconds: 2)); } - if (state is RegisterSuccess) { - BlocProvider.of(context).add(AuthByPassword( - username: _emailCtrl.text, - password: _codeCtrl.text, - )); + if (state is AuthSuccess) { + // BlocProvider.of(context).add(AuthByPassword( + // username: _emailCtrl.text, + // password: _codeCtrl.text, + // )); } } diff --git a/packages/authentication/lib/views/mobile/register/send_code.dart b/modules/basic_system/authentication/lib/views/mobile/register/send_code.dart similarity index 100% rename from packages/authentication/lib/views/mobile/register/send_code.dart rename to modules/basic_system/authentication/lib/views/mobile/register/send_code.dart diff --git a/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart b/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart new file mode 100644 index 00000000..5e6131eb --- /dev/null +++ b/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart @@ -0,0 +1,81 @@ +import 'package:app/app.dart'; +import 'package:app_update/views/update_red_point.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com +/// 说明: + +class MePageItem extends StatelessWidget { + final Color color; + + const MePageItem({Key? key, this.color = Colors.white}) : super(key: key); + + @override + Widget build(BuildContext context) { + return _buildChild(context); + } + + Widget _buildChild(BuildContext context) { + return ScrollConfiguration( + behavior: NoScrollBehavior(), + child: ListView( + padding: EdgeInsets.zero, + children: [ + const SizedBox( + height: 10, + ), + Gap.sfl10, + _buildItem(context, TolyIcon.icon_them, context.l10n.appSettings, AppRoute.settings.url), + const Divider(), + _buildItem( + context, TolyIcon.icon_layout, context.l10n.dataManagement, AppRoute.dataManage.url), + const Divider(), + _buildItem( + context, TolyIcon.icon_collect, context.l10n.userCollection, AppRoute.collection.url,), + Gap.sfl10, + + Stack( + children: [ + _buildItem( + context, + Icons.update, + context.l10n.versionInformation, + AppRoute.version.url, + ), + const Positioned(left: 40, top: 10, child: UpdateRedPoint()) + ], + ), + const Divider(), + _buildItem(context, Icons.info, context.l10n.aboutApplications, AppRoute.aboutApp.url), + + Gap.sfl10, + _buildItem(context, TolyIcon.icon_kafei, context.l10n.contactThisKing, AppRoute.aboutMe.url), + const Divider(), + _buildItem(context, Icons.sanitizer, context.l10n.homeAccountSupport, AppRoute.supportMe.url), + ], + ), + ); + } + + Widget _buildItem( + BuildContext context, IconData icon, String title, String linkTo, + {VoidCallback? onTap}) => + ListTile( + leading: Icon( + icon, + color: Theme.of(context).primaryColor, + ), + title: Text(title, style: const TextStyle(fontSize: 16)), + trailing: + Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), + onTap: () { + if (linkTo.isNotEmpty) { + context.push(linkTo); + if (onTap != null) onTap(); + } + }, + ); +} diff --git a/modules/basic_system/authentication/lib/views/mobile/user/support_me.dart b/modules/basic_system/authentication/lib/views/mobile/user/support_me.dart new file mode 100644 index 00000000..f6c8d095 --- /dev/null +++ b/modules/basic_system/authentication/lib/views/mobile/user/support_me.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; + +class SupportMe extends StatelessWidget { + const SupportMe({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 3, + child: Scaffold( + appBar: AppBar( + title: Column( + children: [ + Text(context.l10n.homeAccountSupport), + Text('开源不易, 请我喝咖啡~',style: TextStyle(fontSize: 12,fontWeight: FontWeight.normal),), + ], + ), + bottom: TabBar( + tabs: [ + Tab( + text: '支付宝', + ), + Tab( + text: '微信1', + ), + Tab( + text: '微信2', + ), + ], + ), + ), + body: TabBarView( + children: [ + Image.asset( + 'assets/images/coffee_zfb.webp', + ), + Image.asset('assets/images/coffee_wx.webp'), + Image.asset('assets/images/coffee_wx_ac.webp'), + ], + ), + ), + ); + } +} + diff --git a/packages/authentication/lib/views/mobile/user/unit_drawer_header.dart b/modules/basic_system/authentication/lib/views/mobile/user/unit_drawer_header.dart similarity index 100% rename from packages/authentication/lib/views/mobile/user/unit_drawer_header.dart rename to modules/basic_system/authentication/lib/views/mobile/user/unit_drawer_header.dart diff --git a/modules/basic_system/authentication/lib/views/mobile/user/user_account.dart b/modules/basic_system/authentication/lib/views/mobile/user/user_account.dart new file mode 100644 index 00000000..c60c09dd --- /dev/null +++ b/modules/basic_system/authentication/lib/views/mobile/user/user_account.dart @@ -0,0 +1,415 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:authentication/blocs/authentic/bloc.dart'; +import 'package:authentication/blocs/user/bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../blocs/authentic/event.dart'; +import '../../../blocs/user/state.dart'; + +class UserAccountPage extends StatelessWidget { + const UserAccountPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Icon trailing = const Icon( + Icons.navigate_next, + color: Color(0xffD9D9D9), + ); + Color? color = Theme.of(context).listTileTheme.tileColor; + Color? sbgColor = Theme.of(context).appBarTheme.backgroundColor; + Color? bgColor = Theme.of(context).scaffoldBackgroundColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + + UserPerformance performance = context.select( + (bloc) => bloc.state, + ); + return Scaffold( + backgroundColor: isDark ? null : bgColor, + appBar: AppBar( + backgroundColor: isDark ? null : sbgColor, + title: const Text( + '账号资料', + ), + ), + body: Column( + children: [ + const SizedBox( + height: 10, + ), + GestureDetector( + onTap: () => _showPicker(context), + child: Container( + color: color, + height: 64, + child: Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 15), + width: 120, + child: const Text('头像')), + const Spacer(), + // AuthUserAvatar( + // size: 50, + // borderSize: 2, + // ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: trailing, + ) + ], + ), + ), + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + GestureDetector( + onTap: () { + // LoggingUploader.onEvent(kSetNameAction, kMyInfoPageName); + // Navigator.push( + // context, + // Right2LeftRouter( + // duration: Duration(milliseconds: 200), + // child: UserChangeNamePage( + // name: performance.username, + // ))); + }, + child: Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 15), + width: 120, + child: const Text('昵称')), + const Spacer(), + Text( + performance.username ?? '', + style: const TextStyle(color: Colors.grey), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: trailing, + ) + ], + ), + ), + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 15), + width: 120, + child: const Text('箴言')), + const Spacer(), + const Text( + // '${performance.userId}', + '海的彼岸,有我未曾见证的风采。', style: TextStyle(color: Colors.grey,fontSize: 12), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ), + + // const SizedBox( + // height: 10, + // ), + + // Container( + // color: color, + // height: 54, + // child: Row( + // children: [ + // Container( + // padding: EdgeInsets.only(left: 15), + // width: 120, + // child: Text('免费蜂蜜/日')), + // Spacer(), + // Text( + // '${ 0}', + // style: TextStyle(color: Colors.grey), + // ), + // Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12), + // child: Icon( + // Icons.arrow_forward_ios_sharp, + // size: 20, + // color: Colors.transparent, + // ), + // ) + // ], + // ), + // ), + // Divider( + // height: 1 / window.devicePixelRatio, + // thickness: 1 / window.devicePixelRatio, + // ), + // Container( + // color: color, + // height: 54, + // child: Row( + // children: [ + // Container( + // padding: EdgeInsets.only(left: 15), + // width: 120, + // child: Text('蜂蜜')), + // Spacer(), + // Text( + // '${0}', + // style: TextStyle(color: Colors.grey), + // ), + // Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12), + // child: Icon( + // Icons.arrow_forward_ios_sharp, + // size: 20, + // color: Colors.transparent, + // ), + // ) + // ], + // ), + // ), + + const SizedBox( + height: 10, + ), + Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 15), + width: 120, + child: const Text('账号')), + const Spacer(), + const Text( + // '${performance.userId}', + '******', style: TextStyle(color: Colors.grey,fontSize: 12), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ), + const SizedBox( + height: 10, + ), + ListTile( + title: const Center( + child: Text( + '退出登录', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + )), + + // trailing: _nextIcon(context), + onTap: () { + showDialog( + context: context, + builder: (ctx) => AlertConformDialog( + title: "登出提示", + content: "退出后将无法使用用户相关的功能,确定退出登录吗?", + conformText: '确定', + onConform: () async { + context.read().add(const Logout()); + // Navigator.of(context).pushAndRemoveUntil( + // NoAnimRouter(AuthRelation( + // pushLogin: false, + // child: MoAILoginPage( + // model: LoginModel( + // appName: "蜜蜂AI智能助手", + // appNameEn: + // "Bee Chat AI Intelligence Assistant", + // appIcon: Icons.widgets_outlined, + // loginBgAssets: "assets/images/login_bg.png"), + // ), + // )), + // ModalRoute.withName('/'), + // ); + return true; + })); + }, + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + // const SizedBox( + // height: 10, + // ), + // if(false) + ListTile( + title: const Center( + child: Text( + '删除账号', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: Colors.redAccent), + )), + + // trailing: _nextIcon(context), + onTap: () { + String msg = + "确定删除账号吗?删除后你将无法再访问蜜蜂 ai 提供的智能服务,并清空你的所有账号资料,点击确定删除。"; + showDialog( + context: context, + builder: (ctx) => Dialog( + child: MobileMessagePanel( + title: '清空提示', + conformText: '确定', + msg: msg, + task: (_) async { + // await Future.delayed(Duration(seconds: 3)); + // await context.read().repo.unregister(); + // + context.read().add(const Logout()); + + // Navigator.of(context).pushAndRemoveUntil( + // NoAnimRouter(AuthRelation( + // pushLogin: false, + // child: MoAILoginPage( + // model: LoginModel( + // appName: "蜜蜂AI智能助手", + // appNameEn: + // "Bee Chat AI Intelligence Assistant", + // appIcon: Icons.widgets_outlined, + // loginBgAssets: + // "assets/images/login_bg.png"), + // ), + // )), + // ModalRoute.withName('/'), + // ); + }, + ), + )); + }, + ), + ], + ), + ); + } + + void _showPicker(BuildContext context) async { + // FilePickerResult? result = + // await FilePicker.platform.pickFiles(type: FileType.image); + // if (result != null) { + // String? p = result.files.single.path; + // if (p != null) { + // // File file = File(p); + // // Share.shareXFiles([XFile(file.path)], text: 'Great picture'); + // Navigator.push( + // context, + // NoAnimRouter(ClipImagePage( + // image: FileImage(File(p)), + // ))); + // } + // } + // // showCupertinoModalPopup( + // // context: context, + // // builder: (ctx) => ClipRRect( + // // borderRadius: BorderRadius.only( + // // topLeft: Radius.circular(10), + // // topRight: Radius.circular(10), + // // ), + // // child: SizedBox( + // // width: 500, + // // child: AsyncPopPicker( + // // title: Text( + // // '更换头像', + // // style: TextStyle(color: Colors.grey), + // // ), + // // tasks: [ + // // AsyncPopItem( + // // task: () async { + // // try { + // // FilePickerResult? result = await FilePicker.platform + // // .pickFiles(type: FileType.image); + // // if (result != null) { + // // String? p = result.files.single.path; + // // if (p != null) { + // // // File file = File(p); + // // // Share.shareXFiles([XFile(file.path)], text: 'Great picture'); + // // Navigator.push( + // // context, + // // NoAnimRouter(ClipImagePage( + // // image: FileImage(File(p)), + // // ))); + // // } + // // } + // // } catch (e) { + // // Toast.warning("当前应用没有文件读写权限,请先在权限管理中允许!"); + // // } + // // }, + // // info: '从相册选取', + // // ), + // // ], + // // ), + // // ), + // // )); + } +} + +class UserItemPanel extends StatelessWidget { + final String label; + final String value; + final Color? color; + const UserItemPanel( + {Key? key, required this.label, required this.value, required this.color}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: color, + height: 54, + child: Row( + children: [ + Expanded( + child: Container( + padding: const EdgeInsets.only(left: 15), child: Text(label)), + ), + Text( + value, + style: const TextStyle(color: Colors.grey), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ); + } +} diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/modules/basic_system/authentication/lib/views/mobile/user/user_page.dart similarity index 87% rename from packages/authentication/lib/views/mobile/user/user_page.dart rename to modules/basic_system/authentication/lib/views/mobile/user/user_page.dart index a6223b4a..6cbe82fc 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/modules/basic_system/authentication/lib/views/mobile/user/user_page.dart @@ -1,10 +1,11 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; +import 'package:authentication/views/mobile/user/user_account.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import '../../../authentication.dart'; @@ -19,12 +20,11 @@ class UserPage extends StatelessWidget { @override Widget build(BuildContext context) { - AppStyle style = context.read().state.appStyle; + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'anim_draw.webp':'base_draw.webp'; return Scaffold( body: AnnotatedRegion( - value:const SystemUiOverlayStyle( - statusBarIconBrightness: Brightness.dark - ), + value:Theme.of(context).appBarTheme.systemOverlayStyle!, child: Column( children: [ Stack( @@ -34,9 +34,7 @@ class UserPage extends StatelessWidget { width: MediaQuery.of(context).size.width, margin: const EdgeInsets.only(bottom: 40), child: Image.asset( - style == AppStyle.standard - ? 'assets/images/base_draw.webp' - : 'assets/images/sabar_bar.webp', + 'assets/images/$image', fit: BoxFit.cover, ), ), @@ -99,7 +97,7 @@ class UserPage extends StatelessWidget { if (state is AuthSuccess) { return FeedbackWidget( onEnd: () { - // Navigator.of(context).pushNamed(UnitRouter.login); + Navigator.of(context).push(SlidePageRoute(child: UserAccountPage())); }, child: CircleImage( size: 80, diff --git a/modules/basic_system/authentication/pubspec.yaml b/modules/basic_system/authentication/pubspec.yaml new file mode 100644 index 00000000..258aaa06 --- /dev/null +++ b/modules/basic_system/authentication/pubspec.yaml @@ -0,0 +1,66 @@ +name: authentication +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + flutter_bloc: ^8.1.6 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + shared_preferences: ^2.2.1 # xml 固化 + go_router: ^14.2.0 + utils: + path: ../utils + app_update: + path: ../app_update + app: + path: ../app + l10n: + path: ../l10n + components: + path: ../components + toly_ui: + path: ../toly_ui + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/authentication/test/authentication_test.dart b/modules/basic_system/authentication/test/authentication_test.dart similarity index 100% rename from packages/authentication/test/authentication_test.dart rename to modules/basic_system/authentication/test/authentication_test.dart diff --git a/packages/components/.gitignore b/modules/basic_system/components/.gitignore similarity index 100% rename from packages/components/.gitignore rename to modules/basic_system/components/.gitignore diff --git a/packages/components/.metadata b/modules/basic_system/components/.metadata similarity index 100% rename from packages/components/.metadata rename to modules/basic_system/components/.metadata diff --git a/packages/components/CHANGELOG.md b/modules/basic_system/components/CHANGELOG.md similarity index 100% rename from packages/components/CHANGELOG.md rename to modules/basic_system/components/CHANGELOG.md diff --git a/packages/components/LICENSE b/modules/basic_system/components/LICENSE similarity index 100% rename from packages/components/LICENSE rename to modules/basic_system/components/LICENSE diff --git a/packages/components/README.md b/modules/basic_system/components/README.md similarity index 100% rename from packages/components/README.md rename to modules/basic_system/components/README.md diff --git a/packages/components/analysis_options.yaml b/modules/basic_system/components/analysis_options.yaml similarity index 100% rename from packages/components/analysis_options.yaml rename to modules/basic_system/components/analysis_options.yaml diff --git a/modules/basic_system/components/lib/components.dart b/modules/basic_system/components/lib/components.dart new file mode 100644 index 00000000..6cf8fda4 --- /dev/null +++ b/modules/basic_system/components/lib/components.dart @@ -0,0 +1,4 @@ +library components; + +export 'flutter_ui/flutter_ui.dart'; +export 'project_ui/project_ui.dart'; \ No newline at end of file diff --git a/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart b/modules/basic_system/components/lib/flutter_ui/diy_flexible_space_bar.dart similarity index 99% rename from packages/components/lib/flutter_ui/diy_flexible_space_bar.dart rename to modules/basic_system/components/lib/flutter_ui/diy_flexible_space_bar.dart index 3dcd2854..34075ef0 100644 --- a/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart +++ b/modules/basic_system/components/lib/flutter_ui/diy_flexible_space_bar.dart @@ -270,7 +270,7 @@ class _DiyFlexibleSpaceBarState extends State { final double opacity = settings.toolbarOpacity; if (opacity > 0.0) { - TextStyle titleStyle = theme.primaryTextTheme.headline6!; + TextStyle titleStyle = theme.primaryTextTheme.headlineSmall!; titleStyle = titleStyle.copyWith( color: titleStyle.color!.withOpacity(opacity), ); diff --git a/packages/components/lib/flutter_ui/flutter_ui.dart b/modules/basic_system/components/lib/flutter_ui/flutter_ui.dart similarity index 100% rename from packages/components/lib/flutter_ui/flutter_ui.dart rename to modules/basic_system/components/lib/flutter_ui/flutter_ui.dart diff --git a/packages/components/lib/flutter_ui/no_div_expansion_tile.dart b/modules/basic_system/components/lib/flutter_ui/no_div_expansion_tile.dart similarity index 95% rename from packages/components/lib/flutter_ui/no_div_expansion_tile.dart rename to modules/basic_system/components/lib/flutter_ui/no_div_expansion_tile.dart index 029ab797..a43a0a8f 100644 --- a/packages/components/lib/flutter_ui/no_div_expansion_tile.dart +++ b/modules/basic_system/components/lib/flutter_ui/no_div_expansion_tile.dart @@ -107,7 +107,7 @@ class _NoBorderExpansionTileState extends State with Sing _iconColor = _controller.drive(_iconColorTween.chain(_easeInTween)); _backgroundColor = _controller.drive(_backgroundColorTween.chain(_easeOutTween)); - _isExpanded = PageStorage.of(context)?.readState(context) ?? widget.initiallyExpanded; + _isExpanded = PageStorage.of(context).readState(context) ?? widget.initiallyExpanded; if (_isExpanded) { _controller.value = 1.0; } @@ -135,7 +135,7 @@ class _NoBorderExpansionTileState extends State with Sing }); }); } - PageStorage.of(context)?.writeState(context, _isExpanded); + PageStorage.of(context).writeState(context, _isExpanded); }); widget.onExpansionChanged?.call(_isExpanded); } @@ -179,11 +179,11 @@ class _NoBorderExpansionTileState extends State with Sing _borderColorTween .end = theme.dividerColor; _headerColorTween - ..begin = theme.textTheme.subtitle1!.color - ..end = theme.accentColor; + ..begin = theme.textTheme.bodyMedium?.color + ..end = theme.primaryColor; _iconColorTween ..begin = theme.unselectedWidgetColor - ..end = theme.accentColor; + ..end = theme.primaryColor; _backgroundColorTween .end = widget.backgroundColor; super.didChangeDependencies(); diff --git a/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart b/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart new file mode 100644 index 00000000..7d7bc385 --- /dev/null +++ b/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart @@ -0,0 +1,2910 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math' as math; + +import 'package:flutter/gestures.dart' show DragStartBehavior; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +const Size _calendarPortraitDialogSize = Size(330.0, 518.0); +const Size _calendarLandscapeDialogSize = Size(496.0, 346.0); +const Size _inputPortraitDialogSize = Size(330.0, 270.0); +const Size _inputLandscapeDialogSize = Size(496, 160.0); +const Size _inputRangeLandscapeDialogSize = Size(496, 164.0); +const Duration _dialogSizeAnimationDuration = Duration(milliseconds: 200); +const double _inputFormPortraitHeight = 98.0; +const double _inputFormLandscapeHeight = 108.0; + +/// Shows a dialog containing a Material Design date picker. +/// +/// The returned [Future] resolves to the date selected by the user when the +/// user confirms the dialog. If the user cancels the dialog, null is returned. +/// +/// When the date picker is first displayed, it will show the month of +/// [initialDate], with [initialDate] selected. +/// +/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest +/// allowable date. [initialDate] must either fall between these dates, +/// or be equal to one of them. For each of these [DateTime] parameters, only +/// their dates are considered. Their time fields are ignored. They must all +/// be non-null. +/// +/// The [currentDate] represents the current day (i.e. today). This +/// date will be highlighted in the day grid. If null, the date of +/// `DateTime.now()` will be used. +/// +/// An optional [initialEntryMode] argument can be used to display the date +/// picker in the [DatePickerEntryMode.calendar] (a calendar month grid) +/// or [DatePickerEntryMode.input] (a text input field) mode. +/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. +/// +/// An optional [selectableDayPredicate] function can be passed in to only allow +/// certain days for selection. If provided, only the days that +/// [selectableDayPredicate] returns true for will be selectable. For example, +/// this can be used to only allow weekdays for selection. If provided, it must +/// return true for [initialDate]. +/// +/// The following optional string parameters allow you to override the default +/// text used for various parts of the dialog: +/// +/// * [helpText], label displayed at the top of the dialog. +/// * [cancelText], label on the cancel button. +/// * [confirmText], label on the ok button. +/// * [errorFormatText], message used when the input text isn't in a proper date format. +/// * [errorInvalidText], message used when the input text isn't a selectable date. +/// * [fieldHintText], text used to prompt the user when no text has been entered in the field. +/// * [fieldLabelText], label for the date text input field. +/// +/// An optional [locale] argument can be used to set the locale for the date +/// picker. It defaults to the ambient locale provided by [Localizations]. +/// +/// An optional [textDirection] argument can be used to set the text direction +/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It +/// defaults to the ambient text direction provided by [Directionality]. If both +/// [locale] and [textDirection] are non-null, [textDirection] overrides the +/// direction chosen for the [locale]. +/// +/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to +/// [showDialog], the documentation for which discusses how it is used. [context] +/// and [useRootNavigator] must be non-null. +/// +/// The [builder] parameter can be used to wrap the dialog widget +/// to add inherited widgets like [Theme]. +/// +/// An optional [initialDatePickerMode] argument can be used to have the +/// calendar date picker initially appear in the [DatePickerMode.year] or +/// [DatePickerMode.day] mode. It defaults to [DatePickerMode.day], and +/// must be non-null. +/// +/// {@macro flutter.widgets.RawDialogRoute} +/// +/// ### State Restoration +/// +/// Using this method will not enable state restoration for the date picker. +/// In order to enable state restoration for a date picker, use +/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with +/// [DatePickerDialog]. +/// +/// For more information about state restoration, see [RestorationManager]. +/// +/// {@macro flutter.widgets.RestorationManager} +/// +/// {@tool dartpad} +/// This sample demonstrates how to create a restorable Material date picker. +/// This is accomplished by enabling state restoration by specifying +/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to +/// push [DatePickerDialog] when the button is tapped. +/// +/// ** See code in examples/api/lib/material/date_picker/show_date_picker.0.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [showDateRangePicker], which shows a Material Design date range picker +/// used to select a range of dates. +/// * [CalendarDatePicker], which provides the calendar grid used by the date picker dialog. +/// * [InputDatePickerFormField], which provides a text input field for entering dates. +/// * [DisplayFeatureSubScreen], which documents the specifics of how +/// [DisplayFeature]s can split the screen into sub-screens. +/// * [showTimePicker], which shows a dialog that contains a Material Design time picker. +/// +Future showDatePicker({ + required BuildContext context, + required DateTime initialDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, + SelectableDayPredicate? selectableDayPredicate, + String? helpText, + String? cancelText, + String? confirmText, + Locale? locale, + bool useRootNavigator = true, + RouteSettings? routeSettings, + TextDirection? textDirection, + TransitionBuilder? builder, + DatePickerMode initialDatePickerMode = DatePickerMode.day, + String? errorFormatText, + String? errorInvalidText, + String? fieldHintText, + String? fieldLabelText, + TextInputType? keyboardType, + Offset? anchorPoint, +}) async { + assert(context != null); + assert(initialDate != null); + assert(firstDate != null); + assert(lastDate != null); + initialDate = DateUtils.dateOnly(initialDate); + firstDate = DateUtils.dateOnly(firstDate); + lastDate = DateUtils.dateOnly(lastDate); + assert( + !lastDate.isBefore(firstDate), + 'lastDate $lastDate must be on or after firstDate $firstDate.', + ); + assert( + !initialDate.isBefore(firstDate), + 'initialDate $initialDate must be on or after firstDate $firstDate.', + ); + assert( + !initialDate.isAfter(lastDate), + 'initialDate $initialDate must be on or before lastDate $lastDate.', + ); + assert( + selectableDayPredicate == null || selectableDayPredicate(initialDate), + 'Provided initialDate $initialDate must satisfy provided selectableDayPredicate.', + ); + assert(initialEntryMode != null); + assert(useRootNavigator != null); + assert(initialDatePickerMode != null); + assert(debugCheckHasMaterialLocalizations(context)); + + Widget dialog = DatePickerDialog( + initialDate: initialDate, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + initialEntryMode: initialEntryMode, + selectableDayPredicate: selectableDayPredicate, + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + initialCalendarMode: initialDatePickerMode, + errorFormatText: errorFormatText, + errorInvalidText: errorInvalidText, + fieldHintText: fieldHintText, + fieldLabelText: fieldLabelText, + keyboardType: keyboardType, + ); + + if (textDirection != null) { + dialog = Directionality( + textDirection: textDirection, + child: dialog, + ); + } + + if (locale != null) { + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + } + + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + routeSettings: routeSettings, + builder: (BuildContext context) { + return builder == null ? dialog : builder(context, dialog); + }, + anchorPoint: anchorPoint, + ); +} + +/// A Material-style date picker dialog. +/// +/// It is used internally by [showDatePicker] or can be directly pushed +/// onto the [Navigator] stack to enable state restoration. See +/// [showDatePicker] for a state restoration app example. +/// +/// See also: +/// +/// * [showDatePicker], which is a way to display the date picker. +class DatePickerDialog extends StatefulWidget { + /// A Material-style date picker dialog. + DatePickerDialog({ + super.key, + required DateTime initialDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + this.initialEntryMode = DatePickerEntryMode.calendar, + this.selectableDayPredicate, + this.cancelText, + this.confirmText, + this.helpText, + this.initialCalendarMode = DatePickerMode.day, + this.errorFormatText, + this.errorInvalidText, + this.fieldHintText, + this.fieldLabelText, + this.keyboardType, + this.restorationId, + }) : assert(initialDate != null), + assert(firstDate != null), + assert(lastDate != null), + initialDate = DateUtils.dateOnly(initialDate), + firstDate = DateUtils.dateOnly(firstDate), + lastDate = DateUtils.dateOnly(lastDate), + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()), + assert(initialEntryMode != null), + assert(initialCalendarMode != null) { + assert( + !this.lastDate.isBefore(this.firstDate), + 'lastDate ${this.lastDate} must be on or after firstDate ${this.firstDate}.', + ); + assert( + !this.initialDate.isBefore(this.firstDate), + 'initialDate ${this.initialDate} must be on or after firstDate ${this.firstDate}.', + ); + assert( + !this.initialDate.isAfter(this.lastDate), + 'initialDate ${this.initialDate} must be on or before lastDate ${this.lastDate}.', + ); + assert( + selectableDayPredicate == null || selectableDayPredicate!(this.initialDate), + 'Provided initialDate ${this.initialDate} must satisfy provided selectableDayPredicate', + ); + } + + /// The initially selected [DateTime] that the picker should display. + final DateTime initialDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// The [DateTime] representing today. It will be highlighted in the day grid. + final DateTime currentDate; + + /// The initial mode of date entry method for the date picker dialog. + /// + /// See [DatePickerEntryMode] for more details on the different data entry + /// modes available. + final DatePickerEntryMode initialEntryMode; + + /// Function to provide full control over which [DateTime] can be selected. + final SelectableDayPredicate? selectableDayPredicate; + + /// The text that is displayed on the cancel button. + final String? cancelText; + + /// The text that is displayed on the confirm button. + final String? confirmText; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String? helpText; + + /// The initial display of the calendar picker. + final DatePickerMode initialCalendarMode; + + /// The error text displayed if the entered date is not in the correct format. + final String? errorFormatText; + + /// The error text displayed if the date is not valid. + /// + /// A date is not valid if it is earlier than [firstDate], later than + /// [lastDate], or doesn't pass the [selectableDayPredicate]. + final String? errorInvalidText; + + /// The hint text displayed in the [TextField]. + /// + /// If this is null, it will default to the date format string. For example, + /// 'mm/dd/yyyy' for en_US. + final String? fieldHintText; + + /// The label text displayed in the [TextField]. + /// + /// If this is null, it will default to the words representing the date format + /// string. For example, 'Month, Day, Year' for en_US. + final String? fieldLabelText; + + /// The keyboard type of the [TextField]. + /// + /// If this is null, it will default to [TextInputType.datetime] + final TextInputType? keyboardType; + + /// Restoration ID to save and restore the state of the [DatePickerDialog]. + /// + /// If it is non-null, the date picker will persist and restore the + /// date selected on the dialog. + /// + /// The state of this widget is persisted in a [RestorationBucket] claimed + /// from the surrounding [RestorationScope] using the provided restoration ID. + /// + /// See also: + /// + /// * [RestorationManager], which explains how state restoration works in + /// Flutter. + final String? restorationId; + + @override + State createState() => _DatePickerDialogState(); +} + +class _DatePickerDialogState extends State with RestorationMixin { + late final RestorableDateTime _selectedDate = RestorableDateTime(widget.initialDate); + late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); + final _RestorableAutovalidateMode _autovalidateMode = _RestorableAutovalidateMode(AutovalidateMode.disabled); + + @override + String? get restorationId => widget.restorationId; + + @override + void restoreState(RestorationBucket? oldBucket, bool initialRestore) { + registerForRestoration(_selectedDate, 'selected_date'); + registerForRestoration(_autovalidateMode, 'autovalidateMode'); + registerForRestoration(_entryMode, 'calendar_entry_mode'); + } + + final GlobalKey _calendarPickerKey = GlobalKey(); + final GlobalKey _formKey = GlobalKey(); + + void _handleOk() { + if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { + final FormState form = _formKey.currentState!; + if (!form.validate()) { + setState(() => _autovalidateMode.value = AutovalidateMode.always); + return; + } + form.save(); + } + Navigator.pop(context, _selectedDate.value); + } + + void _handleCancel() { + Navigator.pop(context); + } + + void _handleEntryModeToggle() { + setState(() { + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + _autovalidateMode.value = AutovalidateMode.disabled; + _entryMode.value = DatePickerEntryMode.input; + break; + case DatePickerEntryMode.input: + _formKey.currentState!.save(); + _entryMode.value = DatePickerEntryMode.calendar; + break; + case DatePickerEntryMode.calendarOnly: + case DatePickerEntryMode.inputOnly: + assert(false, 'Can not change entry mode from _entryMode'); + break; + } + }); + } + + void _handleDateChanged(DateTime date) { + setState(() { + _selectedDate.value = date; + }); + } + + Size _dialogSize(BuildContext context) { + final Orientation orientation = MediaQuery.of(context).orientation; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + case DatePickerEntryMode.calendarOnly: + switch (orientation) { + case Orientation.portrait: + return _calendarPortraitDialogSize; + case Orientation.landscape: + return _calendarLandscapeDialogSize; + } + case DatePickerEntryMode.input: + case DatePickerEntryMode.inputOnly: + switch (orientation) { + case Orientation.portrait: + return _inputPortraitDialogSize; + case Orientation.landscape: + return _inputLandscapeDialogSize; + } + } + } + + static const Map _formShortcutMap = { + // Pressing enter on the field will move focus to the next field or control. + SingleActivator(LogicalKeyboardKey.enter): NextFocusIntent(), + }; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + // Constrain the textScaleFactor to the largest supported value to prevent + // layout issues. + final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.3); + + final String dateText = localizations.formatMediumDate(_selectedDate.value); + final Color onPrimarySurface = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final TextStyle? dateStyle = orientation == Orientation.landscape + ? textTheme.headlineMedium?.copyWith(color: onPrimarySurface) + : textTheme.headlineMedium?.copyWith(color: onPrimarySurface); + + final Widget actions = Container( + alignment: AlignmentDirectional.centerEnd, + constraints: const BoxConstraints(minHeight: 52.0), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: OverflowBar( + spacing: 8, + children: [ + TextButton( + onPressed: _handleCancel, + child: Text(widget.cancelText ?? localizations.cancelButtonLabel), + ), + TextButton( + onPressed: _handleOk, + child: Text(widget.confirmText ?? localizations.okButtonLabel), + ), + ], + ), + ); + + CalendarDatePicker calendarDatePicker() { + return CalendarDatePicker( + key: _calendarPickerKey, + initialDate: _selectedDate.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + currentDate: widget.currentDate, + onDateChanged: _handleDateChanged, + selectableDayPredicate: widget.selectableDayPredicate, + initialCalendarMode: widget.initialCalendarMode, + ); + } + + Form inputDatePicker() { + return Form( + key: _formKey, + autovalidateMode: _autovalidateMode.value, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: orientation == Orientation.portrait ? _inputFormPortraitHeight : _inputFormLandscapeHeight, + child: Shortcuts( + shortcuts: _formShortcutMap, + child: Column( + children: [ + const Spacer(), + InputDatePickerFormField( + initialDate: _selectedDate.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + onDateSubmitted: _handleDateChanged, + onDateSaved: _handleDateChanged, + selectableDayPredicate: widget.selectableDayPredicate, + errorFormatText: widget.errorFormatText, + errorInvalidText: widget.errorInvalidText, + fieldHintText: widget.fieldHintText, + fieldLabelText: widget.fieldLabelText, + keyboardType: widget.keyboardType, + autofocus: true, + ), + const Spacer(), + ], + ), + ), + ), + ); + } + + final Widget picker; + final Widget? entryModeButton; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + picker = calendarDatePicker(); + entryModeButton = IconButton( + icon: const Icon(Icons.edit), + color: onPrimarySurface, + tooltip: localizations.inputDateModeButtonLabel, + onPressed: _handleEntryModeToggle, + ); + break; + + case DatePickerEntryMode.calendarOnly: + picker = calendarDatePicker(); + entryModeButton = null; + break; + + case DatePickerEntryMode.input: + picker = inputDatePicker(); + entryModeButton = IconButton( + icon: const Icon(Icons.calendar_today), + color: onPrimarySurface, + tooltip: localizations.calendarModeButtonLabel, + onPressed: _handleEntryModeToggle, + ); + break; + + case DatePickerEntryMode.inputOnly: + picker = inputDatePicker(); + entryModeButton = null; + break; + } + + final Widget header = _DatePickerHeader( + helpText: widget.helpText ?? localizations.datePickerHelpText, + titleText: dateText, + titleStyle: dateStyle, + orientation: orientation, + isShort: orientation == Orientation.landscape, + entryModeButton: entryModeButton, + ); + + final Size dialogSize = _dialogSize(context) * textScaleFactor; + return Dialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0), + clipBehavior: Clip.antiAlias, + child: AnimatedContainer( + width: dialogSize.width, + height: dialogSize.height, + duration: _dialogSizeAnimationDuration, + curve: Curves.easeIn, + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaleFactor: textScaleFactor, + ), + child: Builder(builder: (BuildContext context) { + switch (orientation) { + case Orientation.portrait: + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Expanded(child: picker), + actions, + ], + ); + case Orientation.landscape: + return Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Flexible( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded(child: picker), + actions, + ], + ), + ), + ], + ); + } + }), + ), + ), + ); + } +} + +// A restorable [DatePickerEntryMode] value. +// +// This serializes each entry as a unique `int` value. +class _RestorableDatePickerEntryMode extends RestorableValue { + _RestorableDatePickerEntryMode( + DatePickerEntryMode defaultValue, + ) : _defaultValue = defaultValue; + + final DatePickerEntryMode _defaultValue; + + @override + DatePickerEntryMode createDefaultValue() => _defaultValue; + + @override + void didUpdateValue(DatePickerEntryMode? oldValue) { + assert(debugIsSerializableForRestoration(value.index)); + notifyListeners(); + } + + @override + DatePickerEntryMode fromPrimitives(Object? data) => DatePickerEntryMode.values[data! as int]; + + @override + Object? toPrimitives() => value.index; +} + +// A restorable [AutovalidateMode] value. +// +// This serializes each entry as a unique `int` value. +class _RestorableAutovalidateMode extends RestorableValue { + _RestorableAutovalidateMode( + AutovalidateMode defaultValue, + ) : _defaultValue = defaultValue; + + final AutovalidateMode _defaultValue; + + @override + AutovalidateMode createDefaultValue() => _defaultValue; + + @override + void didUpdateValue(AutovalidateMode? oldValue) { + assert(debugIsSerializableForRestoration(value.index)); + notifyListeners(); + } + + @override + AutovalidateMode fromPrimitives(Object? data) => AutovalidateMode.values[data! as int]; + + @override + Object? toPrimitives() => value.index; +} + +/// Re-usable widget that displays the selected date (in large font) and the +/// help text above it. +/// +/// These types include: +/// +/// * Single Date picker with calendar mode. +/// * Single Date picker with text input mode. +/// * Date Range picker with text input mode. +/// +/// [helpText], [orientation], [icon], [onIconPressed] are required and must be +/// non-null. +class _DatePickerHeader extends StatelessWidget { + + /// Creates a header for use in a date picker dialog. + const _DatePickerHeader({ + required this.helpText, + required this.titleText, + this.titleSemanticsLabel, + required this.titleStyle, + required this.orientation, + this.isShort = false, + this.entryModeButton, + }) : assert(helpText != null), + assert(orientation != null), + assert(isShort != null); + + static const double _datePickerHeaderLandscapeWidth = 152.0; + static const double _datePickerHeaderPortraitHeight = 120.0; + static const double _headerPaddingLandscape = 16.0; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String helpText; + + /// The text that is displayed at the center of the header. + final String titleText; + + /// The semantic label associated with the [titleText]. + final String? titleSemanticsLabel; + + /// The [TextStyle] that the title text is displayed with. + final TextStyle? titleStyle; + + /// The orientation is used to decide how to layout its children. + final Orientation orientation; + + /// Indicates the header is being displayed in a shorter/narrower context. + /// + /// This will be used to tighten up the space between the help text and date + /// text if `true`. Additionally, it will use a smaller typography style if + /// `true`. + /// + /// This is necessary for displaying the manual input mode in + /// landscape orientation, in order to account for the keyboard height. + final bool isShort; + + final Widget? entryModeButton; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final TextTheme textTheme = theme.textTheme; + + // The header should use the primary color in light themes and surface color in dark + final bool isDark = colorScheme.brightness == Brightness.dark; + final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; + final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; + + final TextStyle? helpStyle = textTheme.headlineMedium?.copyWith( + color: onPrimarySurfaceColor, + ); + + final Text help = Text( + helpText, + style: helpStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + final Text title = Text( + titleText, + semanticsLabel: titleSemanticsLabel ?? titleText, + style: titleStyle, + maxLines: orientation == Orientation.portrait ? 1 : 2, + overflow: TextOverflow.ellipsis, + ); + + switch (orientation) { + case Orientation.portrait: + return SizedBox( + height: _datePickerHeaderPortraitHeight, + child: Material( + color: primarySurfaceColor, + child: Padding( + padding: const EdgeInsetsDirectional.only( + start: 24, + end: 12, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 16), + help, + const Flexible(child: SizedBox(height: 38)), + Row( + children: [ + Expanded(child: title), + if (entryModeButton != null) + entryModeButton!, + ], + ), + ], + ), + ), + ), + ); + case Orientation.landscape: + return SizedBox( + width: _datePickerHeaderLandscapeWidth, + child: Material( + color: primarySurfaceColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: _headerPaddingLandscape, + ), + child: help, + ), + SizedBox(height: isShort ? 16 : 56), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: _headerPaddingLandscape, + ), + child: title, + ), + ), + if (entryModeButton != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: entryModeButton, + ), + ], + ), + ), + ); + } + } +} + +/// Shows a full screen modal dialog containing a Material Design date range +/// picker. +/// +/// The returned [Future] resolves to the [DateTimeRange] selected by the user +/// when the user saves their selection. If the user cancels the dialog, null is +/// returned. +/// +/// If [initialDateRange] is non-null, then it will be used as the initially +/// selected date range. If it is provided, `initialDateRange.start` must be +/// before or on `initialDateRange.end`. +/// +/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest +/// allowable date. Both must be non-null. +/// +/// If an initial date range is provided, `initialDateRange.start` +/// and `initialDateRange.end` must both fall between or on [firstDate] and +/// [lastDate]. For all of these [DateTime] values, only their dates are +/// considered. Their time fields are ignored. +/// +/// The [currentDate] represents the current day (i.e. today). This +/// date will be highlighted in the day grid. If null, the date of +/// `DateTime.now()` will be used. +/// +/// An optional [initialEntryMode] argument can be used to display the date +/// picker in the [DatePickerEntryMode.calendar] (a scrollable calendar month +/// grid) or [DatePickerEntryMode.input] (two text input fields) mode. +/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. +/// +/// The following optional string parameters allow you to override the default +/// text used for various parts of the dialog: +/// +/// * [helpText], the label displayed at the top of the dialog. +/// * [cancelText], the label on the cancel button for the text input mode. +/// * [confirmText],the label on the ok button for the text input mode. +/// * [saveText], the label on the save button for the fullscreen calendar +/// mode. +/// * [errorFormatText], the message used when an input text isn't in a proper +/// date format. +/// * [errorInvalidText], the message used when an input text isn't a +/// selectable date. +/// * [errorInvalidRangeText], the message used when the date range is +/// invalid (e.g. start date is after end date). +/// * [fieldStartHintText], the text used to prompt the user when no text has +/// been entered in the start field. +/// * [fieldEndHintText], the text used to prompt the user when no text has +/// been entered in the end field. +/// * [fieldStartLabelText], the label for the start date text input field. +/// * [fieldEndLabelText], the label for the end date text input field. +/// +/// An optional [locale] argument can be used to set the locale for the date +/// picker. It defaults to the ambient locale provided by [Localizations]. +/// +/// An optional [textDirection] argument can be used to set the text direction +/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It +/// defaults to the ambient text direction provided by [Directionality]. If both +/// [locale] and [textDirection] are non-null, [textDirection] overrides the +/// direction chosen for the [locale]. +/// +/// The [context], [useRootNavigator] and [routeSettings] arguments are passed +/// to [showDialog], the documentation for which discusses how it is used. +/// [context] and [useRootNavigator] must be non-null. +/// +/// The [builder] parameter can be used to wrap the dialog widget +/// to add inherited widgets like [Theme]. +/// +/// {@macro flutter.widgets.RawDialogRoute} +/// +/// ### State Restoration +/// +/// Using this method will not enable state restoration for the date range picker. +/// In order to enable state restoration for a date range picker, use +/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with +/// [DateRangePickerDialog]. +/// +/// For more information about state restoration, see [RestorationManager]. +/// +/// {@macro flutter.widgets.RestorationManager} +/// +/// {@tool sample} +/// This sample demonstrates how to create a restorable Material date range picker. +/// This is accomplished by enabling state restoration by specifying +/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to +/// push [DateRangePickerDialog] when the button is tapped. +/// +/// ** See code in examples/api/lib/material/date_picker/show_date_range_picker.0.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [showDatePicker], which shows a Material Design date picker used to +/// select a single date. +/// * [DateTimeRange], which is used to describe a date range. +/// * [DisplayFeatureSubScreen], which documents the specifics of how +/// [DisplayFeature]s can split the screen into sub-screens. +Future showDateRangePicker({ + required BuildContext context, + DateTimeRange? initialDateRange, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, + String? helpText, + String? cancelText, + String? confirmText, + String? saveText, + String? errorFormatText, + String? errorInvalidText, + String? errorInvalidRangeText, + String? fieldStartHintText, + String? fieldEndHintText, + String? fieldStartLabelText, + String? fieldEndLabelText, + Locale? locale, + bool useRootNavigator = true, + RouteSettings? routeSettings, + TextDirection? textDirection, + TransitionBuilder? builder, + Offset? anchorPoint, +}) async { + assert(context != null); + assert( + initialDateRange == null || (initialDateRange.start != null && initialDateRange.end != null), + 'initialDateRange must be null or have non-null start and end dates.', + ); + assert( + initialDateRange == null || !initialDateRange.start.isAfter(initialDateRange.end), + "initialDateRange's start date must not be after it's end date.", + ); + initialDateRange = initialDateRange == null ? null : DateUtils.datesOnly(initialDateRange); + assert(firstDate != null); + firstDate = DateUtils.dateOnly(firstDate); + assert(lastDate != null); + lastDate = DateUtils.dateOnly(lastDate); + assert( + !lastDate.isBefore(firstDate), + 'lastDate $lastDate must be on or after firstDate $firstDate.', + ); + assert( + initialDateRange == null || !initialDateRange.start.isBefore(firstDate), + "initialDateRange's start date must be on or after firstDate $firstDate.", + ); + assert( + initialDateRange == null || !initialDateRange.end.isBefore(firstDate), + "initialDateRange's end date must be on or after firstDate $firstDate.", + ); + assert( + initialDateRange == null || !initialDateRange.start.isAfter(lastDate), + "initialDateRange's start date must be on or before lastDate $lastDate.", + ); + assert( + initialDateRange == null || !initialDateRange.end.isAfter(lastDate), + "initialDateRange's end date must be on or before lastDate $lastDate.", + ); + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()); + assert(initialEntryMode != null); + assert(useRootNavigator != null); + assert(debugCheckHasMaterialLocalizations(context)); + + Widget dialog = DateRangePickerDialog( + initialDateRange: initialDateRange, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + initialEntryMode: initialEntryMode, + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + saveText: saveText, + errorFormatText: errorFormatText, + errorInvalidText: errorInvalidText, + errorInvalidRangeText: errorInvalidRangeText, + fieldStartHintText: fieldStartHintText, + fieldEndHintText: fieldEndHintText, + fieldStartLabelText: fieldStartLabelText, + fieldEndLabelText: fieldEndLabelText, + ); + + if (textDirection != null) { + dialog = Directionality( + textDirection: textDirection, + child: dialog, + ); + } + + if (locale != null) { + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + } + + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + routeSettings: routeSettings, + useSafeArea: false, + builder: (BuildContext context) { + return builder == null ? dialog : builder(context, dialog); + }, + anchorPoint: anchorPoint, + ); +} + +/// Returns a locale-appropriate string to describe the start of a date range. +/// +/// If `startDate` is null, then it defaults to 'Start Date', otherwise if it +/// is in the same year as the `endDate` then it will use the short month +/// day format (i.e. 'Jan 21'). Otherwise it will return the short date format +/// (i.e. 'Jan 21, 2020'). +String _formatRangeStartDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate) { + return startDate == null + ? localizations.dateRangeStartLabel + : (endDate == null || startDate.year == endDate.year) + ? localizations.formatShortMonthDay(startDate) + : localizations.formatShortDate(startDate); +} + +/// Returns an locale-appropriate string to describe the end of a date range. +/// +/// If `endDate` is null, then it defaults to 'End Date', otherwise if it +/// is in the same year as the `startDate` and the `currentDate` then it will +/// just use the short month day format (i.e. 'Jan 21'), otherwise it will +/// include the year (i.e. 'Jan 21, 2020'). +String _formatRangeEndDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate, DateTime currentDate) { + return endDate == null + ? localizations.dateRangeEndLabel + : (startDate != null && startDate.year == endDate.year && startDate.year == currentDate.year) + ? localizations.formatShortMonthDay(endDate) + : localizations.formatShortDate(endDate); +} + +/// A Material-style date range picker dialog. +/// +/// It is used internally by [showDateRangePicker] or can be directly pushed +/// onto the [Navigator] stack to enable state restoration. See +/// [showDateRangePicker] for a state restoration app example. +/// +/// See also: +/// +/// * [showDateRangePicker], which is a way to display the date picker. +class DateRangePickerDialog extends StatefulWidget { + /// A Material-style date range picker dialog. + const DateRangePickerDialog({ + super.key, + this.initialDateRange, + required this.firstDate, + required this.lastDate, + this.currentDate, + this.initialEntryMode = DatePickerEntryMode.calendar, + this.helpText, + this.cancelText, + this.confirmText, + this.saveText, + this.errorInvalidRangeText, + this.errorFormatText, + this.errorInvalidText, + this.fieldStartHintText, + this.fieldEndHintText, + this.fieldStartLabelText, + this.fieldEndLabelText, + this.restorationId, + }); + + /// The date range that the date range picker starts with when it opens. + /// + /// If an initial date range is provided, `initialDateRange.start` + /// and `initialDateRange.end` must both fall between or on [firstDate] and + /// [lastDate]. For all of these [DateTime] values, only their dates are + /// considered. Their time fields are ignored. + /// + /// If [initialDateRange] is non-null, then it will be used as the initially + /// selected date range. If it is provided, `initialDateRange.start` must be + /// before or on `initialDateRange.end`. + final DateTimeRange? initialDateRange; + + /// The earliest allowable date on the date range. + final DateTime firstDate; + + /// The latest allowable date on the date range. + final DateTime lastDate; + + /// The [currentDate] represents the current day (i.e. today). + /// + /// This date will be highlighted in the day grid. + /// + /// If `null`, the date of `DateTime.now()` will be used. + final DateTime? currentDate; + + /// The initial date range picker entry mode. + /// + /// The date range has two main modes: [DatePickerEntryMode.calendar] (a + /// scrollable calendar month grid) or [DatePickerEntryMode.input] (two text + /// input fields) mode. + /// + /// It defaults to [DatePickerEntryMode.calendar] and must be non-null. + final DatePickerEntryMode initialEntryMode; + + /// The label on the cancel button for the text input mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.cancelButtonLabel] is used. + final String? cancelText; + + /// The label on the "OK" button for the text input mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.okButtonLabel] is used. + final String? confirmText; + + /// The label on the save button for the fullscreen calendar mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.saveButtonLabel] is used. + final String? saveText; + + /// The label displayed at the top of the dialog. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateRangePickerHelpText] is used. + final String? helpText; + + /// The message used when the date range is invalid (e.g. start date is after + /// end date). + /// + /// If null, the localized value of + /// [MaterialLocalizations.invalidDateRangeLabel] is used. + final String? errorInvalidRangeText; + + /// The message used when an input text isn't in a proper date format. + /// + /// If null, the localized value of + /// [MaterialLocalizations.invalidDateFormatLabel] is used. + final String? errorFormatText; + + /// The message used when an input text isn't a selectable date. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateOutOfRangeLabel] is used. + final String? errorInvalidText; + + /// The text used to prompt the user when no text has been entered in the + /// start field. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateHelpText] is used. + final String? fieldStartHintText; + + /// The text used to prompt the user when no text has been entered in the + /// end field. + /// + /// If null, the localized value of [MaterialLocalizations.dateHelpText] is + /// used. + final String? fieldEndHintText; + + /// The label for the start date text input field. + /// + /// If null, the localized value of [MaterialLocalizations.dateRangeStartLabel] + /// is used. + final String? fieldStartLabelText; + + /// The label for the end date text input field. + /// + /// If null, the localized value of [MaterialLocalizations.dateRangeEndLabel] + /// is used. + final String? fieldEndLabelText; + + /// Restoration ID to save and restore the state of the [DateRangePickerDialog]. + /// + /// If it is non-null, the date range picker will persist and restore the + /// date range selected on the dialog. + /// + /// The state of this widget is persisted in a [RestorationBucket] claimed + /// from the surrounding [RestorationScope] using the provided restoration ID. + /// + /// See also: + /// + /// * [RestorationManager], which explains how state restoration works in + /// Flutter. + final String? restorationId; + + @override + State createState() => _DateRangePickerDialogState(); +} + +class _DateRangePickerDialogState extends State with RestorationMixin { + late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); + late final RestorableDateTimeN _selectedStart = RestorableDateTimeN(widget.initialDateRange?.start); + late final RestorableDateTimeN _selectedEnd = RestorableDateTimeN(widget.initialDateRange?.end); + final RestorableBool _autoValidate = RestorableBool(false); + final GlobalKey _calendarPickerKey = GlobalKey(); + final GlobalKey<_InputDateRangePickerState> _inputPickerKey = GlobalKey<_InputDateRangePickerState>(); + + @override + String? get restorationId => widget.restorationId; + + @override + void restoreState(RestorationBucket? oldBucket, bool initialRestore) { + registerForRestoration(_entryMode, 'entry_mode'); + registerForRestoration(_selectedStart, 'selected_start'); + registerForRestoration(_selectedEnd, 'selected_end'); + registerForRestoration(_autoValidate, 'autovalidate'); + } + + void _handleOk() { + if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { + final _InputDateRangePickerState picker = _inputPickerKey.currentState!; + if (!picker.validate()) { + setState(() { + _autoValidate.value = true; + }); + return; + } + } + final DateTimeRange? selectedRange = _hasSelectedDateRange + ? DateTimeRange(start: _selectedStart.value!, end: _selectedEnd.value!) + : null; + + Navigator.pop(context, selectedRange); + } + + void _handleCancel() { + Navigator.pop(context); + } + + void _handleEntryModeToggle() { + setState(() { + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + _autoValidate.value = false; + _entryMode.value = DatePickerEntryMode.input; + break; + + case DatePickerEntryMode.input: + // Validate the range dates + if (_selectedStart.value != null && + (_selectedStart.value!.isBefore(widget.firstDate) || _selectedStart.value!.isAfter(widget.lastDate))) { + _selectedStart.value = null; + // With no valid start date, having an end date makes no sense for the UI. + _selectedEnd.value = null; + } + if (_selectedEnd.value != null && + (_selectedEnd.value!.isBefore(widget.firstDate) || _selectedEnd.value!.isAfter(widget.lastDate))) { + _selectedEnd.value = null; + } + // If invalid range (start after end), then just use the start date + if (_selectedStart.value != null && _selectedEnd.value != null && _selectedStart.value!.isAfter(_selectedEnd.value!)) { + _selectedEnd.value = null; + } + _entryMode.value = DatePickerEntryMode.calendar; + break; + + case DatePickerEntryMode.calendarOnly: + case DatePickerEntryMode.inputOnly: + assert(false, 'Can not change entry mode from $_entryMode'); + break; + } + }); + } + + void _handleStartDateChanged(DateTime? date) { + setState(() => _selectedStart.value = date); + } + + void _handleEndDateChanged(DateTime? date) { + setState(() => _selectedEnd.value = date); + } + + bool get _hasSelectedDateRange => _selectedStart.value != null && _selectedEnd.value != null; + + @override + Widget build(BuildContext context) { + final MediaQueryData mediaQuery = MediaQuery.of(context); + final Orientation orientation = mediaQuery.orientation; + final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final ColorScheme colors = Theme.of(context).colorScheme; + final Color onPrimarySurface = colors.brightness == Brightness.light + ? colors.onPrimary + : colors.onSurface; + + final Widget contents; + final Size size; + ShapeBorder? shape; + final double elevation; + final EdgeInsets insetPadding; + final bool showEntryModeButton = + _entryMode.value == DatePickerEntryMode.calendar || + _entryMode.value == DatePickerEntryMode.input; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + case DatePickerEntryMode.calendarOnly: + contents = _CalendarRangePickerDialog( + key: _calendarPickerKey, + selectedStartDate: _selectedStart.value, + selectedEndDate: _selectedEnd.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + currentDate: widget.currentDate, + onStartDateChanged: _handleStartDateChanged, + onEndDateChanged: _handleEndDateChanged, + onConfirm: _hasSelectedDateRange ? _handleOk : null, + onCancel: _handleCancel, + entryModeButton: showEntryModeButton + ? IconButton( + icon: const Icon(Icons.edit), + padding: EdgeInsets.zero, + color: onPrimarySurface, + tooltip: localizations.inputDateModeButtonLabel, + onPressed: _handleEntryModeToggle, + ) + : null, + confirmText: widget.saveText ?? localizations.saveButtonLabel, + helpText: widget.helpText ?? localizations.dateRangePickerHelpText, + ); + size = mediaQuery.size; + insetPadding = EdgeInsets.zero; + shape = const RoundedRectangleBorder(); + elevation = 0; + break; + + case DatePickerEntryMode.input: + case DatePickerEntryMode.inputOnly: + contents = _InputDateRangePickerDialog( + selectedStartDate: _selectedStart.value, + selectedEndDate: _selectedEnd.value, + currentDate: widget.currentDate, + picker: Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: orientation == Orientation.portrait + ? _inputFormPortraitHeight + : _inputFormLandscapeHeight, + child: Column( + children: [ + const Spacer(), + _InputDateRangePicker( + key: _inputPickerKey, + initialStartDate: _selectedStart.value, + initialEndDate: _selectedEnd.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + onStartDateChanged: _handleStartDateChanged, + onEndDateChanged: _handleEndDateChanged, + autofocus: true, + autovalidate: _autoValidate.value, + helpText: widget.helpText, + errorInvalidRangeText: widget.errorInvalidRangeText, + errorFormatText: widget.errorFormatText, + errorInvalidText: widget.errorInvalidText, + fieldStartHintText: widget.fieldStartHintText, + fieldEndHintText: widget.fieldEndHintText, + fieldStartLabelText: widget.fieldStartLabelText, + fieldEndLabelText: widget.fieldEndLabelText, + ), + const Spacer(), + ], + ), + ), + onConfirm: _handleOk, + onCancel: _handleCancel, + entryModeButton: showEntryModeButton + ? IconButton( + icon: const Icon(Icons.calendar_today), + padding: EdgeInsets.zero, + color: onPrimarySurface, + tooltip: localizations.calendarModeButtonLabel, + onPressed: _handleEntryModeToggle, + ) + : null, + confirmText: widget.confirmText ?? localizations.okButtonLabel, + cancelText: widget.cancelText ?? localizations.cancelButtonLabel, + helpText: widget.helpText ?? localizations.dateRangePickerHelpText, + ); + final DialogThemeData dialogTheme = Theme.of(context).dialogTheme; + size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; + insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); + shape = dialogTheme.shape; + elevation = dialogTheme.elevation ?? 24; + break; + } + + return Dialog( + insetPadding: insetPadding, + shape: shape, + elevation: elevation, + clipBehavior: Clip.antiAlias, + child: AnimatedContainer( + width: size.width, + height: size.height, + duration: _dialogSizeAnimationDuration, + curve: Curves.easeIn, + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaleFactor: textScaleFactor, + ), + child: Builder(builder: (BuildContext context) { + return contents; + }), + ), + ), + ); + } +} + +class _CalendarRangePickerDialog extends StatelessWidget { + const _CalendarRangePickerDialog({ + super.key, + required this.selectedStartDate, + required this.selectedEndDate, + required this.firstDate, + required this.lastDate, + required this.currentDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + required this.onConfirm, + required this.onCancel, + required this.confirmText, + required this.helpText, + this.entryModeButton, + }); + + final DateTime? selectedStartDate; + final DateTime? selectedEndDate; + final DateTime firstDate; + final DateTime lastDate; + final DateTime? currentDate; + final ValueChanged onStartDateChanged; + final ValueChanged onEndDateChanged; + final VoidCallback? onConfirm; + final VoidCallback? onCancel; + final String confirmText; + final String helpText; + final Widget? entryModeButton; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + final Color headerForeground = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final Color headerDisabledForeground = headerForeground.withOpacity(0.38); + final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); + final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); + final TextStyle? headlineStyle = textTheme.headlineMedium; + final TextStyle? startDateStyle = headlineStyle?.apply( + color: selectedStartDate != null ? headerForeground : headerDisabledForeground, + ); + final TextStyle? endDateStyle = headlineStyle?.apply( + color: selectedEndDate != null ? headerForeground : headerDisabledForeground, + ); + final TextStyle saveButtonStyle = textTheme.headlineMedium!.apply( + color: onConfirm != null ? headerForeground : headerDisabledForeground, + ); + + return SafeArea( + top: false, + left: false, + right: false, + child: Scaffold( + appBar: AppBar( + leading: CloseButton( + onPressed: onCancel, + ), + actions: [ + if (orientation == Orientation.landscape && entryModeButton != null) + entryModeButton!, + TextButton( + onPressed: onConfirm, + child: Text(confirmText, style: saveButtonStyle), + ), + const SizedBox(width: 8), + ], + bottom: PreferredSize( + preferredSize: const Size(double.infinity, 64), + child: Row(children: [ + SizedBox(width: MediaQuery.of(context).size.width < 360 ? 42 : 72), + Expanded( + child: Semantics( + label: '$helpText $startDateText to $endDateText', + excludeSemantics: true, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + helpText, + style: textTheme.headlineMedium!.apply( + color: headerForeground, + ), + ), + const SizedBox(height: 8), + Row( + children: [ + Text( + startDateText, + style: startDateStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text(' – ', style: startDateStyle, + ), + Flexible( + child: Text( + endDateText, + style: endDateStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 16), + ], + ), + ), + ), + if (orientation == Orientation.portrait && entryModeButton != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: entryModeButton, + ), + ]), + ), + ), + body: _CalendarDateRangePicker( + initialStartDate: selectedStartDate, + initialEndDate: selectedEndDate, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + onStartDateChanged: onStartDateChanged, + onEndDateChanged: onEndDateChanged, + ), + ), + ); + } +} + +const Duration _monthScrollDuration = Duration(milliseconds: 200); + +const double _monthItemHeaderHeight = 58.0; +const double _monthItemFooterHeight = 12.0; +const double _monthItemRowHeight = 42.0; +const double _monthItemSpaceBetweenRows = 8.0; +const double _horizontalPadding = 8.0; +const double _maxCalendarWidthLandscape = 384.0; +const double _maxCalendarWidthPortrait = 480.0; + +/// Displays a scrollable calendar grid that allows a user to select a range +/// of dates. +class _CalendarDateRangePicker extends StatefulWidget { + /// Creates a scrollable calendar grid for picking date ranges. + _CalendarDateRangePicker({ + DateTime? initialStartDate, + DateTime? initialEndDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + }) : initialStartDate = initialStartDate != null ? DateUtils.dateOnly(initialStartDate) : null, + initialEndDate = initialEndDate != null ? DateUtils.dateOnly(initialEndDate) : null, + assert(firstDate != null), + assert(lastDate != null), + firstDate = DateUtils.dateOnly(firstDate), + lastDate = DateUtils.dateOnly(lastDate), + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()) { + assert( + this.initialStartDate == null || this.initialEndDate == null || !this.initialStartDate!.isAfter(initialEndDate!), + 'initialStartDate must be on or before initialEndDate.', + ); + assert( + !this.lastDate.isBefore(this.firstDate), + 'firstDate must be on or before lastDate.', + ); + } + + /// The [DateTime] that represents the start of the initial date range selection. + final DateTime? initialStartDate; + + /// The [DateTime] that represents the end of the initial date range selection. + final DateTime? initialEndDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// The [DateTime] representing today. It will be highlighted in the day grid. + final DateTime currentDate; + + /// Called when the user changes the start date of the selected range. + final ValueChanged? onStartDateChanged; + + /// Called when the user changes the end date of the selected range. + final ValueChanged? onEndDateChanged; + + @override + _CalendarDateRangePickerState createState() => _CalendarDateRangePickerState(); +} + +class _CalendarDateRangePickerState extends State<_CalendarDateRangePicker> { + final GlobalKey _scrollViewKey = GlobalKey(); + DateTime? _startDate; + DateTime? _endDate; + int _initialMonthIndex = 0; + late ScrollController _controller; + late bool _showWeekBottomDivider; + + @override + void initState() { + super.initState(); + _controller = ScrollController(); + _controller.addListener(_scrollListener); + + _startDate = widget.initialStartDate; + _endDate = widget.initialEndDate; + + // Calculate the index for the initially displayed month. This is needed to + // divide the list of months into two `SliverList`s. + final DateTime initialDate = widget.initialStartDate ?? widget.currentDate; + if (!initialDate.isBefore(widget.firstDate) && + !initialDate.isAfter(widget.lastDate)) { + _initialMonthIndex = DateUtils.monthDelta(widget.firstDate, initialDate); + } + + _showWeekBottomDivider = _initialMonthIndex != 0; + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void _scrollListener() { + if (_controller.offset <= _controller.position.minScrollExtent) { + setState(() { + _showWeekBottomDivider = false; + }); + } else if (!_showWeekBottomDivider) { + setState(() { + _showWeekBottomDivider = true; + }); + } + } + + int get _numberOfMonths => DateUtils.monthDelta(widget.firstDate, widget.lastDate) + 1; + + void _vibrate() { + switch (Theme.of(context).platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + HapticFeedback.vibrate(); + break; + case TargetPlatform.iOS: + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + break; + } + } + + // This updates the selected date range using this logic: + // + // * From the unselected state, selecting one date creates the start date. + // * If the next selection is before the start date, reset date range and + // set the start date to that selection. + // * If the next selection is on or after the start date, set the end date + // to that selection. + // * After both start and end dates are selected, any subsequent selection + // resets the date range and sets start date to that selection. + void _updateSelection(DateTime date) { + _vibrate(); + setState(() { + if (_startDate != null && _endDate == null && !date.isBefore(_startDate!)) { + _endDate = date; + widget.onEndDateChanged?.call(_endDate); + } else { + _startDate = date; + widget.onStartDateChanged?.call(_startDate!); + if (_endDate != null) { + _endDate = null; + widget.onEndDateChanged?.call(_endDate); + } + } + }); + } + + Widget _buildMonthItem(BuildContext context, int index, bool beforeInitialMonth) { + final int monthIndex = beforeInitialMonth + ? _initialMonthIndex - index - 1 + : _initialMonthIndex + index; + final DateTime month = DateUtils.addMonthsToMonthDate(widget.firstDate, monthIndex); + return Stack( + alignment: Alignment.center, + children: [ + Text("${month.month}",style: TextStyle(fontSize: 200,color: Colors.grey.withOpacity(0.1)),), + _MonthItem( + selectedDateStart: _startDate, + selectedDateEnd: _endDate, + currentDate: widget.currentDate, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + displayedMonth: month, + onChanged: _updateSelection, + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + const Key sliverAfterKey = Key('sliverAfterKey'); + + return Column( + children: [ + const _DayHeaders(), + if (_showWeekBottomDivider) const Divider(height: 0), + Expanded( + child: _CalendarKeyboardNavigator( + firstDate: widget.firstDate, + lastDate: widget.lastDate, + initialFocusedDay: _startDate ?? widget.initialStartDate ?? widget.currentDate, + // In order to prevent performance issues when displaying the + // correct initial month, 2 `SliverList`s are used to split the + // months. The first item in the second SliverList is the initial + // month to be displayed. + child: CustomScrollView( + key: _scrollViewKey, + controller: _controller, + center: sliverAfterKey, + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) => _buildMonthItem(context, index, true), + childCount: _initialMonthIndex, + ), + ), + SliverList( + key: sliverAfterKey, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) => _buildMonthItem(context, index, false), + childCount: _numberOfMonths - _initialMonthIndex, + ), + ), + ], + ), + ), + ), + ], + ); + } +} + +class _CalendarKeyboardNavigator extends StatefulWidget { + const _CalendarKeyboardNavigator({ + required this.child, + required this.firstDate, + required this.lastDate, + required this.initialFocusedDay, + }); + + final Widget child; + final DateTime firstDate; + final DateTime lastDate; + final DateTime initialFocusedDay; + + @override + _CalendarKeyboardNavigatorState createState() => _CalendarKeyboardNavigatorState(); +} + +class _CalendarKeyboardNavigatorState extends State<_CalendarKeyboardNavigator> { + + final Map _shortcutMap = const { + SingleActivator(LogicalKeyboardKey.arrowLeft): DirectionalFocusIntent(TraversalDirection.left), + SingleActivator(LogicalKeyboardKey.arrowRight): DirectionalFocusIntent(TraversalDirection.right), + SingleActivator(LogicalKeyboardKey.arrowDown): DirectionalFocusIntent(TraversalDirection.down), + SingleActivator(LogicalKeyboardKey.arrowUp): DirectionalFocusIntent(TraversalDirection.up), + }; + late Map> _actionMap; + late FocusNode _dayGridFocus; + TraversalDirection? _dayTraversalDirection; + DateTime? _focusedDay; + + @override + void initState() { + super.initState(); + + _actionMap = >{ + NextFocusIntent: CallbackAction(onInvoke: _handleGridNextFocus), + PreviousFocusIntent: CallbackAction(onInvoke: _handleGridPreviousFocus), + DirectionalFocusIntent: CallbackAction(onInvoke: _handleDirectionFocus), + }; + _dayGridFocus = FocusNode(debugLabel: 'Day Grid'); + } + + @override + void dispose() { + _dayGridFocus.dispose(); + super.dispose(); + } + + void _handleGridFocusChange(bool focused) { + setState(() { + if (focused) { + _focusedDay ??= widget.initialFocusedDay; + } + }); + } + + /// Move focus to the next element after the day grid. + void _handleGridNextFocus(NextFocusIntent intent) { + _dayGridFocus.requestFocus(); + _dayGridFocus.nextFocus(); + } + + /// Move focus to the previous element before the day grid. + void _handleGridPreviousFocus(PreviousFocusIntent intent) { + _dayGridFocus.requestFocus(); + _dayGridFocus.previousFocus(); + } + + /// Move the internal focus date in the direction of the given intent. + /// + /// This will attempt to move the focused day to the next selectable day in + /// the given direction. If the new date is not in the current month, then + /// the page view will be scrolled to show the new date's month. + /// + /// For horizontal directions, it will move forward or backward a day (depending + /// on the current [TextDirection]). For vertical directions it will move up and + /// down a week at a time. + void _handleDirectionFocus(DirectionalFocusIntent intent) { + assert(_focusedDay != null); + setState(() { + final DateTime? nextDate = _nextDateInDirection(_focusedDay!, intent.direction); + if (nextDate != null) { + _focusedDay = nextDate; + _dayTraversalDirection = intent.direction; + } + }); + } + + static const Map _directionOffset = { + TraversalDirection.up: -DateTime.daysPerWeek, + TraversalDirection.right: 1, + TraversalDirection.down: DateTime.daysPerWeek, + TraversalDirection.left: -1, + }; + + int _dayDirectionOffset(TraversalDirection traversalDirection, TextDirection textDirection) { + // Swap left and right if the text direction if RTL + if (textDirection == TextDirection.rtl) { + if (traversalDirection == TraversalDirection.left) { + traversalDirection = TraversalDirection.right; + } else if (traversalDirection == TraversalDirection.right) { + traversalDirection = TraversalDirection.left; + } + } + return _directionOffset[traversalDirection]!; + } + + DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { + final TextDirection textDirection = Directionality.of(context); + final DateTime nextDate = DateUtils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); + if (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { + return nextDate; + } + return null; + } + + @override + Widget build(BuildContext context) { + return FocusableActionDetector( + shortcuts: _shortcutMap, + actions: _actionMap, + focusNode: _dayGridFocus, + onFocusChange: _handleGridFocusChange, + child: _FocusedDate( + date: _dayGridFocus.hasFocus ? _focusedDay : null, + scrollDirection: _dayGridFocus.hasFocus ? _dayTraversalDirection : null, + child: widget.child, + ), + ); + } +} + +/// InheritedWidget indicating what the current focused date is for its children. +/// +/// This is used by the [_MonthPicker] to let its children [_DayPicker]s know +/// what the currently focused date (if any) should be. +class _FocusedDate extends InheritedWidget { + const _FocusedDate({ + required super.child, + this.date, + this.scrollDirection, + }); + + final DateTime? date; + final TraversalDirection? scrollDirection; + + @override + bool updateShouldNotify(_FocusedDate oldWidget) { + return !DateUtils.isSameDay(date, oldWidget.date) || scrollDirection != oldWidget.scrollDirection; + } + + static _FocusedDate? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType<_FocusedDate>(); + } +} + + +class _DayHeaders extends StatelessWidget { + const _DayHeaders(); + + /// Builds widgets showing abbreviated days of week. The first widget in the + /// returned list corresponds to the first day of week for the current locale. + /// + /// Examples: + /// + /// ``` + /// ┌ Sunday is the first day of week in the US (en_US) + /// | + /// S M T W T F S <-- the returned list contains these widgets + /// _ _ _ _ _ 1 2 + /// 3 4 5 6 7 8 9 + /// + /// ┌ But it's Monday in the UK (en_GB) + /// | + /// M T W T F S S <-- the returned list contains these widgets + /// _ _ _ _ 1 2 3 + /// 4 5 6 7 8 9 10 + /// ``` + List _getDayHeaders(TextStyle headerStyle, MaterialLocalizations localizations) { + final List result = []; + for (int i = localizations.firstDayOfWeekIndex; true; i = (i + 1) % 7) { + final String weekday = localizations.narrowWeekdays[i]; + result.add(ExcludeSemantics( + child: Center(child: Text(weekday, style: headerStyle)), + )); + if (i == (localizations.firstDayOfWeekIndex - 1) % 7) { + break; + } + } + return result; + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + final ColorScheme colorScheme = themeData.colorScheme; + final TextStyle textStyle = themeData.textTheme.headlineMedium!.apply(color: colorScheme.onSurface); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final List labels = _getDayHeaders(textStyle, localizations); + + // Add leading and trailing containers for edges of the custom grid layout. + labels.insert(0, Container()); + labels.add(Container()); + + return Container( + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).orientation == Orientation.landscape + ? _maxCalendarWidthLandscape + : _maxCalendarWidthPortrait, + maxHeight: _monthItemRowHeight, + ), + child: GridView.custom( + shrinkWrap: true, + gridDelegate: _monthItemGridDelegate, + childrenDelegate: SliverChildListDelegate( + labels, + addRepaintBoundaries: false, + ), + ), + ); + } +} + +class _MonthItemGridDelegate extends SliverGridDelegate { + const _MonthItemGridDelegate(); + + @override + SliverGridLayout getLayout(SliverConstraints constraints) { + final double tileWidth = (constraints.crossAxisExtent - 2 * _horizontalPadding) / DateTime.daysPerWeek; + return _MonthSliverGridLayout( + crossAxisCount: DateTime.daysPerWeek + 2, + dayChildWidth: tileWidth, + edgeChildWidth: _horizontalPadding, + reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection), + ); + } + + @override + bool shouldRelayout(_MonthItemGridDelegate oldDelegate) => false; +} + +const _MonthItemGridDelegate _monthItemGridDelegate = _MonthItemGridDelegate(); + +class _MonthSliverGridLayout extends SliverGridLayout { + /// Creates a layout that uses equally sized and spaced tiles for each day of + /// the week and an additional edge tile for padding at the start and end of + /// each row. + /// + /// This is necessary to facilitate the painting of the range highlight + /// correctly. + const _MonthSliverGridLayout({ + required this.crossAxisCount, + required this.dayChildWidth, + required this.edgeChildWidth, + required this.reverseCrossAxis, + }) : assert(crossAxisCount != null && crossAxisCount > 0), + assert(dayChildWidth != null && dayChildWidth >= 0), + assert(edgeChildWidth != null && edgeChildWidth >= 0), + assert(reverseCrossAxis != null); + + /// The number of children in the cross axis. + final int crossAxisCount; + + /// The width in logical pixels of the day child widgets. + final double dayChildWidth; + + /// The width in logical pixels of the edge child widgets. + final double edgeChildWidth; + + /// Whether the children should be placed in the opposite order of increasing + /// coordinates in the cross axis. + /// + /// For example, if the cross axis is horizontal, the children are placed from + /// left to right when [reverseCrossAxis] is false and from right to left when + /// [reverseCrossAxis] is true. + /// + /// Typically set to the return value of [axisDirectionIsReversed] applied to + /// the [SliverConstraints.crossAxisDirection]. + final bool reverseCrossAxis; + + /// The number of logical pixels from the leading edge of one row to the + /// leading edge of the next row. + double get _rowHeight { + return _monthItemRowHeight + _monthItemSpaceBetweenRows; + } + + /// The height in logical pixels of the children widgets. + double get _childHeight { + return _monthItemRowHeight; + } + + @override + int getMinChildIndexForScrollOffset(double scrollOffset) { + return crossAxisCount * (scrollOffset ~/ _rowHeight); + } + + @override + int getMaxChildIndexForScrollOffset(double scrollOffset) { + final int mainAxisCount = (scrollOffset / _rowHeight).ceil(); + return math.max(0, crossAxisCount * mainAxisCount - 1); + } + + double _getCrossAxisOffset(double crossAxisStart, bool isPadding) { + if (reverseCrossAxis) { + return + ((crossAxisCount - 2) * dayChildWidth + 2 * edgeChildWidth) - + crossAxisStart - + (isPadding ? edgeChildWidth : dayChildWidth); + } + return crossAxisStart; + } + + @override + SliverGridGeometry getGeometryForChildIndex(int index) { + final int adjustedIndex = index % crossAxisCount; + final bool isEdge = adjustedIndex == 0 || adjustedIndex == crossAxisCount - 1; + final double crossAxisStart = math.max(0, (adjustedIndex - 1) * dayChildWidth + edgeChildWidth); + + return SliverGridGeometry( + scrollOffset: (index ~/ crossAxisCount) * _rowHeight, + crossAxisOffset: _getCrossAxisOffset(crossAxisStart, isEdge), + mainAxisExtent: _childHeight, + crossAxisExtent: isEdge ? edgeChildWidth : dayChildWidth, + ); + } + + @override + double computeMaxScrollOffset(int childCount) { + assert(childCount >= 0); + final int mainAxisCount = ((childCount - 1) ~/ crossAxisCount) + 1; + final double mainAxisSpacing = _rowHeight - _childHeight; + return _rowHeight * mainAxisCount - mainAxisSpacing; + } +} + +/// Displays the days of a given month and allows choosing a date range. +/// +/// The days are arranged in a rectangular grid with one column for each day of +/// the week. +class _MonthItem extends StatefulWidget { + /// Creates a month item. + _MonthItem({ + required this.selectedDateStart, + required this.selectedDateEnd, + required this.currentDate, + required this.onChanged, + required this.firstDate, + required this.lastDate, + required this.displayedMonth, + this.dragStartBehavior = DragStartBehavior.start, + }) : assert(firstDate != null), + assert(lastDate != null), + assert(!firstDate.isAfter(lastDate)), + assert(selectedDateStart == null || !selectedDateStart.isBefore(firstDate)), + assert(selectedDateEnd == null || !selectedDateEnd.isBefore(firstDate)), + assert(selectedDateStart == null || !selectedDateStart.isAfter(lastDate)), + assert(selectedDateEnd == null || !selectedDateEnd.isAfter(lastDate)), + assert(selectedDateStart == null || selectedDateEnd == null || !selectedDateStart.isAfter(selectedDateEnd)), + assert(currentDate != null), + assert(onChanged != null), + assert(displayedMonth != null), + assert(dragStartBehavior != null); + + /// The currently selected start date. + /// + /// This date is highlighted in the picker. + final DateTime? selectedDateStart; + + /// The currently selected end date. + /// + /// This date is highlighted in the picker. + final DateTime? selectedDateEnd; + + /// The current date at the time the picker is displayed. + final DateTime currentDate; + + /// Called when the user picks a day. + final ValueChanged onChanged; + + /// The earliest date the user is permitted to pick. + final DateTime firstDate; + + /// The latest date the user is permitted to pick. + final DateTime lastDate; + + /// The month whose days are displayed by this picker. + final DateTime displayedMonth; + + /// Determines the way that drag start behavior is handled. + /// + /// If set to [DragStartBehavior.start], the drag gesture used to scroll a + /// date picker wheel will begin at the position where the drag gesture won + /// the arena. If set to [DragStartBehavior.down] it will begin at the position + /// where a down event is first detected. + /// + /// In general, setting this to [DragStartBehavior.start] will make drag + /// animation smoother and setting it to [DragStartBehavior.down] will make + /// drag behavior feel slightly more reactive. + /// + /// By default, the drag start behavior is [DragStartBehavior.start]. + /// + /// See also: + /// + /// * [DragGestureRecognizer.dragStartBehavior], which gives an example for + /// the different behaviors. + final DragStartBehavior dragStartBehavior; + + @override + _MonthItemState createState() => _MonthItemState(); +} + +class _MonthItemState extends State<_MonthItem> { + /// List of [FocusNode]s, one for each day of the month. + late List _dayFocusNodes; + + @override + void initState() { + super.initState(); + final int daysInMonth = DateUtils.getDaysInMonth(widget.displayedMonth.year, widget.displayedMonth.month); + _dayFocusNodes = List.generate( + daysInMonth, + (int index) => FocusNode(skipTraversal: true, debugLabel: 'Day ${index + 1}'), + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Check to see if the focused date is in this month, if so focus it. + final DateTime? focusedDate = _FocusedDate.of(context)?.date; + if (focusedDate != null && DateUtils.isSameMonth(widget.displayedMonth, focusedDate)) { + _dayFocusNodes[focusedDate.day - 1].requestFocus(); + } + } + + @override + void dispose() { + for (final FocusNode node in _dayFocusNodes) { + node.dispose(); + } + super.dispose(); + } + + Color _highlightColor(BuildContext context) { + return Theme.of(context).colorScheme.primary.withOpacity(0.12); + } + + void _dayFocusChanged(bool focused) { + if (focused) { + final TraversalDirection? focusDirection = _FocusedDate.of(context)?.scrollDirection; + if (focusDirection != null) { + ScrollPositionAlignmentPolicy policy = ScrollPositionAlignmentPolicy.explicit; + switch (focusDirection) { + case TraversalDirection.up: + case TraversalDirection.left: + policy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; + break; + case TraversalDirection.right: + case TraversalDirection.down: + policy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; + break; + } + Scrollable.ensureVisible(primaryFocus!.context!, + duration: _monthScrollDuration, + alignmentPolicy: policy, + ); + } + } + } + + Widget _buildDayItem(BuildContext context, DateTime dayToBuild, int firstDayOffset, int daysInMonth) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final TextTheme textTheme = theme.textTheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final TextDirection textDirection = Directionality.of(context); + final Color highlightColor = _highlightColor(context); + final int day = dayToBuild.day; + + final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); + + BoxDecoration? decoration; + TextStyle? itemStyle = textTheme.headlineMedium; + + final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; + final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); + final bool isSelectedDayEnd = widget.selectedDateEnd != null && dayToBuild.isAtSameMomentAs(widget.selectedDateEnd!); + final bool isInRange = isRangeSelected && + dayToBuild.isAfter(widget.selectedDateStart!) && + dayToBuild.isBefore(widget.selectedDateEnd!); + + _HighlightPainter? highlightPainter; + + if (isSelectedDayStart || isSelectedDayEnd) { + // The selected start and end dates gets a circle background + // highlight, and a contrasting text color. + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.onPrimary); + decoration = BoxDecoration( + color: colorScheme.primary, + shape: BoxShape.circle, + ); + + if (isRangeSelected && widget.selectedDateStart != widget.selectedDateEnd) { + final _HighlightPainterStyle style = isSelectedDayStart + ? _HighlightPainterStyle.highlightTrailing + : _HighlightPainterStyle.highlightLeading; + highlightPainter = _HighlightPainter( + color: highlightColor, + style: style, + textDirection: textDirection, + ); + } + } else if (isInRange) { + // The days within the range get a light background highlight. + highlightPainter = _HighlightPainter( + color: highlightColor, + style: _HighlightPainterStyle.highlightAll, + textDirection: textDirection, + ); + } else if (isDisabled) { + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.onSurface.withOpacity(0.38)); + } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { + // The current day gets a different text color and a circle stroke + // border. + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.primary); + decoration = BoxDecoration( + border: Border.all(color: colorScheme.primary), + shape: BoxShape.circle, + ); + } + + // We want the day of month to be spoken first irrespective of the + // locale-specific preferences or TextDirection. This is because + // an accessibility user is more likely to be interested in the + // day of month before the rest of the date, as they are looking + // for the day of month. To do that we prepend day of month to the + // formatted full date. + String semanticLabel = '${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}'; + if (isSelectedDayStart) { + semanticLabel = localizations.dateRangeStartDateSemanticLabel(semanticLabel); + } else if (isSelectedDayEnd) { + semanticLabel = localizations.dateRangeEndDateSemanticLabel(semanticLabel); + } + + Widget dayWidget = Container( + decoration: decoration, + child: Center( + child: Semantics( + label: semanticLabel, + selected: isSelectedDayStart || isSelectedDayEnd, + child: ExcludeSemantics( + child: Text(localizations.formatDecimal(day), style: itemStyle), + ), + ), + ), + ); + + if (highlightPainter != null) { + dayWidget = CustomPaint( + painter: highlightPainter, + child: dayWidget, + ); + } + + if (!isDisabled) { + dayWidget = InkResponse( + focusNode: _dayFocusNodes[day - 1], + onTap: () => widget.onChanged(dayToBuild), + radius: _monthItemRowHeight / 2 + 4, + splashColor: colorScheme.primary.withOpacity(0.38), + onFocusChange: _dayFocusChanged, + child: dayWidget, + ); + } + + return dayWidget; + } + + Widget _buildEdgeContainer(BuildContext context, bool isHighlighted) { + return Container(color: isHighlighted ? _highlightColor(context) : null); + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final int year = widget.displayedMonth.year; + final int month = widget.displayedMonth.month; + final int daysInMonth = DateUtils.getDaysInMonth(year, month); + final int dayOffset = DateUtils.firstDayOffset(year, month, localizations); + final int weeks = ((daysInMonth + dayOffset) / DateTime.daysPerWeek).ceil(); + final double gridHeight = + weeks * _monthItemRowHeight + (weeks - 1) * _monthItemSpaceBetweenRows; + final List dayItems = []; + + for (int i = 0; true; i += 1) { + // 1-based day of month, e.g. 1-31 for January, and 1-29 for February on + // a leap year. + final int day = i - dayOffset + 1; + if (day > daysInMonth) { + break; + } + if (day < 1) { + dayItems.add(Container()); + } else { + final DateTime dayToBuild = DateTime(year, month, day); + final Widget dayItem = _buildDayItem( + context, + dayToBuild, + dayOffset, + daysInMonth, + ); + dayItems.add(dayItem); + } + } + + // Add the leading/trailing edge containers to each week in order to + // correctly extend the range highlight. + final List paddedDayItems = []; + for (int i = 0; i < weeks; i++) { + final int start = i * DateTime.daysPerWeek; + final int end = math.min( + start + DateTime.daysPerWeek, + dayItems.length, + ); + final List weekList = dayItems.sublist(start, end); + + final DateTime dateAfterLeadingPadding = DateTime(year, month, start - dayOffset + 1); + // Only color the edge container if it is after the start date and + // on/before the end date. + final bool isLeadingInRange = + !(dayOffset > 0 && i == 0) && + widget.selectedDateStart != null && + widget.selectedDateEnd != null && + dateAfterLeadingPadding.isAfter(widget.selectedDateStart!) && + !dateAfterLeadingPadding.isAfter(widget.selectedDateEnd!); + weekList.insert(0, _buildEdgeContainer(context, isLeadingInRange)); + + // Only add a trailing edge container if it is for a full week and not a + // partial week. + if (end < dayItems.length || (end == dayItems.length && dayItems.length % DateTime.daysPerWeek == 0)) { + final DateTime dateBeforeTrailingPadding = + DateTime(year, month, end - dayOffset); + // Only color the edge container if it is on/after the start date and + // before the end date. + final bool isTrailingInRange = + widget.selectedDateStart != null && + widget.selectedDateEnd != null && + !dateBeforeTrailingPadding.isBefore(widget.selectedDateStart!) && + dateBeforeTrailingPadding.isBefore(widget.selectedDateEnd!); + weekList.add(_buildEdgeContainer(context, isTrailingInRange)); + } + + paddedDayItems.addAll(weekList); + } + + final double maxWidth = MediaQuery.of(context).orientation == Orientation.landscape + ? _maxCalendarWidthLandscape + : _maxCalendarWidthPortrait; + return Column( + children: [ + Container( + constraints: BoxConstraints(maxWidth: maxWidth), + height: _monthItemHeaderHeight, + padding: const EdgeInsets.symmetric(horizontal: 16), + alignment: AlignmentDirectional.centerStart, + child: ExcludeSemantics( + child: Text( + localizations.formatMonthYear(widget.displayedMonth), + style: textTheme.headlineMedium!.apply(color: themeData.colorScheme.onSurface), + ), + ), + ), + Container( + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: gridHeight, + ), + child: GridView.custom( + physics: const NeverScrollableScrollPhysics(), + gridDelegate: _monthItemGridDelegate, + childrenDelegate: SliverChildListDelegate( + paddedDayItems, + addRepaintBoundaries: false, + ), + ), + ), + const SizedBox(height: _monthItemFooterHeight), + ], + ); + } +} + +/// Determines which style to use to paint the highlight. +enum _HighlightPainterStyle { + /// Paints nothing. + none, + + /// Paints a rectangle that occupies the leading half of the space. + highlightLeading, + + /// Paints a rectangle that occupies the trailing half of the space. + highlightTrailing, + + /// Paints a rectangle that occupies all available space. + highlightAll, +} + +/// This custom painter will add a background highlight to its child. +/// +/// This highlight will be drawn depending on the [style], [color], and +/// [textDirection] supplied. It will either paint a rectangle on the +/// left/right, a full rectangle, or nothing at all. This logic is determined by +/// a combination of the [style] and [textDirection]. +class _HighlightPainter extends CustomPainter { + _HighlightPainter({ + required this.color, + this.style = _HighlightPainterStyle.none, + this.textDirection, + }); + + final Color color; + final _HighlightPainterStyle style; + final TextDirection? textDirection; + + @override + void paint(Canvas canvas, Size size) { + if (style == _HighlightPainterStyle.none) { + return; + } + + final Paint paint = Paint() + ..color = color + ..style = PaintingStyle.fill; + + final Rect rectLeft = Rect.fromLTWH(0, 0, size.width / 2, size.height); + final Rect rectRight = Rect.fromLTWH(size.width / 2, 0, size.width / 2, size.height); + + switch (style) { + case _HighlightPainterStyle.highlightTrailing: + canvas.drawRect( + textDirection == TextDirection.ltr ? rectRight : rectLeft, + paint, + ); + break; + case _HighlightPainterStyle.highlightLeading: + canvas.drawRect( + textDirection == TextDirection.ltr ? rectLeft : rectRight, + paint, + ); + break; + case _HighlightPainterStyle.highlightAll: + canvas.drawRect( + Rect.fromLTWH(0, 0, size.width, size.height), + paint, + ); + break; + case _HighlightPainterStyle.none: + break; + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; +} + +class _InputDateRangePickerDialog extends StatelessWidget { + const _InputDateRangePickerDialog({ + required this.selectedStartDate, + required this.selectedEndDate, + required this.currentDate, + required this.picker, + required this.onConfirm, + required this.onCancel, + required this.confirmText, + required this.cancelText, + required this.helpText, + required this.entryModeButton, + }); + + final DateTime? selectedStartDate; + final DateTime? selectedEndDate; + final DateTime? currentDate; + final Widget picker; + final VoidCallback onConfirm; + final VoidCallback onCancel; + final String? confirmText; + final String? cancelText; + final String? helpText; + final Widget? entryModeButton; + + String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final String startText = _formatRangeStartDate(localizations, start, end); + final String endText = _formatRangeEndDate(localizations, start, end, now); + if (start == null || end == null) { + return localizations.unspecifiedDateRange; + } + if (Directionality.of(context) == TextDirection.ltr) { + return '$startText – $endText'; + } else { + return '$endText – $startText'; + } + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + + final Color onPrimarySurfaceColor = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final TextStyle? dateStyle = orientation == Orientation.landscape + ? textTheme.headlineMedium?.apply(color: onPrimarySurfaceColor) + : textTheme.headlineMedium?.apply(color: onPrimarySurfaceColor); + final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); + final String semanticDateText = selectedStartDate != null && selectedEndDate != null + ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' + : ''; + + final Widget header = _DatePickerHeader( + helpText: helpText ?? localizations.dateRangePickerHelpText, + titleText: dateText, + titleSemanticsLabel: semanticDateText, + titleStyle: dateStyle, + orientation: orientation, + isShort: orientation == Orientation.landscape, + entryModeButton: entryModeButton, + ); + + final Widget actions = Container( + alignment: AlignmentDirectional.centerEnd, + constraints: const BoxConstraints(minHeight: 52.0), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: OverflowBar( + spacing: 8, + children: [ + TextButton( + onPressed: onCancel, + child: Text(cancelText ?? localizations.cancelButtonLabel), + ), + TextButton( + onPressed: onConfirm, + child: Text(confirmText ?? localizations.okButtonLabel), + ), + ], + ), + ); + + switch (orientation) { + case Orientation.portrait: + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Expanded(child: picker), + actions, + ], + ); + + case Orientation.landscape: + return Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Flexible( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded(child: picker), + actions, + ], + ), + ), + ], + ); + } + } +} + +/// Provides a pair of text fields that allow the user to enter the start and +/// end dates that represent a range of dates. +class _InputDateRangePicker extends StatefulWidget { + /// Creates a row with two text fields configured to accept the start and end dates + /// of a date range. + _InputDateRangePicker({ + super.key, + DateTime? initialStartDate, + DateTime? initialEndDate, + required DateTime firstDate, + required DateTime lastDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + this.helpText, + this.errorFormatText, + this.errorInvalidText, + this.errorInvalidRangeText, + this.fieldStartHintText, + this.fieldEndHintText, + this.fieldStartLabelText, + this.fieldEndLabelText, + this.autofocus = false, + this.autovalidate = false, + }) : initialStartDate = initialStartDate == null ? null : DateUtils.dateOnly(initialStartDate), + initialEndDate = initialEndDate == null ? null : DateUtils.dateOnly(initialEndDate), + assert(firstDate != null), + firstDate = DateUtils.dateOnly(firstDate), + assert(lastDate != null), + lastDate = DateUtils.dateOnly(lastDate), + assert(firstDate != null), + assert(lastDate != null), + assert(autofocus != null), + assert(autovalidate != null); + + /// The [DateTime] that represents the start of the initial date range selection. + final DateTime? initialStartDate; + + /// The [DateTime] that represents the end of the initial date range selection. + final DateTime? initialEndDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// Called when the user changes the start date of the selected range. + final ValueChanged? onStartDateChanged; + + /// Called when the user changes the end date of the selected range. + final ValueChanged? onEndDateChanged; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String? helpText; + + /// Error text used to indicate the text in a field is not a valid date. + final String? errorFormatText; + + /// Error text used to indicate the date in a field is not in the valid range + /// of [firstDate] - [lastDate]. + final String? errorInvalidText; + + /// Error text used to indicate the dates given don't form a valid date + /// range (i.e. the start date is after the end date). + final String? errorInvalidRangeText; + + /// Hint text shown when the start date field is empty. + final String? fieldStartHintText; + + /// Hint text shown when the end date field is empty. + final String? fieldEndHintText; + + /// Label used for the start date field. + final String? fieldStartLabelText; + + /// Label used for the end date field. + final String? fieldEndLabelText; + + /// {@macro flutter.widgets.editableText.autofocus} + final bool autofocus; + + /// If true, this the date fields will validate and update their error text + /// immediately after every change. Otherwise, you must call + /// [_InputDateRangePickerState.validate] to validate. + final bool autovalidate; + + @override + _InputDateRangePickerState createState() => _InputDateRangePickerState(); +} + +/// The current state of an [_InputDateRangePicker]. Can be used to +/// [validate] the date field entries. +class _InputDateRangePickerState extends State<_InputDateRangePicker> { + late String _startInputText; + late String _endInputText; + DateTime? _startDate; + DateTime? _endDate; + late TextEditingController _startController; + late TextEditingController _endController; + String? _startErrorText; + String? _endErrorText; + bool _autoSelected = false; + + @override + void initState() { + super.initState(); + _startDate = widget.initialStartDate; + _startController = TextEditingController(); + _endDate = widget.initialEndDate; + _endController = TextEditingController(); + } + + @override + void dispose() { + _startController.dispose(); + _endController.dispose(); + super.dispose(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + if (_startDate != null) { + _startInputText = localizations.formatCompactDate(_startDate!); + final bool selectText = widget.autofocus && !_autoSelected; + _updateController(_startController, _startInputText, selectText); + _autoSelected = selectText; + } + + if (_endDate != null) { + _endInputText = localizations.formatCompactDate(_endDate!); + _updateController(_endController, _endInputText, false); + } + } + + /// Validates that the text in the start and end fields represent a valid + /// date range. + /// + /// Will return true if the range is valid. If not, it will + /// return false and display an appropriate error message under one of the + /// text fields. + bool validate() { + String? startError = _validateDate(_startDate); + final String? endError = _validateDate(_endDate); + if (startError == null && endError == null) { + if (_startDate!.isAfter(_endDate!)) { + startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel; + } + } + setState(() { + _startErrorText = startError; + _endErrorText = endError; + }); + return startError == null && endError == null; + } + + DateTime? _parseDate(String? text) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + return localizations.parseCompactDate(text); + } + + String? _validateDate(DateTime? date) { + if (date == null) { + return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel; + } else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) { + return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel; + } + return null; + } + + void _updateController(TextEditingController controller, String text, bool selectText) { + TextEditingValue textEditingValue = controller.value.copyWith(text: text); + if (selectText) { + textEditingValue = textEditingValue.copyWith(selection: TextSelection( + baseOffset: 0, + extentOffset: text.length, + )); + } + controller.value = textEditingValue; + } + + void _handleStartChanged(String text) { + setState(() { + _startInputText = text; + _startDate = _parseDate(text); + widget.onStartDateChanged?.call(_startDate); + }); + if (widget.autovalidate) { + validate(); + } + } + + void _handleEndChanged(String text) { + setState(() { + _endInputText = text; + _endDate = _parseDate(text); + widget.onEndDateChanged?.call(_endDate); + }); + if (widget.autovalidate) { + validate(); + } + } + + @override + Widget build(BuildContext context) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final InputDecorationTheme inputTheme = Theme.of(context).inputDecorationTheme; + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: TextField( + controller: _startController, + decoration: InputDecoration( + border: inputTheme.border ?? const UnderlineInputBorder(), + filled: inputTheme.filled, + hintText: widget.fieldStartHintText ?? localizations.dateHelpText, + labelText: widget.fieldStartLabelText ?? localizations.dateRangeStartLabel, + errorText: _startErrorText, + ), + keyboardType: TextInputType.datetime, + onChanged: _handleStartChanged, + autofocus: widget.autofocus, + ), + ), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: _endController, + decoration: InputDecoration( + border: inputTheme.border ?? const UnderlineInputBorder(), + filled: inputTheme.filled, + hintText: widget.fieldEndHintText ?? localizations.dateHelpText, + labelText: widget.fieldEndLabelText ?? localizations.dateRangeEndLabel, + errorText: _endErrorText, + ), + keyboardType: TextInputType.datetime, + onChanged: _handleEndChanged, + ), + ), + ], + ); + } +} diff --git a/packages/components/lib/project_ui/default/empty_search_page.dart b/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart similarity index 87% rename from packages/components/lib/project_ui/default/empty_search_page.dart rename to modules/basic_system/components/lib/project_ui/default/empty_search_page.dart index f003dfe9..de90b8d7 100644 --- a/packages/components/lib/project_ui/default/empty_search_page.dart +++ b/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; class NotSearchPage extends StatelessWidget { - - const NotSearchPage({Key? key}):super(key: key); + final String tips; + const NotSearchPage({Key? key, required this.tips}):super(key: key); @override Widget build(BuildContext context) { @@ -18,7 +18,7 @@ class NotSearchPage extends StatelessWidget { Container( padding: const EdgeInsets.only(top: 16.0), child: Text( - "哥们,搜点啥...≧◔◡◔≦", + tips, style: TextStyle( fontSize: 20, color: color, diff --git a/packages/components/lib/project_ui/default/empty_shower.dart b/modules/basic_system/components/lib/project_ui/default/empty_shower.dart similarity index 100% rename from packages/components/lib/project_ui/default/empty_shower.dart rename to modules/basic_system/components/lib/project_ui/default/empty_shower.dart diff --git a/packages/components/lib/project_ui/default/error_page.dart b/modules/basic_system/components/lib/project_ui/default/error_page.dart similarity index 99% rename from packages/components/lib/project_ui/default/error_page.dart rename to modules/basic_system/components/lib/project_ui/default/error_page.dart index 49c2b002..ceaa6213 100644 --- a/packages/components/lib/project_ui/default/error_page.dart +++ b/modules/basic_system/components/lib/project_ui/default/error_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; - class ErrorPage extends StatelessWidget { const ErrorPage({Key? key}):super(key: key); diff --git a/packages/components/lib/project_ui/default/error_shower.dart b/modules/basic_system/components/lib/project_ui/default/error_shower.dart similarity index 96% rename from packages/components/lib/project_ui/default/error_shower.dart rename to modules/basic_system/components/lib/project_ui/default/error_shower.dart index 30165bf3..a13760c0 100644 --- a/packages/components/lib/project_ui/default/error_shower.dart +++ b/modules/basic_system/components/lib/project_ui/default/error_shower.dart @@ -29,7 +29,7 @@ class ErrorShower extends StatelessWidget { )), Text( error, - style:TextStyle( + style:const TextStyle( color: Colors.red, fontSize: 18, ), textAlign: TextAlign.center, diff --git a/packages/components/lib/project_ui/default/loading_shower.dart b/modules/basic_system/components/lib/project_ui/default/loading_shower.dart similarity index 100% rename from packages/components/lib/project_ui/default/loading_shower.dart rename to modules/basic_system/components/lib/project_ui/default/loading_shower.dart diff --git a/packages/components/lib/project_ui/default/no_more_widget.dart b/modules/basic_system/components/lib/project_ui/default/no_more_widget.dart similarity index 75% rename from packages/components/lib/project_ui/default/no_more_widget.dart rename to modules/basic_system/components/lib/project_ui/default/no_more_widget.dart index 8677112c..f7a3e038 100644 --- a/packages/components/lib/project_ui/default/no_more_widget.dart +++ b/modules/basic_system/components/lib/project_ui/default/no_more_widget.dart @@ -11,7 +11,9 @@ class NoMoreWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return const SizedBox(height: 56); + double bottom = MediaQuery.of(context).padding.bottom; + + return SizedBox(height: bottom); } } diff --git a/modules/basic_system/components/lib/project_ui/project_ui.dart b/modules/basic_system/components/lib/project_ui/project_ui.dart new file mode 100644 index 00000000..b27f9641 --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/project_ui.dart @@ -0,0 +1,13 @@ +export 'default/empty_search_page.dart'; +export 'default/empty_shower.dart'; +export 'default/error_shower.dart'; +export 'default/loading_shower.dart'; +export 'default/error_page.dart'; +export 'default/no_more_widget.dart'; +export 'wrapper/honour_wrapper.dart'; +export 'unit_app_bar.dart'; +export 'top_bar/desk_simple_top_bar.dart'; +export 'top_bar/desk_tab_top_bar.dart'; +export 'top_bar/desk_knowledge_top_bar.dart'; +export 'time_line/flutter_unit_time_line.dart'; +export 'refresh/refresh.dart'; \ No newline at end of file diff --git a/modules/basic_system/components/lib/project_ui/refresh/refresh.dart b/modules/basic_system/components/lib/project_ui/refresh/refresh.dart new file mode 100644 index 00000000..fa66aedd --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/refresh/refresh.dart @@ -0,0 +1,2 @@ +export 'refresh_config_wrapper.dart'; +export 'package:refresh/refresh.dart' show SmartRefresher,RefreshController; \ No newline at end of file diff --git a/modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart b/modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart new file mode 100644 index 00000000..23d5dc36 --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart @@ -0,0 +1,53 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:refresh/refresh.dart'; + +import 'toly_refresh_indicator.dart'; + +class RefreshConfigWrapper extends StatelessWidget { + final Widget child; + const RefreshConfigWrapper({Key? key, required this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + return RefreshConfiguration( + headerTriggerDistance: 60, + topHitBoundary: 20, + child: child, + headerBuilder: () => const TolyRefreshIndicator(), + footerBuilder: () => CustomFooter( + builder: (BuildContext context, LoadStatus? mode) { + Widget body; + if (mode == LoadStatus.idle) { + body = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(Icons.arrow_upward, color: themeColor), + Text("上拉加载", + style: TextStyle(color: themeColor, height: 1)), + ], + ); + } else if (mode == LoadStatus.loading) { + body = CupertinoActivityIndicator(); + } else if (mode == LoadStatus.failed) { + body = Text("加载失败!点击重试!"); + } else if (mode == LoadStatus.canLoading) { + body = Text("松手,加载更多!", + style: TextStyle(color: themeColor, height: 1)); + } else { + body = Text("没有更多数据了!", + style: TextStyle( + color: Colors.grey, + )); + } + return Container( + height: 55.0, + child: Center(child: body), + ); + }, + ), + ); + } +} diff --git a/modules/basic_system/components/lib/project_ui/refresh/toly_refresh_indicator.dart b/modules/basic_system/components/lib/project_ui/refresh/toly_refresh_indicator.dart new file mode 100644 index 00000000..d44ac625 --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/refresh/toly_refresh_indicator.dart @@ -0,0 +1,92 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart' + hide RefreshIndicator, RefreshIndicatorState; +import 'package:flutter/services.dart'; +import 'package:refresh/refresh.dart'; + +class TolyRefreshIndicator extends RefreshIndicator { + const TolyRefreshIndicator({super.key}); + + @override + State createState() => _TolyRefreshIndicatorState(); +} + +class _TolyRefreshIndicatorState + extends RefreshIndicatorState + with TickerProviderStateMixin { + late AnimationController _iconRotateCtrl; + late Animation rotateAnima; + + @override + void initState() { + super.initState(); + _iconRotateCtrl = + AnimationController(vsync: this, duration: const Duration(milliseconds: 250)); + rotateAnima = Tween(begin: 0.0, end: -0.5).animate(_iconRotateCtrl); + } + + @override + void onModeChange(RefreshStatus? mode) { + if (mode == RefreshStatus.canRefresh) { + HapticFeedback.lightImpact(); + _iconRotateCtrl.forward(); + } + + if (mode == RefreshStatus.idle) { + if (_iconRotateCtrl.isCompleted) { + _iconRotateCtrl.reverse(); + } + } + } + + @override + Future readyToRefresh() { + // TODO: implement readyToRefresh + // final Simulation simulation = SpringSimulation( + // SpringDescription( + // mass: 3.4, + // stiffness: 10000.5, + // damping: 6, + // ), + // _beizerBounceCtl.value, + // 0, + // 1000); + // _beizerBounceCtl.animateWith(simulation); + // if (widget.readyRefresh != null) { + // return widget.readyRefresh!(); + // } + return super.readyToRefresh(); + } + + @override + Widget buildContent(BuildContext context, RefreshStatus mode) { + Widget child = switch (mode) { + RefreshStatus.refreshing => const CupertinoActivityIndicator(radius: 10,), + RefreshStatus.completed => const Icon(Icons.check,color: Colors.green,), + RefreshStatus.idle || RefreshStatus.canRefresh => RotationTransition( + turns: rotateAnima, + child: Icon( + CupertinoIcons.arrow_down, + color: Color(0xff666668), + ), + ), + _ => SizedBox() + }; + + return Container( + // color: Colors.blue, + child: Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: child, + )), + ); + } + + @override + void onOffsetChange(double offset) { + // print(offset); + } +} diff --git a/lib/app/views/time_line/flutter_unit_time_line.dart b/modules/basic_system/components/lib/project_ui/time_line/flutter_unit_time_line.dart similarity index 99% rename from lib/app/views/time_line/flutter_unit_time_line.dart rename to modules/basic_system/components/lib/project_ui/time_line/flutter_unit_time_line.dart index 5ec96824..eedef00a 100644 --- a/lib/app/views/time_line/flutter_unit_time_line.dart +++ b/modules/basic_system/components/lib/project_ui/time_line/flutter_unit_time_line.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:dash_painter/dash_painter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -174,7 +174,7 @@ class TimeLineNode extends StatelessWidget { @override Widget build(BuildContext context) { - Color themeColor = BlocProvider.of(context).state.themeColor; + Color themeColor = BlocProvider.of(context).state.themeColor.color; return IntrinsicHeight( child: Row( diff --git a/lib/app/views/time_line/model/time_node.dart b/modules/basic_system/components/lib/project_ui/time_line/model/time_node.dart similarity index 100% rename from lib/app/views/time_line/model/time_node.dart rename to modules/basic_system/components/lib/project_ui/time_line/model/time_node.dart diff --git a/modules/basic_system/components/lib/project_ui/top_bar/desk_account_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_account_top_bar.dart new file mode 100644 index 00000000..4f562adb --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_account_top_bar.dart @@ -0,0 +1,33 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +class DeskAccountTopBar extends StatelessWidget { + final Widget? leading; + + const DeskAccountTopBar({super.key, this.leading}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Container( + height: 64, + color: isDark ? Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + if (leading != null) Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), + const Spacer(), + const SizedBox( + width: 20, + ), + const WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart new file mode 100644 index 00000000..5cd2f571 --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart @@ -0,0 +1,90 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; + +class DeskKnowledgeTabTopBar extends StatefulWidget { + final List tabs; + final ValueChanged onTabPressed; + + const DeskKnowledgeTabTopBar( + {Key? key, required this.onTabPressed, required this.tabs}) + : super(key: key); + + @override + State createState() => _DeskKnowledgeTabTopBarState(); +} + +class _DeskKnowledgeTabTopBarState extends State + with TickerProviderStateMixin { + late TabController tabController; + + @override + void initState() { + super.initState(); + tabController = TabController(length: widget.tabs.length, vsync: this); + } + + @override + void didUpdateWidget(covariant DeskKnowledgeTabTopBar oldWidget) { + if (oldWidget.tabs.length != widget.tabs.length) { + tabController.dispose(); + tabController = TabController(length: widget.tabs.length, vsync: this); + } + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Stack( + children: [ + Container( + height: 64, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + Expanded( + child: Center( + child: SizedBox( + width: 400, + child: TabBar( + onTap: widget.onTabPressed, + indicatorSize: TabBarIndicatorSize.label, + labelPadding: const EdgeInsets.symmetric(horizontal: 6), + isScrollable: false, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: widget.tabs + .map((String name) => Tab(text: name)) + .toList(), + ), + ), + ), + ), + const SizedBox( + width: 20, + ), + // WindowButtons(), + ], + ), + ), + const Positioned(child: WindowButtons()) + ], + ), + ); + } +} diff --git a/modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart new file mode 100644 index 00000000..5b173b0f --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart @@ -0,0 +1,33 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +class SimpleDeskTopBar extends StatelessWidget { + final Widget? leading; + + const SimpleDeskTopBar({super.key, this.leading}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Container( + height: 64, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + if (leading != null) Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), + const Spacer(), + const SizedBox( + width: 20, + ), + const WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/lib/components/top_bar/desk_tab_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart similarity index 84% rename from lib/components/top_bar/desk_tab_top_bar.dart rename to modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart index 99506111..8c05408f 100644 --- a/lib/components/top_bar/desk_tab_top_bar.dart +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart @@ -1,8 +1,6 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - -import '../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; class DeskTabTopBar extends StatefulWidget { @@ -38,13 +36,16 @@ class _DeskTabTopBarState extends State with TickerProviderState Widget build(BuildContext context) { Color themeColor = Theme.of(context).primaryColor; - return DragToMoveAreaNoDouble( + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, - color: Colors.white, + color: isDark?const Color(0xff2C3036):Colors.white, child: Row( children: [ + const SizedBox(width: 12,), + const BackButton(), SizedBox( width: 350, child: TabBar( @@ -67,9 +68,9 @@ class _DeskTabTopBarState extends State with TickerProviderState tabs: widget.tabs.map((String name) => Tab(text: name)).toList(), ), ), - Spacer(), + const Spacer(), const SizedBox(width: 20,), - WindowButtons(), + const WindowButtons(), ], ), ), diff --git a/packages/components/lib/project_ui/unit_app_bar.dart b/modules/basic_system/components/lib/project_ui/unit_app_bar.dart similarity index 100% rename from packages/components/lib/project_ui/unit_app_bar.dart rename to modules/basic_system/components/lib/project_ui/unit_app_bar.dart diff --git a/packages/components/lib/project_ui/wrapper/honour_wrapper.dart b/modules/basic_system/components/lib/project_ui/wrapper/honour_wrapper.dart similarity index 100% rename from packages/components/lib/project_ui/wrapper/honour_wrapper.dart rename to modules/basic_system/components/lib/project_ui/wrapper/honour_wrapper.dart diff --git a/modules/basic_system/components/pubspec.yaml b/modules/basic_system/components/pubspec.yaml new file mode 100644 index 00000000..b529d128 --- /dev/null +++ b/modules/basic_system/components/pubspec.yaml @@ -0,0 +1,52 @@ +name: components +description: A new Flutter package project. +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/components/test/components_test.dart b/modules/basic_system/components/test/components_test.dart similarity index 100% rename from packages/components/test/components_test.dart rename to modules/basic_system/components/test/components_test.dart diff --git a/modules/basic_system/l10n/.gitignore b/modules/basic_system/l10n/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/basic_system/l10n/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/basic_system/l10n/.metadata b/modules/basic_system/l10n/.metadata new file mode 100644 index 00000000..b2c661a5 --- /dev/null +++ b/modules/basic_system/l10n/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" + +project_type: package diff --git a/packages/db_storage/CHANGELOG.md b/modules/basic_system/l10n/CHANGELOG.md similarity index 100% rename from packages/db_storage/CHANGELOG.md rename to modules/basic_system/l10n/CHANGELOG.md diff --git a/packages/db_storage/LICENSE b/modules/basic_system/l10n/LICENSE similarity index 100% rename from packages/db_storage/LICENSE rename to modules/basic_system/l10n/LICENSE diff --git a/packages/db_storage/README.md b/modules/basic_system/l10n/README.md similarity index 100% rename from packages/db_storage/README.md rename to modules/basic_system/l10n/README.md diff --git a/packages/db_storage/analysis_options.yaml b/modules/basic_system/l10n/analysis_options.yaml similarity index 100% rename from packages/db_storage/analysis_options.yaml rename to modules/basic_system/l10n/analysis_options.yaml diff --git a/modules/basic_system/l10n/desiredFileName.txt b/modules/basic_system/l10n/desiredFileName.txt new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/modules/basic_system/l10n/desiredFileName.txt @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/basic_system/l10n/l10n.yaml b/modules/basic_system/l10n/l10n.yaml new file mode 100644 index 00000000..3419d52f --- /dev/null +++ b/modules/basic_system/l10n/l10n.yaml @@ -0,0 +1,10 @@ +arb-dir: lib/arb +template-arb-file: app_zh.arb +output-localization-file: app_localizations.dart + + +synthetic-package: false +output-dir: lib/gen_l10n +output-class: AppLocalizations +nullable-getter: false +untranslated-messages-file: desiredFileName.txt \ No newline at end of file diff --git a/modules/basic_system/l10n/l10n_copy.sh b/modules/basic_system/l10n/l10n_copy.sh new file mode 100644 index 00000000..7f95dd96 --- /dev/null +++ b/modules/basic_system/l10n/l10n_copy.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# 复制文件夹 +cp -r .dart_tool/flutter_gen/gen_l10n lib + +# 检查拷贝是否成功 +if [ $? -eq 0 ]; then + echo "文件夹拷贝成功" +else + echo "文件夹拷贝失败" +fi \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_en.arb b/modules/basic_system/l10n/lib/arb/app_en.arb new file mode 100644 index 00000000..63d25fa6 --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_en.arb @@ -0,0 +1,199 @@ +{ + "widgetCollection": "Widgets", + "paintCollection": "Painter", + "knowledgeCollection": "Knowledge", + + "homeAccount": "Application", + + "homeAccountTabInfo": "About App", + "homeAccountTabMe": "Contact Me", + "homeAccountSupport": "Support Project", + + "collectCollection": "Collection", + "essentialCollection": "KeypointsCollection", + "treasureTools": "Treasure", + "searchWidget": "search widget ...", + "stateless":"Stateless", + "stateful":"Stateful", + "single":"Single", + "multi":"Multi", + "sliver":"Sliver", + "proxy":"Proxy", + "other":"Other", + "homeTabWidget": "Widget", + "homeTabPaint": "Paint", + "homeTabKnowledge": "Knowledge", + "homeTabTools": "Treasure", + "homeTabMine": "Mine", + "favorite":"Collected", + + "userCollection":"Collection", + + + "appSettings":"Application Setting", + "darkMode":"Dark Mode ", + "themeColorSetting":"Theme Color", + "fontSetting":"Font Setting", + "settingLanguage": "Language Setting", + "codeHighlightStyle":"Code Highlight Style", + "versionInformation":"App Version", + "showFloatingTools":"Show floating tools", + "displayPerformanceFloatingLayer":"Performance Layer", + + "showBackground":"Display Background", + + "followSystem":"Follow system", + "manualSetting":"Manual settings", + "lightMode":"Light mode", + "appDetails":"Application details", + + "settingLanguageText": "Setting Language", + + "checkUpdate":"Check New Version", + "downloadNewVersion":"Download New Version", + "downloadingNewVersion":"Downloading New Version ...", + "currentIsNew":"There is the latest version of FlutterUnit!", + + "enterComponentName":"Input widget name", + "containerComponents":"Container components", + "relatedComponents":"Related Widgets", + "componentTavern":"Component Tavern", + "cherishedComponents":"Treasure components", + "textImageCollection":"TextImageCollection", + "layoutCollection":"LayoutCollection", + "eventCollection":"EventCollection", + "animationCollection":"AnimationCollection", + "slidingCollection":"SlidingCollection", + "decorationCollection":"DecorativeCollection", + "assemblyCollection":"AssemblyCollection", + "functionCollection":"FeatureCollection", + "popupCollection":"Pop upCollection", + "themeCollection":"ThemeCollection", + "derivativeCollection":"DerivativeCollection", + "hardToCategorize":"It's hard to distinguish", + "basicDrawing":"Basic drawing", + "animationGesture":"Animated gestures", + "particleDrawing":"Particle drawing", + "interestingDrawing":"Fun drawing", + "artGallery":"Art galleries ", + "drawingOfImages":"This example explains how to draw images: by loading images and drawing image resources to a specified area. Draw a batch of 45 \"angled grid lines on the upper layer to practice drawing the lines ", + "digitalDisplayTube":"This example introduces how to draw LED digital display tubes to practice the use, transformation, combination of path paths, and knowledge of component packaging. It is a very good drawing case ", + "pathDrawing":"This example introduces how to perform simple path drawing, rotate the drawing board, and combine animation to make the windmill rotate. This is a very concise case of combining drawing and animation. ", + "gridCoordinateSystem":"This example explains how to use line diameter and text to draw a grid coordinate system, and encapsulate the drawn objects for easy reuse. The coordinate system also provides reference during drawing, which is essential for beginners.", + "polarCoordinateSystemOfFaces":"This example explains how to use a polar coordinate system to draw a plane and collect polar coordinates based on a function equation for drawing. ", + "drawFunctionCurvesForPathPairs":"This example explains how to use a path to draw a function curve, fitting a small number of points on the function curve through a Bessel curve. ", + "drawRegularPolygons":"This example introduces how to collect points in a circle and draw regular polygons, which is a good example for practicing drawing and forming paths. \n Special operations:+, - Modify the number of edges", + "randomNumberProcessing":"This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data.", + "clockDrawing":"This example uses the drawing of a clock to practice the drawing technique of rotating scale types in Flutter, and uses animation to rotate the dial pointer.", + "drawSprings":" This example introduces how to draw a spring, stretch and compress it vertically through the contact points, and restore the animation when releasing it. It is a good comprehensive small case. Special operation: Drag the telescopic spring up and down ", + "theApplicationOfAnglesInDrawing":"This example explains how to perform rotational motion based on a point as the center. Learn the application of the angle between two points in drawing. \n Special operation: Click to run", + "usingShadersAndFilters":"This example explains how to use shaders and filters in painting, and achieve a rotating streamer effect through animation with numerical variations.", + "pathDrawingFunctionCurve":"This example explains how to use path to draw function curves and use path measurement for animation", + "thePathOfBingDwenDwen":"This sample will draw the path of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics and use path measurement for animation. \n Special operation: Click to run", + "drawCubicBesselCurve":"This example introduces how to draw a cubic Bezier curve, determine whether a point is activated through the contacts, and use this to control the position of the point to achieve drag control effect. \n Special operation: Click on the drawing point, double-click to clear it", + "theEffectOfAnimationCurve":"This example provides an intuitive way to examine the effect of animation curves, allowing everyone to have a deeper understanding of animation. \n Special operation: Click to run", + "randomParticlesAndBoundaryBouncing":"This example introduces how to create random particles and handle boundary bounce logic, which is a great starting point for learning particle motion. Special operation: click to stop running ", + "particleCollision":"This example introduces how to perform collision detection on a particle and split multiple particles, which is an interesting case. \n Special operation: Click Reset", + "particle":"This example introduces using particles to represent images and animating them to achieve explosive effects. \nSpecial operation: Click to run", + "rectangleAndRandomNumbers":"This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data. \nSpecial operation: Click to randomly generate", + "bingDwenDwen":"This example is to draw the shape of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics, from which you can learn knowledge such as path drawing and gradient colors.", + "pufengInjectionTest":"This sample implements the testing process of the Pufeng needle injection test, estimating pi based on probability. You can learn some drawing tips and logical processing of data.", + "ticTacToe":"This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset", + "tiledLines":"The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "joyDivision":"The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "cubicDisarray":"The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "triangularMesh":"The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "unDeuxTrois": "The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "circlePacking":"The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "hypnoticSquares":"The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "pietMondrian":"The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "downloadCompressedPackage":"Usage: \n1. Select the icon in iconfont.cn, add the project, and download the compressed file. \n2. Select the Flutter project address, configure resource and product file locations. \n3.Click the Generate Code button to generate the relevant code.", + "qAIssues":"The QA data in the key points collection is included in FlutterUnit's issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.", + "tips":"tips:", + "visualSorting":"Visual sorting", + "visual":"Visual sorting", + "insertion": "Insert sorting", + "bubble": "Bubble sorting", + "cocktail": "Cocktail sorting (bidirectional bubble sorting)", + "comb": "Comb sorting", + "pigeonHole": "Pigeonhole sorting ", + "shell": "Shell sorting ", + "selection": "Select sorting", + "gnome": "Dwarf Sorting", + "cycle": "Circular sorting", + "heap": "Heap sorting", + "quick": "Quick sorting", + "merge": "Merge sorting", + "sortingAlgorithmConfiguration":"Sorting algorithm configuration", + "dataCount":"Data quantity (number)", + "timeInterval":"Time interval (microseconds)", + "randomSeed":"Random Seed", + "codeGeneration":"Code generation", + "generateCode":"Generate Code", + "artifactLocation":"Product location", + "codeClassLocation":"Code class storage location", + "resourceDirectory":"Resource Catalog", + "iconfontResourceLocation":"iconfont Resource storage location", + "projectPath":"Project Path", + "inputProjectAddress":"Please select or enter the project address", + "iconfontCompressedPackagePath":"Iconfont Compressed package path", + "pleaseSelectOrInputIconfontCompressedPackagePath":"Please select or enter the compressed file path for iconfont download", + "stayTuned":"Stay tuned", + "iconFont":"IconFont", + "dataClass":"Data class", + "stateManagement":"State management", + "jsonParsing":"Json Parsing", + "clickHereToJump":"Click here to jump to", + "knowledgeTabToly":"Toly Articles", + "knowledgeTabAlgo":"Algo Player", + "knowledgeTabLayout":"Layout Treasury", + "knowledgeTabPoint":"Key Points", + "knowledgeConstruction":"In Construction", + "knowledgeToJuejin":"To Juejin", + "srcPath":"Source Path", + "widgetsInn":"Widgets Inn", + "likedWidgets":"Liked Widgets", + + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"After activation, it will follow the system to turn on or off dark mode", + "basicDrawingDesc":"Including some basic graphics drawing examples would be very friendly to beginners in programming. Through these examples, one can learn how to draw basic shapes such as points, lines, rectangles, circles, arcs, text, images, etc., and understand the usage of core objects in drawing like Canvas, Paint, Path, etc.", + "animationGestureDesc":"Includes some drawing examples of animation and gestures, which make drawing more interactive. Through these examples, one can learn the usage of animation and gestures, such as sliding, rotating, scaling, moving effects, etc., making drawing not just static presentation.", + "particleDrawingDesc": "Includes some drawing examples related to particles, which are top-level operations in drawing. Through these examples, one can learn how to use particles to create stunning visual effects, such as particle clocks, particle explosions, particle backgrounds, etc., giving drawing endless possibilities.", + "interestingDrawingDesc": "Includes some fun drawing examples, let's experience the joy of drawing, programming, and intelligence together here.", + "artGalleryDesc": "Includes some hall-level drawing examples, which are pinnacle works of drawing. They have no practicality and are not born for any demand. They exist only because they exist, serving as a medium for human wisdom and expression, called art.", + "checkDatabaseNewVersion":"Check for new versions of the database", + "viewThisProjectGithubRepository":"《View the Github Repository for this project》", + "dataManagement":"Data management", + "backupFavoritesCollectionData":"Backup Collection Data", + "syncFavoritesCollectionData":"Synchronize collection data", + "favoritesCollectionDataReset":"Reset Collection Data", + "resetSuccess":"Reset successful!", + "dataSetBackupSuccess":"Dataset backup successful!", + "dataSetBackupFailure":"Dataset backup failed!", + "dataSynchronizationCopySuccess":"Data synchronization successful!", + "dataSynchronizationCopyFailure":"Data synchronization failed!", + "destructionRed":"Destruction Red ", + "rageOrange":"Anger Orange", + "warningYellow":"Warning Yellow", + "camouflageGreen":"Disguising Green", + "coldBlue":"Indifferent Blue", + "infiniteBlue":"Infinite Indigo", + "mysteryPurple":"Mysterious Purple", + "destinyBlack":"Destiny Black", + + "toly":"toly", + "dartHandbook":"Dart Handbook", + "aboutApplications":"About Applications", + "contactThisKing":"Contact this king", + "codeCopiedSuccessfully":"Code copied successfully", + "favoriteFolderManagement":"Favorite folder management", + "assembly":"Assembly", + "draw":"Draw", + "knowledge":"Knowledge", + "collection":"Collection", + "my":"My", + "picture":"pics", + "widgetInn":"Widget Collection", + "emptySearch":"No Result \n(≡ _ ≡)/~┴┴", + "searchSomething":"Search Something ≧◔◡◔≦", + "slogan":"The unity of flutter, The unity of coder." +} \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_ja.arb b/modules/basic_system/l10n/lib/arb/app_ja.arb new file mode 100644 index 00000000..d35a3fab --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ja.arb @@ -0,0 +1,188 @@ +{ + "widgetCollection": "ウィジェットコレクション", + "paintCollection": "描画コレクション", + "knowledgeCollection": "知識集", + "treasureTools": "ツールボックス", + "collectCollection": "コレクション集", + "essentialCollection": "要点集", + "homeAccount": "アプリ情報", + "homeAccountTabInfo": "アプリについて", + "homeAccountTabMe": "本王に連絡", + "homeAccountSupport": "プロジェクトをサポート", + "searchWidget": "ウィジェットを検索", + "stateless": "ステートレス", + "stateful": "ステートフル", + "single": "シングルレンダリング", + "multi": "マルチレンダリング", + "sliver": "スライバー", + "proxy": "プロキシ", + "other": "その他", + "homeTabWidget": "ウィジェット", + "homeTabPaint": "描画", + "homeTabKnowledge": "知識", + "homeTabTools": "ツール", + "homeTabMine": "マイ", + "dataManagement": "データ管理", + "userCollection": "マイコレクション", + "aboutApplications": "アプリについて", + "contactThisKing": "本王に連絡", + "appSettings": "アプリ設定", + "darkMode": "ダークモード", + "themeColorSetting": "テーマカラー設定", + "fontSetting": "フォント設定", + "settingLanguageText": "多言語", + "codeHighlightStyle": "コードハイライトスタイル", + "versionInformation": "バージョン情報", + "displayPerformanceFloatingLayer": "パフォーマンスフローティングレイヤーを表示", + "showFloatingTools": "フローティングツールを表示", + "followSystem": "システムに従う", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "有効にすると、システムに従ってダークモードをオンまたはオフにします", + "manualSetting": "手動設定", + "lightMode": "ライトモード", + "settingLanguage": "言語設定", + "appDetails": "アプリ詳細", + "checkUpdate": "新しいバージョンを確認", + "downloadNewVersion": "新しいバージョンをダウンロード", + "downloadingNewVersion": "新しいバージョンをダウンロード中...", + "currentIsNew": "現在のアプリは最新バージョンです!", + "checkDatabaseNewVersion": "データベースの新しいバージョンを確認", + "viewThisProjectGithubRepository": "《このプロジェクトのGithubリポジトリを表示》", + "favorite": "お気に入り", + "enterComponentName": "コンポーネント名を入力", + "containerComponents": "コンテナコンポーネント", + "componentTavern": "コンポーネント酒場", + "cherishedComponents": "大切なコンポーネント", + "textImageCollection": "テキスト画像集", + "layoutCollection": "レイアウト集", + "eventCollection": "イベント集", + "animationCollection": "アニメーション集", + "slidingCollection": "スライド集", + "decorationCollection": "装飾集", + "assemblyCollection": "アセンブリ集", + "functionCollection": "機能集", + "popupCollection": "ポップアップ集", + "themeCollection": "テーマ集", + "derivativeCollection": "派生集", + "hardToCategorize": "分類が難しい", + "basicDrawing": "基本描画", + "basicDrawingDesc": "基本的な図形描画のケースを収録しています。これらのケースは、描画を始めたばかりのプログラマーにとって非常に役立ちます。これらのケースを通じて、点、線、矩形、円、円弧、テキスト、画像などの基本的な図形の描画方法を学び、Canvas、Paint、Pathなどの描画の核心オブジェクトの使用方法を理解できます。", + "animationGesture": "アニメーションとジェスチャー", + "animationGestureDesc": "アニメーションとジェスチャーの描画ケースを収録しています。これらのケースは、描画をより操作可能にします。これらのケースを通じて、スライド、回転、拡大縮小、移動などの効果を学び、描画が静的な表現だけでなくなることを理解できます。", + "particleDrawing": "粒子描画", + "particleDrawingDesc": "粒子関連の描画ケースを収録しています。これらのケースは、描画のトップレベルの操作です。これらのケースを通じて、粒子を使用して驚くべき視覚効果を描画する方法を学び、粒子時計、粒子爆発、粒子背景などの効果を実現し、描画に無限の可能性を与えます。", + "interestingDrawing": "面白い描画", + "interestingDrawingDesc": "いくつかの面白い描画ケースを収録しています。ここで一緒に描画の楽しさ、プログラミングの楽しさ、そして知恵の楽しさを体験しましょう。", + "artGallery": "アートギャラリー", + "artGalleryDesc": "殿堂級の描画ケースを収録しています。これらのケースは、描画の頂点作品であり、それらは実用性がなく、いかなるニーズのためでもありません。それらは存在するために存在し、人間の知恵と表現の媒体であり、芸術と呼ばれます。", + "drawingOfImages": "このサンプルでは、画像を描画する方法を紹介します。画像をロードし、指定された領域に画像リソースを描画します。上層に45度傾いたグリッド線を描画し、線の描画を練習します。", + "digitalDisplayTube": "このサンプルでは、LEDデジタル表示管を描画する方法を紹介し、パスPathの使用、変換、組み合わせ、およびコンポーネントのカプセル化の知識を練習します。非常に良い描画ケースです。", + "pathDrawing": "このサンプルでは、簡単なパスの描画とキャンバスの回転を紹介し、アニメーションと組み合わせて風車を回転させます。これは、描画とアニメーションを組み合わせた非常に簡潔なケースです。", + "gridCoordinateSystem": "このサンプルでは、線パスとテキストを使用してグリッド座標系を描画し、描画オブジェクトをカプセル化して再利用しやすくします。座標系は描画時に参考を提供し、入門に最適です。", + "polarCoordinateSystemOfFaces": "このサンプルでは、平面の極座標系を使用して描画し、関数方程式に基づいて極座標を収集して描画する方法を紹介します。", + "drawFunctionCurvesForPathPairs": "このサンプルでは、パスを使用して関数曲線を描画し、関数曲線上の少数の点をベジェ曲線でフィッティングする方法を紹介します。", + "drawRegularPolygons": "このサンプルでは、円内で点を収集し、正多角形を描画する方法を紹介します。描画とパス形成の練習に最適なケースです。\n特殊操作:+、- で辺の数を変更", + "randomNumberProcessing": "このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。", + "clockDrawing": "このサンプルでは、時計の描画を通じて、Flutterでの回転目盛りの描画テクニックを練習し、アニメーションで時計の針を回転させます。", + "drawSprings": "このサンプルでは、バネを描画し、垂直にドラッグして伸縮し、手を離すと復元アニメーションを行う方法を紹介します。非常に良い総合的な小ケースです。特殊操作:上下にドラッグしてバネを伸縮", + "theApplicationOfAnglesInDrawing": "このサンプルでは、ある点を中心に回転運動を行う方法を紹介します。これにより、2点間の角度を描画に適用する方法を学びます。\n特殊操作:クリックして実行", + "usingShadersAndFilters": "このサンプルでは、描画でシェーダーとフィルターを使用し、アニメーションで数値を変化させて回転する光の効果を実現する方法を紹介します。", + "pathDrawingFunctionCurve": "このサンプルでは、パスを使用して関数曲線を描画し、パス測定を使用してアニメーションを行う方法を紹介します。", + "thePathOfBingDwenDwen": "このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンのパスを描画し、パス測定を使用してアニメーションを行います。\n特殊操作:クリックして実行", + "drawCubicBesselCurve": "このサンプルでは、3次ベジェ曲線を描画し、タッチポイントを使用してある点がアクティブかどうかを判断し、それに応じて点の位置を制御してドラッグ制御効果を実現する方法を紹介します。\n特殊操作:クリックで点を描画、ダブルクリックでクリア", + "theEffectOfAnimationCurve": "このサンプルでは、アニメーションカーブの効果を直感的に確認し、アニメーションに対する理解を深めます。\n特殊操作:クリックして実行", + "randomParticlesAndBoundaryBouncing": "このサンプルでは、ランダムな粒子を作成し、境界でのバウンスロジックを処理する方法を紹介します。粒子運動を学ぶのに非常に良い入門ケースです。特殊操作:クリックで停止/実行", + "particleCollision": "このサンプルでは、個々の粒子の衝突検出を行い、複数の粒子に分裂させる方法を紹介します。非常に面白いケースです。\n特殊操作:クリックでリセット", + "particle": "このサンプルでは、画像を粒子として表現し、粒子にアニメーションを適用して爆発効果を実現する方法を紹介します。\n特殊操作:クリックして実行", + "rectangleAndRandomNumbers": "このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。\n特殊操作:クリックしてランダム生成", + "bingDwenDwen": "このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンの形を描画し、パス描画やグラデーションなどの知識を学びます。", + "pufengInjectionTest": "このサンプルでは、蒲豊の針投げテストのプロセスを実装し、確率を使用して円周率を推定します。描画の小技やデータの論理処理を学ぶことができます。", + "ticTacToe": "このサンプルでは、三目並べの描画と論理検証を通じて、ジェスチャー、描画、アニメーション、検証などの重要なスキルを組み合わせます。非常に良い練習ケースです。\n特殊操作:ダブルクリックでリセット", + "tiledLines": "このサンプルは、generativeartistry.comのtiled-linesに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "joyDivision": "このサンプルは、generativeartistry.comのjoy-divisionに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "cubicDisarray": "このサンプルは、generativeartistry.comのcubic-disarrayに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "triangularMesh": "このサンプルは、generativeartistry.comのtriangular-meshに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "unDeuxTrois": "このサンプルは、generativeartistry.comのun-deux-troisに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "circlePacking": "このサンプルは、generativeartistry.comのcircle-packingに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "hypnoticSquares": "このサンプルは、generativeartistry.comのhypnotic-squaresに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "pietMondrian": "このサンプルは、generativeartistry.comのpiet-mondrianに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "downloadCompressedPackage": "使用方法:\n1. iconfont.cnでアイコンを選び、プロジェクトに追加し、圧縮パッケージをダウンロードします。\n2. Flutterプロジェクトのアドレスを選択し、リソースと生成物ファイルの場所を設定します。\n3. コード生成ボタンをクリックすると、関連するコードが生成されます。", + "qAIssues": "要点集録のQAデータは、rUnitのpointタグが付いたissuesに収録されています。データを提供する必要がある場合は、issuesで質問してください。", + "tips": "注:", + "visualSorting": "可視化ソート", + "visual": "可視ソート", + "insertion": "挿入ソート", + "bubble": "バブルソート", + "cocktail": "カクテルソート(双方向バブルソート)", + "comb": "コームソート", + "pigeonHole": "鳩の巣ソート", + "shell": "シェルソート", + "selection": "選択ソート", + "gnome": "ノームソート", + "cycle": "サイクルソート", + "heap": "ヒープソート", + "quick": "クイックソート", + "merge": "マージソート", + "sortingAlgorithmConfiguration": "ソートアルゴリズム設定", + "dataCount": "データ数(個数)", + "timeInterval": "時間間隔(マイクロ秒)", + "randomSeed": "ランダムシード", + "codeGeneration": "コード生成", + "generateCode": "コードを生成", + "artifactLocation": "生成物の場所", + "codeClassLocation": "コードクラスの保存場所", + "resourceDirectory": "リソースディレクトリ", + "iconfontResourceLocation": "iconfontリソースの保存場所", + "projectPath": "プロジェクトパス", + "inputProjectAddress": "プロジェクトアドレスを選択または入力してください", + "iconfontCompressedPackagePath": "Iconfont圧縮パッケージのパス", + "pleaseSelectOrInputIconfontCompressedPackagePath": "iconfontのダウンロードした圧縮パッケージのパスを選択または入力してください", + "stayTuned": "お楽しみに", + "iconFont": "IconFont", + "dataClass": "データクラス", + "stateManagement": "状態管理", + "jsonParsing": "Json解析", + "clickHereToJump": "ここをクリックしてジャンプ", + "knowledgeTabToly": "ジェット文庫", + "knowledgeTabAlgo": "アルゴリズム演繹", + "knowledgeTabLayout": "レイアウト宝庫", + "knowledgeTabPoint": "要点宝庫", + "knowledgeConstruction": "建設中", + "knowledgeToJuejin": "掘金へ", + "srcPath": "ソースアドレス", + "widgetsInn": "ウィジェット酒場", + "likedWidgets": "大切なウィジェット", + "relatedComponents": "関連コンポーネント", + "backupFavoritesCollectionData": "お気に入りコレクションデータのバックアップ", + "syncFavoritesCollectionData": "お気に入りコレクションデータの同期", + "favoritesCollectionDataReset": "お気に入りコレクションデータのリセット", + "resetSuccess": "リセット成功!", + "dataSetBackupSuccess": "データセットのバックアップ成功!", + "dataSetBackupFailure": "データセットのバックアップ失敗!", + "dataSynchronizationCopySuccess": "データ同期コピー成功!", + "dataSynchronizationCopyFailure": "データ同期コピー失敗!", + "destructionRed": "破滅の赤", + "rageOrange": "怒りのオレンジ", + "warningYellow": "警告の黄", + "camouflageGreen": "偽装の緑", + "coldBlue": "冷徹な青", + "infiniteBlue": "無限の藍", + "mysteryPurple": "神秘の紫", + "destinyBlack": "帰宿の黒", + + "showBackground": "背景を表示", + "toly": "張風捷特烈", + "dartHandbook": "Dart 手引き", + + "codeCopiedSuccessfully": "コードがコピーされました", + "favoriteFolderManagement": "お気に入りフォルダの管理", + "assembly": "コンポーネント", + "draw": "描画", + "knowledge": "知識", + "collection": "コレクション", + "my": "私の", + "picture": "枚", + "widgetInn": "コンポーネント酒場", + "emptySearch": "データがありません、俺もどうしようもない\n(≡ _ ≡)/~┴┴", + "searchSomething": "友よ、何か検索しよう…≧◔◡◔≦", + "slogan": "Flutterの連携、プログラマーの連携" + } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_ko.arb b/modules/basic_system/l10n/lib/arb/app_ko.arb new file mode 100644 index 00000000..374ad4e0 --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ko.arb @@ -0,0 +1,186 @@ +{ +"widgetCollection": "위젯 컬렉션", +"paintCollection": "그림 컬렉션", +"knowledgeCollection": "지식 모음", +"treasureTools": "도구 보물상자", +"collectCollection": "컬렉션 모음", +"essentialCollection": "핵심 모음", +"homeAccount": "앱 정보", +"homeAccountTabInfo": "앱 정보", +"homeAccountTabMe": "저에게 연락", +"homeAccountSupport": "프로젝트 지원", +"searchWidget": "위젯 검색", +"stateless": "무상태", +"stateful": "상태 있음", +"single": "단일 렌더링", +"multi": "다중 렌더링", +"sliver": "슬라이버", +"proxy": "프록시", +"other": "기타", +"homeTabWidget": "위젯", +"homeTabPaint": "그리기", +"homeTabKnowledge": "지식", +"homeTabTools": "도구", +"homeTabMine": "내 정보", +"dataManagement": "데이터 관리", +"userCollection": "내 컬렉션", +"aboutApplications": "앱 정보", +"contactThisKing": "저에게 연락", +"appSettings": "앱 설정", +"darkMode": "다크 모드", +"themeColorSetting": "테마 색상 설정", +"fontSetting": "폰트 설정", +"settingLanguageText": "다국어", +"codeHighlightStyle": "코드 하이라이트 스타일", +"versionInformation": "버전 정보", +"displayPerformanceFloatingLayer": "성능 플로팅 레이어 표시", +"showFloatingTools": "플로팅 도구 표시", +"followSystem": "시스템 따라가기", +"afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "시스템 설정에 따라 다크 모드를 켜거나 끕니다.", +"manualSetting": "수동 설정", +"lightMode": "라이트 모드", +"settingLanguage": "언어 설정", +"appDetails": "앱 상세 정보", +"checkUpdate": "새 버전 확인", +"downloadNewVersion": "새 버전 다운로드", +"downloadingNewVersion": "새 버전 다운로드 중...", +"currentIsNew": "현재 버전이 최신입니다!", +"checkDatabaseNewVersion": "데이터베이스 새 버전 확인", +"viewThisProjectGithubRepository": "《이 프로젝트의 Github 저장소 보기》", +"favorite": "즐겨찾기", +"enterComponentName": "컴포넌트 이름 입력", +"containerComponents": "컨테이너 컴포넌트", +"componentTavern": "컴포넌트 선술집", +"cherishedComponents": "소중한 컴포넌트", +"textImageCollection": "텍스트 이미지 모음", +"layoutCollection": "레이아웃 모음", +"eventCollection": "이벤트 모음", +"animationCollection": "애니메이션 모음", +"slidingCollection": "슬라이딩 모음", +"decorationCollection": "장식 모음", +"assemblyCollection": "조립 모음", +"functionCollection": "기능 모음", +"popupCollection": "팝업 모음", +"themeCollection": "테마 모음", +"derivativeCollection": "파생 모음", +"hardToCategorize": "분류하기 어려움", +"basicDrawing": "기본 그리기", +"basicDrawingDesc": "기본 도형 그리기 예제를 포함합니다. 이 예제들은 그리기를 처음 접하는 프로그래머에게 매우 친숙할 것입니다. 이 예제들을 통해 점, 선, 사각형, 원, 호, 텍스트, 이미지 등 기본 도형을 그리는 방법을 배우고, Canvas, Paint, Path 등 그리기의 핵심 객체 사용법을 익힐 수 있습니다.", +"animationGesture": "애니메이션 제스처", +"animationGestureDesc": "애니메이션과 제스처 그리기 예제를 포함합니다. 이 예제들은 그리기를 더욱 상호작용적으로 만듭니다. 이 예제들을 통해 슬라이드, 회전, 확대/축소, 이동 등의 효과를 배울 수 있으며, 그리기가 단순히 정적인 표현이 아니게 됩니다.", +"particleDrawing": "입자 그리기", +"particleDrawingDesc": "입자 관련 그리기 예제를 포함합니다. 이 예제들은 그리기의 최고 수준의 작업입니다. 이 예제들을 통해 입자를 사용하여 놀라운 시각적 효과를 그리는 방법을 배울 수 있습니다. 입자 시계, 입자 폭발, 입자 배경 등 다양한 효과를 통해 그리기의 무한한 가능성을 경험할 수 있습니다.", +"interestingDrawing": "재미있는 그리기", +"interestingDrawingDesc": "재미있는 그리기 예제를 포함합니다. 여기서 그리기, 프로그래밍, 지혜의 즐거움을 함께 경험해 보세요.", +"artGallery": "예술 갤러리", +"artGalleryDesc": "최고 수준의 그리기 예제를 포함합니다. 이 예제들은 그리기의 정점에 있는 작품들로, 실용성은 없지만 존재 자체로 의미가 있는 예술 작품입니다.", +"drawingOfImages": "이 예제는 이미지를 그리는 방법을 소개합니다: 이미지를 로드하고 지정된 영역에 그립니다. 상단에 45도 각도의 그리드 선을 그려 선 그리기를 연습합니다.", +"digitalDisplayTube": "이 예제는 LED 디지털 디스플레이 튜브를 그리는 방법을 소개하며, Path 사용, 변환, 조합 및 컴포넌트 캡슐화를 연습합니다. 매우 좋은 그리기 예제입니다.", +"pathDrawing": "이 예제는 간단한 경로 그리기 및 캔버스 회전을 소개하며, 애니메이션을 결합하여 풍차를 회전시킵니다. 매우 간결한 그리기와 애니메이션 결합 예제입니다.", +"gridCoordinateSystem": "이 예제는 선 경로와 텍스트를 사용하여 그리드 좌표계를 그리는 방법을 소개하며, 그리기 객체를 캡슐화하여 재사용하기 쉽게 만듭니다. 좌표계는 그리기 시 참조를 제공하며, 입문자에게 필수입니다.", +"polarCoordinateSystemOfFaces": "이 예제는 평면의 극좌표계를 그리는 방법을 소개하며, 함수 방정식에 따라 극좌표를 수집하여 그립니다.", +"drawFunctionCurvesForPathPairs": "이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 함수 곡선 상의 소량의 점을 베지어 곡선으로 피팅합니다.", +"drawRegularPolygons": "이 예제는 원 안에서 점을 수집하여 정다각형을 그리는 방법을 소개하며, 그리기 및 경로 형성 연습에 매우 좋은 예제입니다.\n특수 조작: +, - 로 변 수정", +"randomNumberProcessing": "이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.", +"clockDrawing": "이 예제는 시계 그리기를 통해 Flutter에서 회전 눈금 그리기 기술을 연습하고, 애니메이션을 통해 시계 바늘이 회전하도록 합니다.", +"drawSprings": "이 예제는 스프링을 그리는 방법을 소개하며, 수직 드래그로 스프링을 늘이거나 줄이고, 놓을 때 복원 애니메이션을 수행합니다. 매우 좋은 종합 예제입니다. 특수 조작: 위아래 드래그로 스프링 늘이기/줄이기", +"theApplicationOfAnglesInDrawing": "이 예제는 특정 점을 중심으로 회전 운동을 수행하는 방법을 소개합니다. 이를 통해 두 점 사이의 각도가 그리기에서 어떻게 적용되는지 배울 수 있습니다.\n특수 조작: 클릭하여 실행", +"usingShadersAndFilters": "이 예제는 그리기에서 셰이더와 필터를 사용하는 방법을 소개하며, 애니메이션을 통해 수치를 변경하여 회전하는 빛의 효과를 만듭니다.", +"pathDrawingFunctionCurve": "이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 경로 측정을 사용하여 애니메이션을 만듭니다.", +"thePathOfBingDwenDwen": "이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 경로를 그리며, 경로 측정을 사용하여 애니메이션을 만듭니다.\n특수 조작: 클릭하여 실행", +"drawCubicBesselCurve": "이 예제는 3차 베지어 곡선을 그리는 방법을 소개하며, 접점을 통해 특정 점이 활성화되었는지 판단하여 점의 위치를 제어합니다.\n특수 조작: 클릭하여 점 그리기, 더블 클릭하여 지우기", +"theEffectOfAnimationCurve": "이 예제는 애니메이션 곡선의 효과를 직관적으로 보여줍니다. 이를 통해 애니메이션에 대한 이해를 높일 수 있습니다.\n특수 조작: 클릭하여 실행", +"randomParticlesAndBoundaryBouncing": "이 예제는 무작위 입자를 생성하고 경계에서 튕기는 로직을 처리하는 방법을 소개합니다. 입자 운동을 배우기에 매우 좋은 입문 예제입니다. 특수 조작: 클릭하여 정지/실행", +"particleCollision": "이 예제는 개별 입자에 대한 충돌 감지를 수행하고, 여러 입자로 분열시키는 방법을 소개합니다. 매우 재미있는 예제입니다.\n특수 조작: 클릭하여 재설정", +"particle": "이 예제는 이미지를 입자로 표현하고, 입자에 애니메이션을 적용하여 폭발 효과를 만드는 방법을 소개합니다.\n특수 조작: 클릭하여 실행", +"rectangleAndRandomNumbers": "이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.\n특수 조작: 클릭하여 무작위 생성", +"bingDwenDwen": "이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 형태를 그리는 방법을 소개하며, 경로 그리기 및 그라데이션 색상 사용법을 배울 수 있습니다.", +"pufengInjectionTest": "이 예제는 푸펑 투시험의 테스트 과정을 구현하며, 확률을 통해 원주율을 추정합니다. 그리기 기술 및 데이터 논리 처리 방법을 배울 수 있습니다.", +"ticTacToe": "이 예제는 틱택토 그리기 및 논리 검증을 통해 제스처, 그리기, 애니메이션, 검증 등의 중요한 기술을 종합적으로 연습할 수 있는 매우 좋은 예제입니다.\n특수 조작: 더블 클릭하여 재설정", +"tiledLines": "이 예제는 generativeartistry.com의 tiled-lines에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"joyDivision": "이 예제는 generativeartistry.com의 joy-division에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"cubicDisarray": "이 예제는 generativeartistry.com의 cubic-disarray에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"triangularMesh": "이 예제는 generativeartistry.com의 triangular-mesh에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"unDeuxTrois": "이 예제는 generativeartistry.com의 un-deux-trois에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"circlePacking": "이 예제는 generativeartistry.com의 circle-packing에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"hypnoticSquares": "이 예제는 generativeartistry.com의 hypnotic-squares에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"pietMondrian": "이 예제는 generativeartistry.com의 piet-mondrian에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"downloadCompressedPackage": "사용 방법:\n1. iconfont.cn에서 아이콘을 선택하고 프로젝트에 추가한 후 압축 파일을 다운로드합니다.\n2. Flutter 프로젝트 경로를 선택하고 리소스 및 산출물 파일 위치를 설정합니다.\n3. 코드 생성 버튼을 클릭하여 관련 코드를 생성합니다.", +"qAIssues": "핵심 모음의 QA 데이터는 rUnit의 point 태그가 있는 issues에 포함되어 있습니다. 데이터를 제공하려면 issues에서 질문하세요.", +"tips": "참고:", +"visualSorting": "시각적 정렬", +"visual": "시각적 정렬", +"insertion": "삽입 정렬", +"bubble": "버블 정렬", +"cocktail": "칵테일 정렬(양방향 버블 정렬)", +"comb": "빗질 정렬", +"pigeonHole": "비둘기집 정렬", +"shell": "셸 정렬", +"selection": "선택 정렬", +"gnome": "노움 정렬", +"cycle": "순환 정렬", +"heap": "힙 정렬", +"quick": "퀵 정렬", +"merge": "병합 정렬", +"sortingAlgorithmConfiguration": "정렬 알고리즘 설정", +"dataCount": "데이터 수(개수)", +"timeInterval": "시간 간격(마이크로초)", +"randomSeed": "무작위 시드", +"codeGeneration": "코드 생성", +"generateCode": "코드 생성", +"artifactLocation": "산출물 위치", +"codeClassLocation": "코드 클래스 위치", +"resourceDirectory": "리소스 디렉토리", +"iconfontResourceLocation": "iconfont 리소스 위치", +"projectPath": "프로젝트 경로", +"inputProjectAddress": "프로젝트 주소를 선택하거나 입력하세요", +"iconfontCompressedPackagePath": "Iconfont 압축 파일 경로", +"pleaseSelectOrInputIconfontCompressedPackagePath": "iconfont 다운로드 압축 파일 경로를 선택하거나 입력하세요", +"stayTuned": "기대해 주세요", +"iconFont": "IconFont", +"dataClass": "데이터 클래스", +"stateManagement": "상태 관리", +"jsonParsing": "Json 파싱", +"clickHereToJump": "여기를 클릭하여 이동", +"knowledgeTabToly": "제트 문고", +"knowledgeTabAlgo": "알고리즘 연습", +"knowledgeTabLayout": "레이아웃 보물", +"knowledgeTabPoint": "핵심 보물", +"knowledgeConstruction": "구축 중", +"knowledgeToJuejin": "Juejin으로 이동", +"srcPath": "소스 경로", +"widgetsInn": "위젯 선술집", +"likedWidgets": "소중한 위젯", +"relatedComponents": "관련 컴포넌트", +"backupFavoritesCollectionData": "즐겨찾기 컬렉션 데이터 백업", +"syncFavoritesCollectionData": "즐겨찾기 컬렉션 데이터 동기화", +"favoritesCollectionDataReset": "즐겨찾기 컬렉션 데이터 재설정", +"resetSuccess": "재설정 성공!", +"dataSetBackupSuccess": "데이터 세트 백업 성공!", +"dataSetBackupFailure": "데이터 세트 백업 실패!", +"dataSynchronizationCopySuccess": "데이터 동기화 복사 성공!", +"dataSynchronizationCopyFailure": "데이터 동기화 복사 실패!", + "destructionRed": "파괴의 빨강", + "rageOrange": "분노의 주황", + "warningYellow": "경고의 노랑", + "camouflageGreen": "위장의 초록", + "coldBlue": "냉담의 파랑", + "infiniteBlue": "무한의 남색", + "mysteryPurple": "신비의 보라", + "destinyBlack": "운명의 검정", + "showBackground": "배경 표시", + "toly": "장풍제특렬", + "dartHandbook": "Dart 핸드북", + "codeCopiedSuccessfully": "코드 복사 성공", + "favoriteFolderManagement": "즐겨찾기 폴더 관리", + "assembly": "컴포넌트", + "draw": "그리기", + "knowledge": "지식", + "collection": "컬렉션", + "my": "내 정보", + "picture": "그림", + "widgetInn": "위젯 선술집", + "emptySearch": "데이터가 없습니다, 형님도 방법이 없어요\n(≡ _ ≡)/~┴┴", + "searchSomething": "형님, 뭘 검색하시겠어요...≧◔◡◔≦", + "slogan": "Flutter의 연합, 프로그래머의 연합" + } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_ru.arb b/modules/basic_system/l10n/lib/arb/app_ru.arb new file mode 100644 index 00000000..bf24822f --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ru.arb @@ -0,0 +1,194 @@ +{ + "widgetCollection": "Сборник компонентов", + "paintCollection": "Сборник рисования", + "knowledgeCollection": "Сборник знаний", + "treasureTools": "Сундучок инструментов", + "collectCollection": "Сборник избранного", + "essentialCollection": "Сборник ключевых моментов", + "homeAccount": "Информация о приложении", + "homeAccountTabInfo": "О приложении", + "homeAccountTabMe": "Связаться с этим королём", + "homeAccountSupport": "Проекты поддержки", + "searchWidget": "Поиск компонентов", + "stateless": "Без состояния", + "stateful": "С состоянием", + "single": "Один рендеринг", + "multi": "Многократный рендеринг", + "sliver": "Скользящая панель", + "proxy": "Прокси", + "other": "Другие", + "homeTabWidget": "Компоненты", + "homeTabPaint": "Рисование", + "homeTabKnowledge": "Знания", + "homeTabTools": "Инструменты", + "homeTabMine": "Мой профиль", + "dataManagement": "Управление данными", + "userCollection": "Мои избранные", + "aboutApplications": "О приложении", + "contactThisKing": "Связаться с этим королём", + "appSettings": "Настройки приложения", + "darkMode": "Тёмный режим", + "themeColorSetting": "Настройки темы", + "fontSetting": "Настройки шрифта", + "settingLanguageText": "Многоязычность", + "codeHighlightStyle": "Стиль подсветки кода", + "versionInformation": "Информация о версии", + "displayPerformanceFloatingLayer": "Показать плавающий слой производительности", + + "showFloatingTools": "Показать плавающие инструменты", + + "followSystem": "Следовать за системой", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "После включения будет следовать за системой для включения или отключения тёмного режима", + "manualSetting": "Ручные настройки", + "lightMode": "Светлый режим", + "settingLanguage": "Настройки языка", + + "appDetails": "Детали приложения", + "checkUpdate": "Проверить обновление", + "downloadNewVersion": "Скачать новое обновление", + "downloadingNewVersion": "Скачивание нового обновления...", + "currentIsNew": "Текущая версия приложения уже самая новая!", + "checkDatabaseNewVersion": "Проверить обновление базы данных", + "viewThisProjectGithubRepository": "Посмотреть репозиторий проекта на Github", + + "favorite": "Добавлено в избранное", + "enterComponentName": "Введите название компонента", + "containerComponents": "Контейнерные компоненты", + "componentTavern": "Таверна компонентов", + "cherishedComponents": "Ценные компоненты", + "textImageCollection": "Сборник изображений и текста", + "layoutCollection": "Сборник макетов", + "eventCollection": "Сборник событий", + "animationCollection": "Сборник анимаций", + "slidingCollection": "Сборник слайдов", + "decorationCollection": "Сборник декораций", + "assemblyCollection": "Сборник сборки", + "functionCollection": "Сборник функций", + "popupCollection": "Сборник всплывающих окон", + "themeCollection": "Сборник тем", + "derivativeCollection": "Сборник производных", + "hardToCategorize": "Трудно классифицировать", + "basicDrawing": "Основы рисования", + "basicDrawingDesc": "Включает несколько примеров базового рисования, которые будут полезны для начинающих программистов. Эти примеры научат рисованию базовых фигур, таких как точки, линии, прямоугольники, круги и текст.", + "animationGesture": "Анимация жестов", + "animationGestureDesc": "Содержит примеры рисования анимаций и жестов, которые сделают рисование более интерактивным. Эти примеры научат использовать анимации и жесты, такие как скольжение, вращение, масштабирование и перемещение.", + "particleDrawing": "Частицы в рисовании", + "particleDrawingDesc": "Включает примеры рисования с использованием частиц. Эти примеры покажут, как использовать частицы для создания зрелищных эффектов, таких как взрывы или анимации с частицами.", + "interestingDrawing": "Интересные рисунки", + "interestingDrawingDesc": "Примеры интересных и забавных рисунков, где мы можем наслаждаться процессом рисования и программирования.", + "artGallery": "Галерея искусства", + "artGalleryDesc": "Содержит примеры высокого искусства, которые не предназначены для практических целей, а являются выражением человеческого интеллекта и творчества.", + "drawingOfImages": "Пример рисования изображений: загрузка изображения и его отрисовка в определенной области. На верхнем слое добавлены линии сетки для практики рисования линий.", + "digitalDisplayTube": "Пример рисования цифровых трубок с использованием пути Path и анимации.", + "pathDrawing": "Пример рисования простых путей с анимацией.", + "gridCoordinateSystem": "Пример рисования сетки координат с линиями и текстом для новичков.", + "polarCoordinateSystemOfFaces": "Пример рисования полярной координатной системы с использованием функций.", + "drawFunctionCurvesForPathPairs": "Пример рисования функциональных кривых с использованием пути и Беезье.", + "drawRegularPolygons": "Пример рисования правильных многоугольников внутри круга.", + "randomNumberProcessing": "Пример рисования прямоугольников с обработкой случайных чисел.", + "clockDrawing": "Пример рисования часов с анимацией.", + "drawSprings": "Пример рисования пружины с анимацией сжатия и растяжения.", + "theApplicationOfAnglesInDrawing": "Пример рисования с использованием углов для вращения.", + "usingShadersAndFilters": "Пример использования шейдеров и фильтров для создания анимации.", + "pathDrawingFunctionCurve": "Пример рисования кривых с помощью пути и измерения анимации.", + "thePathOfBingDwenDwen": "Пример рисования пути маскота Олимпиады Пекин-2022 с использованием анимации пути.", + "drawCubicBesselCurve": "Пример рисования кривой кубического Безье с возможностью перетаскивания точек.", + "theEffectOfAnimationCurve": "Пример демонстрации эффекта анимационной кривой для углубленного понимания анимаций.", + "randomParticlesAndBoundaryBouncing": "Пример создания случайных частиц с отскоком от границ.", + "particleCollision": "Пример столкновений частиц с анимацией их распада.", + "particle": "Пример взрыва изображений с использованием частиц.", + "rectangleAndRandomNumbers": "Пример рисования прямоугольников с использованием случайных чисел.", + "bingDwenDwen": "Пример рисования формы маскота Олимпиады Пекин-2022.", + "pufengInjectionTest": "Пример теста для вычисления числа Пи с использованием вероятности.", + "ticTacToe": "Пример игры в крестики-нолики с логикой и анимацией.", + "tiledLines": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "joyDivision": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "cubicDisarray": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "triangularMesh": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "unDeuxTrois": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "circlePacking": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "hypnoticSquares": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "pietMondrian": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "downloadCompressedPackage": "Инструкция по использованию:\n1. Выберите и скачайте иконки на iconfont.cn.\n2. Настройте путь к проекту Flutter.\n3. Нажмите кнопку для генерации кода.", + "qAIssues": "Данные QA из сборника важных моментов rUnit будут добавлены в issues с меткой point.", + "tips": "Совет:", + "visualSorting": "Визуальная сортировка", + "visual": "Визуальная сортировка", + "insertion": "Сортировка вставками", + "bubble": "Пузырьковая сортировка", + "cocktail": "Коктейльная сортировка", + "comb": "Сортировка расческой", + "pigeonHole": "Сортировка по принципу дырок для голубей", + "shell": "Сортировка Шелла", + "selection": "Сортировка выбором", + "gnome": "Сортировка гномом", + "cycle": "Циклическая сортировка", + "heap": "Сортировка кучей", + "quick": "Быстрая сортировка", + "merge": "Сортировка слиянием", + "sortingAlgorithmConfiguration": "Настройки сортировки", + "dataCount": "Количество данных", + "timeInterval": "Интервал времени", + "randomSeed": "Случайное зерно", + "codeGeneration": "Генерация кода", + "generateCode": "Сгенерировать код", + "artifactLocation": "Местоположение артефакта", + "codeClassLocation": "Местоположение класса кода", + "resourceDirectory": "Каталог ресурсов", + "iconfontResourceLocation": "Местоположение ресурсов iconfont", + "projectPath": "Путь проекта", + "inputProjectAddress": "Выберите или введите путь к проекту", + "iconfontCompressedPackagePath": "Путь к сжатию иконок", + "pleaseSelectOrInputIconfontCompressedPackagePath": "Пожалуйста, выберите или введите путь к сжатому пакету iconfont", + "stayTuned": "Ожидайте", + "iconFont": "IconFont", + "dataClass": "Класс данных", + "stateManagement": "Управление состоянием", + "jsonParsing": "Парсинг JSON", + "clickHereToJump": "Нажмите здесь для перехода", + + "knowledgeTabToly": "Библиотека Jet", + "knowledgeTabAlgo": "Алгоритмы", + "knowledgeTabLayout": "Библиотека макетов", + "knowledgeTabPoint": "Библиотека ключевых моментов", + "knowledgeConstruction": "На стадии строительства", + "knowledgeToJuejin": "Перейти на Juejin", + "srcPath": "Путь к исходному коду", + "widgetsInn": "Таверна компонентов", + "likedWidgets": "Избранные компоненты", + "relatedComponents": "Связанные компоненты", + + "backupFavoritesCollectionData": "Резервное копирование данных избранного", + "syncFavoritesCollectionData": "Синхронизация данных избранного", + "favoritesCollectionDataReset": "Сброс данных избранного", + "resetSuccess": "Сброс успешен!", + "dataSetBackupSuccess": "Резервное копирование данных прошло успешно!", + "dataSetBackupFailure": "Ошибка резервного копирования данных!", + "dataSynchronizationCopySuccess": "Синхронизация данных успешна!", + "dataSynchronizationCopyFailure": "Ошибка синхронизации данных!", + "destructionRed": "Красный разрушения", + "rageOrange": "Оранжевый гнева", + "warningYellow": "Желтый предупреждения", + "camouflageGreen": "Зеленый камуфляжа", + "coldBlue": "Холодный синий", + "infiniteBlue": "Бесконечный синий", + "mysteryPurple": "Тайный фиолетовый", + "destinyBlack": "Черный судьбы", + + "showBackground": "Показать фон", + "toly": "Толь", + "dartHandbook": "Руководство Dart", + + "codeCopiedSuccessfully": "Код успешно скопирован", + "favoriteFolderManagement": "Управление папками избранного", + "assembly": "Сборка", + "draw": "Рисование", + "knowledge": "Знания", + "collection": "Коллекция", + "my": "Мои", + "picture": "Картинка", + "widgetInn": "Таверна компонентов", + "emptySearch": "Данных нет, я тоже не знаю, что делать\n(≡ _ ≡)/~┴┴", + "searchSomething": "Друзья, давайте что-то искать…≧◔◡◔≦", + "slogan": "Связь Flutter, связь программистов" +} diff --git a/modules/basic_system/l10n/lib/arb/app_zh.arb b/modules/basic_system/l10n/lib/arb/app_zh.arb new file mode 100644 index 00000000..b76c3bc1 --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_zh.arb @@ -0,0 +1,195 @@ +{ + "widgetCollection": "组件集录", + "paintCollection": "绘制集录", + "knowledgeCollection": "知识集锦", + "treasureTools": "工具宝箱", + "collectCollection": "收藏集录", + "essentialCollection": "要点集录", + "homeAccount": "应用信息", + "homeAccountTabInfo": "关于应用", + "homeAccountTabMe": "联系本王", + "homeAccountSupport": "支持项目", + "searchWidget": "搜索组件", + "stateless":"无态", + "stateful":"有态", + "single":"单渲", + "multi":"多渲", + "sliver":"滑片", + "proxy":"代理", + "other":"其他", + "homeTabWidget": "组件", + "homeTabPaint": "绘制", + "homeTabKnowledge": "知识", + "homeTabTools": "工具", + "homeTabMine": "我的", + "dataManagement":"数据管理", + "userCollection":"我的收藏", + "aboutApplications":"关于应用", + "contactThisKing":"联系本王", + "appSettings":"应用设置", + "darkMode":"深色模式", + "themeColorSetting":"主题色设置", + "fontSetting":"字体设置", + "settingLanguageText": "多语言", + "codeHighlightStyle":"代码高亮样式", + "versionInformation":"版本信息", + "displayPerformanceFloatingLayer":"显示性能浮层", + + + "showFloatingTools":"显示浮动工具", + + "followSystem":"跟随系统", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"开启后,将跟随系统打开或关闭深色模式", + "manualSetting":"手动设置", + "lightMode":"浅色模式", + "settingLanguage": "设置语言", + + "appDetails":"应用详情", + "checkUpdate":"检查新版本", + "downloadNewVersion":"下载新版本", + "downloadingNewVersion":"新版本下载中...", + "currentIsNew":"当前应用已是最新版本!", + "checkDatabaseNewVersion":"检查数据库新版本", + "viewThisProjectGithubRepository":"《查看本项目Github仓库》", + + "favorite":"已收藏", + "enterComponentName":"输入组件名称", + "containerComponents":"容器组件", + "componentTavern":"组件酒肆", + "cherishedComponents":"珍藏组件", + "textImageCollection":"图文集", + "layoutCollection":"布局集", + "eventCollection":"事件集", + "animationCollection":"动画集", + "slidingCollection":"滑动集", + "decorationCollection":"装饰集", + "assemblyCollection":"组装集", + "functionCollection":"功能集", + "popupCollection":"弹出集", + "themeCollection":"主题集", + "derivativeCollection":"衍生集", + "hardToCategorize":"很难分", + "basicDrawing":"基础绘制", + "basicDrawingDesc":"收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。", + "animationGesture":"动画手势", + "animationGestureDesc":"收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。", + "particleDrawing":"粒子绘制", + "particleDrawingDesc":"收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。", + "interestingDrawing":"趣味绘制", + "interestingDrawingDesc":"收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。", + "artGallery":"艺术画廊", + "artGalleryDesc":"收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。", + "drawingOfImages":"本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 ", + "digitalDisplayTube":"本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 ", + "pathDrawing":"本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 ", + "gridCoordinateSystem":"本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 ", + "polarCoordinateSystemOfFaces":"本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 ", + "drawFunctionCurvesForPathPairs":"本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 ", + "drawRegularPolygons":"本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数", + "randomNumberProcessing":"本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。", + "clockDrawing":"本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。", + "drawSprings":" 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 ", + "theApplicationOfAnglesInDrawing":"本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行", + "usingShadersAndFilters":"本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。", + "pathDrawingFunctionCurve":"本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画", + "thePathOfBingDwenDwen":"本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行", + "drawCubicBesselCurve":"本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除", + "theEffectOfAnimationCurve":"本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行", + "randomParticlesAndBoundaryBouncing":" 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 ", + "particleCollision":"本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置", + "particle":"本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行", + "rectangleAndRandomNumbers":"本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", + "bingDwenDwen":"本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。", + "pufengInjectionTest":"本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。", + "ticTacToe":"本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", + "tiledLines":"本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "joyDivision":"本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "cubicDisarray":"本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "triangularMesh":"本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "unDeuxTrois": "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "circlePacking":"本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "hypnoticSquares":"本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "pietMondrian":"本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "downloadCompressedPackage":"使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。", + "qAIssues":"要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。", + "tips":"注:", + "visualSorting":"可视化排序", + "visual":"可视排序", + "insertion": "插入排序", + "bubble": "冒泡排序", + "cocktail": "鸡尾酒排序(双向冒泡排序)", + "comb": "梳排序", + "pigeonHole": "鸽巢排序", + "shell": "希尔排序", + "selection": "选择排序", + "gnome": "侏儒排序", + "cycle": "循环排序", + "heap": "堆排序", + "quick": "快速排序", + "merge": "归并排序", + "sortingAlgorithmConfiguration":"排序算法配置", + "dataCount":"数据数量(个数)", + "timeInterval":"时间间隔(微秒)", + "randomSeed":"随机种子", + "codeGeneration":"代码生成", + "generateCode":"生成代码", + "artifactLocation":"产物位置", + "codeClassLocation":"代码类存放位置", + "resourceDirectory":"资源目录", + "iconfontResourceLocation":"iconfont 资源存放位置", + "projectPath":"项目路径", + "inputProjectAddress":"请选择或输入项目地址", + "iconfontCompressedPackagePath":"Iconfont 压缩包路径", + "pleaseSelectOrInputIconfontCompressedPackagePath":"请选择或输入 iconfont 下载的压缩包路径", + "stayTuned":"敬请期待", + "iconFont":"IconFont", + "dataClass":"数据类", + "stateManagement":"状态管理", + "jsonParsing":"Json 解析", + "clickHereToJump":"点击这里跳转", + + "knowledgeTabToly":"捷特文库", + "knowledgeTabAlgo":"算法演绎", + "knowledgeTabLayout":"布局宝库", + "knowledgeTabPoint":"要点宝库", + "knowledgeConstruction":"正在建设中", + "knowledgeToJuejin":"前往掘金", + "srcPath":"源码地址", + "widgetsInn":"组件酒肆", + "likedWidgets":"珍藏组件", + "relatedComponents":"相关组件", + + "backupFavoritesCollectionData":"备份收藏集数据", + "syncFavoritesCollectionData":"同步收藏集数据", + "favoritesCollectionDataReset":"收藏集数据重置", + "resetSuccess":"重置成功!", + "dataSetBackupSuccess":"数据集备份成功!", + "dataSetBackupFailure":"数据集备份失败!", + "dataSynchronizationCopySuccess":"数据同步份成功!", + "dataSynchronizationCopyFailure":"数据同步份失败!", + "destructionRed":"毁灭之红", + "rageOrange":"愤怒之橙", + "warningYellow":"警告之黄", + "camouflageGreen":"伪装之绿", + "coldBlue":"冷漠之蓝", + "infiniteBlue":"无限之靛", + "mysteryPurple":"神秘之紫", + "destinyBlack":"归宿之黑", + + "showBackground":"显示背景", + "toly":"张风捷特烈", + "dartHandbook":"Dart 手册", + + "codeCopiedSuccessfully":"代码复制成功", + "favoriteFolderManagement":"收藏夹管理", + "assembly":"组件", + "draw":"绘制", + "knowledge":"知识", + "collection":"收藏", + "my":"我的", + "picture":"幅", + "widgetInn":"组件酒肆", + "emptySearch":"没数据,哥也没办法\n(≡ _ ≡)/~┴┴", + "searchSomething":"哥们,搜点啥...≧◔◡◔≦", + "slogan":"Flutter 的联合,编程者的联合" +} \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/enum/language.dart b/modules/basic_system/l10n/lib/enum/language.dart new file mode 100644 index 00000000..2fbd17a5 --- /dev/null +++ b/modules/basic_system/l10n/lib/enum/language.dart @@ -0,0 +1,25 @@ +import 'dart:ui'; + +enum Language { + zh_CN(locale: Locale('zh','CN'), label: '简体中文'), + en_US(locale: Locale('en','US'), label: 'English'), + ru_RU(locale: Locale('ru','RU'), label: 'Русский'), + fr_FR(locale: Locale('fr','FR'), label: 'Français'), + ko_KR(locale: Locale('ko','KR'), label: '한국어'), + de_DE(locale: Locale('de','DE'), label: 'Deutsch'), + ja_JP(locale: Locale('ja','JP'), label: '日本語'), + it_IT(locale: Locale('it','IT'), label: 'Italiano'), + pt_PT(locale: Locale('pt','PT'), label: 'Português'), + es_ES(locale: Locale('es','ES'), label: 'Español'), + ; + + String get code => '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + + final Locale locale; + final String label; + + const Language({ + required this.locale, + required this.label, + }); +} diff --git a/modules/basic_system/l10n/lib/ext.dart b/modules/basic_system/l10n/lib/ext.dart new file mode 100644 index 00000000..86cc2fba --- /dev/null +++ b/modules/basic_system/l10n/lib/ext.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +import 'gen_l10n/app_localizations.dart'; +export 'gen_l10n/app_localizations.dart' show AppLocalizations; +const l10nDelegates = AppLocalizations.localizationsDelegates; +const l10nLocales = AppLocalizations.supportedLocales; + +extension AppLocalizationsX on BuildContext { + AppLocalizations get l10n => AppLocalizations.of(this); +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart new file mode 100644 index 00000000..bdf016a8 --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart @@ -0,0 +1,1242 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.dart'; +import 'app_localizations_ja.dart'; +import 'app_localizations_ko.dart'; +import 'app_localizations_ru.dart'; +import 'app_localizations_zh.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'gen_l10n/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations of(BuildContext context) { + return Localizations.of(context, AppLocalizations)!; + } + + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('ja'), + Locale('ko'), + Locale('ru'), + Locale('zh') + ]; + + /// No description provided for @widgetCollection. + /// + /// In zh, this message translates to: + /// **'组件集录'** + String get widgetCollection; + + /// No description provided for @paintCollection. + /// + /// In zh, this message translates to: + /// **'绘制集录'** + String get paintCollection; + + /// No description provided for @knowledgeCollection. + /// + /// In zh, this message translates to: + /// **'知识集锦'** + String get knowledgeCollection; + + /// No description provided for @treasureTools. + /// + /// In zh, this message translates to: + /// **'工具宝箱'** + String get treasureTools; + + /// No description provided for @collectCollection. + /// + /// In zh, this message translates to: + /// **'收藏集录'** + String get collectCollection; + + /// No description provided for @essentialCollection. + /// + /// In zh, this message translates to: + /// **'要点集录'** + String get essentialCollection; + + /// No description provided for @homeAccount. + /// + /// In zh, this message translates to: + /// **'应用信息'** + String get homeAccount; + + /// No description provided for @homeAccountTabInfo. + /// + /// In zh, this message translates to: + /// **'关于应用'** + String get homeAccountTabInfo; + + /// No description provided for @homeAccountTabMe. + /// + /// In zh, this message translates to: + /// **'联系本王'** + String get homeAccountTabMe; + + /// No description provided for @homeAccountSupport. + /// + /// In zh, this message translates to: + /// **'支持项目'** + String get homeAccountSupport; + + /// No description provided for @searchWidget. + /// + /// In zh, this message translates to: + /// **'搜索组件'** + String get searchWidget; + + /// No description provided for @stateless. + /// + /// In zh, this message translates to: + /// **'无态'** + String get stateless; + + /// No description provided for @stateful. + /// + /// In zh, this message translates to: + /// **'有态'** + String get stateful; + + /// No description provided for @single. + /// + /// In zh, this message translates to: + /// **'单渲'** + String get single; + + /// No description provided for @multi. + /// + /// In zh, this message translates to: + /// **'多渲'** + String get multi; + + /// No description provided for @sliver. + /// + /// In zh, this message translates to: + /// **'滑片'** + String get sliver; + + /// No description provided for @proxy. + /// + /// In zh, this message translates to: + /// **'代理'** + String get proxy; + + /// No description provided for @other. + /// + /// In zh, this message translates to: + /// **'其他'** + String get other; + + /// No description provided for @homeTabWidget. + /// + /// In zh, this message translates to: + /// **'组件'** + String get homeTabWidget; + + /// No description provided for @homeTabPaint. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get homeTabPaint; + + /// No description provided for @homeTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get homeTabKnowledge; + + /// No description provided for @homeTabTools. + /// + /// In zh, this message translates to: + /// **'工具'** + String get homeTabTools; + + /// No description provided for @homeTabMine. + /// + /// In zh, this message translates to: + /// **'我的'** + String get homeTabMine; + + /// No description provided for @dataManagement. + /// + /// In zh, this message translates to: + /// **'数据管理'** + String get dataManagement; + + /// No description provided for @userCollection. + /// + /// In zh, this message translates to: + /// **'我的收藏'** + String get userCollection; + + /// No description provided for @aboutApplications. + /// + /// In zh, this message translates to: + /// **'关于应用'** + String get aboutApplications; + + /// No description provided for @contactThisKing. + /// + /// In zh, this message translates to: + /// **'联系本王'** + String get contactThisKing; + + /// No description provided for @appSettings. + /// + /// In zh, this message translates to: + /// **'应用设置'** + String get appSettings; + + /// No description provided for @darkMode. + /// + /// In zh, this message translates to: + /// **'深色模式'** + String get darkMode; + + /// No description provided for @themeColorSetting. + /// + /// In zh, this message translates to: + /// **'主题色设置'** + String get themeColorSetting; + + /// No description provided for @fontSetting. + /// + /// In zh, this message translates to: + /// **'字体设置'** + String get fontSetting; + + /// No description provided for @settingLanguageText. + /// + /// In zh, this message translates to: + /// **'多语言'** + String get settingLanguageText; + + /// No description provided for @codeHighlightStyle. + /// + /// In zh, this message translates to: + /// **'代码高亮样式'** + String get codeHighlightStyle; + + /// No description provided for @versionInformation. + /// + /// In zh, this message translates to: + /// **'版本信息'** + String get versionInformation; + + /// No description provided for @displayPerformanceFloatingLayer. + /// + /// In zh, this message translates to: + /// **'显示性能浮层'** + String get displayPerformanceFloatingLayer; + + /// No description provided for @showFloatingTools. + /// + /// In zh, this message translates to: + /// **'显示浮动工具'** + String get showFloatingTools; + + /// No description provided for @followSystem. + /// + /// In zh, this message translates to: + /// **'跟随系统'** + String get followSystem; + + /// No description provided for @afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode. + /// + /// In zh, this message translates to: + /// **'开启后,将跟随系统打开或关闭深色模式'** + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode; + + /// No description provided for @manualSetting. + /// + /// In zh, this message translates to: + /// **'手动设置'** + String get manualSetting; + + /// No description provided for @lightMode. + /// + /// In zh, this message translates to: + /// **'浅色模式'** + String get lightMode; + + /// No description provided for @settingLanguage. + /// + /// In zh, this message translates to: + /// **'设置语言'** + String get settingLanguage; + + /// No description provided for @appDetails. + /// + /// In zh, this message translates to: + /// **'应用详情'** + String get appDetails; + + /// No description provided for @checkUpdate. + /// + /// In zh, this message translates to: + /// **'检查新版本'** + String get checkUpdate; + + /// No description provided for @downloadNewVersion. + /// + /// In zh, this message translates to: + /// **'下载新版本'** + String get downloadNewVersion; + + /// No description provided for @downloadingNewVersion. + /// + /// In zh, this message translates to: + /// **'新版本下载中...'** + String get downloadingNewVersion; + + /// No description provided for @currentIsNew. + /// + /// In zh, this message translates to: + /// **'当前应用已是最新版本!'** + String get currentIsNew; + + /// No description provided for @checkDatabaseNewVersion. + /// + /// In zh, this message translates to: + /// **'检查数据库新版本'** + String get checkDatabaseNewVersion; + + /// No description provided for @viewThisProjectGithubRepository. + /// + /// In zh, this message translates to: + /// **'《查看本项目Github仓库》'** + String get viewThisProjectGithubRepository; + + /// No description provided for @favorite. + /// + /// In zh, this message translates to: + /// **'已收藏'** + String get favorite; + + /// No description provided for @enterComponentName. + /// + /// In zh, this message translates to: + /// **'输入组件名称'** + String get enterComponentName; + + /// No description provided for @containerComponents. + /// + /// In zh, this message translates to: + /// **'容器组件'** + String get containerComponents; + + /// No description provided for @componentTavern. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get componentTavern; + + /// No description provided for @cherishedComponents. + /// + /// In zh, this message translates to: + /// **'珍藏组件'** + String get cherishedComponents; + + /// No description provided for @textImageCollection. + /// + /// In zh, this message translates to: + /// **'图文集'** + String get textImageCollection; + + /// No description provided for @layoutCollection. + /// + /// In zh, this message translates to: + /// **'布局集'** + String get layoutCollection; + + /// No description provided for @eventCollection. + /// + /// In zh, this message translates to: + /// **'事件集'** + String get eventCollection; + + /// No description provided for @animationCollection. + /// + /// In zh, this message translates to: + /// **'动画集'** + String get animationCollection; + + /// No description provided for @slidingCollection. + /// + /// In zh, this message translates to: + /// **'滑动集'** + String get slidingCollection; + + /// No description provided for @decorationCollection. + /// + /// In zh, this message translates to: + /// **'装饰集'** + String get decorationCollection; + + /// No description provided for @assemblyCollection. + /// + /// In zh, this message translates to: + /// **'组装集'** + String get assemblyCollection; + + /// No description provided for @functionCollection. + /// + /// In zh, this message translates to: + /// **'功能集'** + String get functionCollection; + + /// No description provided for @popupCollection. + /// + /// In zh, this message translates to: + /// **'弹出集'** + String get popupCollection; + + /// No description provided for @themeCollection. + /// + /// In zh, this message translates to: + /// **'主题集'** + String get themeCollection; + + /// No description provided for @derivativeCollection. + /// + /// In zh, this message translates to: + /// **'衍生集'** + String get derivativeCollection; + + /// No description provided for @hardToCategorize. + /// + /// In zh, this message translates to: + /// **'很难分'** + String get hardToCategorize; + + /// No description provided for @basicDrawing. + /// + /// In zh, this message translates to: + /// **'基础绘制'** + String get basicDrawing; + + /// No description provided for @basicDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。'** + String get basicDrawingDesc; + + /// No description provided for @animationGesture. + /// + /// In zh, this message translates to: + /// **'动画手势'** + String get animationGesture; + + /// No description provided for @animationGestureDesc. + /// + /// In zh, this message translates to: + /// **'收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。'** + String get animationGestureDesc; + + /// No description provided for @particleDrawing. + /// + /// In zh, this message translates to: + /// **'粒子绘制'** + String get particleDrawing; + + /// No description provided for @particleDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。'** + String get particleDrawingDesc; + + /// No description provided for @interestingDrawing. + /// + /// In zh, this message translates to: + /// **'趣味绘制'** + String get interestingDrawing; + + /// No description provided for @interestingDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。'** + String get interestingDrawingDesc; + + /// No description provided for @artGallery. + /// + /// In zh, this message translates to: + /// **'艺术画廊'** + String get artGallery; + + /// No description provided for @artGalleryDesc. + /// + /// In zh, this message translates to: + /// **'收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。'** + String get artGalleryDesc; + + /// No description provided for @drawingOfImages. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 '** + String get drawingOfImages; + + /// No description provided for @digitalDisplayTube. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 '** + String get digitalDisplayTube; + + /// No description provided for @pathDrawing. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 '** + String get pathDrawing; + + /// No description provided for @gridCoordinateSystem. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 '** + String get gridCoordinateSystem; + + /// No description provided for @polarCoordinateSystemOfFaces. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 '** + String get polarCoordinateSystemOfFaces; + + /// No description provided for @drawFunctionCurvesForPathPairs. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 '** + String get drawFunctionCurvesForPathPairs; + + /// No description provided for @drawRegularPolygons. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数'** + String get drawRegularPolygons; + + /// No description provided for @randomNumberProcessing. + /// + /// In zh, this message translates to: + /// **'本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。'** + String get randomNumberProcessing; + + /// No description provided for @clockDrawing. + /// + /// In zh, this message translates to: + /// **'本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。'** + String get clockDrawing; + + /// No description provided for @drawSprings. + /// + /// In zh, this message translates to: + /// **' 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 '** + String get drawSprings; + + /// No description provided for @theApplicationOfAnglesInDrawing. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行'** + String get theApplicationOfAnglesInDrawing; + + /// No description provided for @usingShadersAndFilters. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。'** + String get usingShadersAndFilters; + + /// No description provided for @pathDrawingFunctionCurve. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画'** + String get pathDrawingFunctionCurve; + + /// No description provided for @thePathOfBingDwenDwen. + /// + /// In zh, this message translates to: + /// **'本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行'** + String get thePathOfBingDwenDwen; + + /// No description provided for @drawCubicBesselCurve. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除'** + String get drawCubicBesselCurve; + + /// No description provided for @theEffectOfAnimationCurve. + /// + /// In zh, this message translates to: + /// **'本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行'** + String get theEffectOfAnimationCurve; + + /// No description provided for @randomParticlesAndBoundaryBouncing. + /// + /// In zh, this message translates to: + /// **' 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 '** + String get randomParticlesAndBoundaryBouncing; + + /// No description provided for @particleCollision. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置'** + String get particleCollision; + + /// No description provided for @particle. + /// + /// In zh, this message translates to: + /// **'本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行'** + String get particle; + + /// No description provided for @rectangleAndRandomNumbers. + /// + /// In zh, this message translates to: + /// **'本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成'** + String get rectangleAndRandomNumbers; + + /// No description provided for @bingDwenDwen. + /// + /// In zh, this message translates to: + /// **'本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。'** + String get bingDwenDwen; + + /// No description provided for @pufengInjectionTest. + /// + /// In zh, this message translates to: + /// **'本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。'** + String get pufengInjectionTest; + + /// No description provided for @ticTacToe. + /// + /// In zh, this message translates to: + /// **'本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置'** + String get ticTacToe; + + /// No description provided for @tiledLines. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get tiledLines; + + /// No description provided for @joyDivision. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get joyDivision; + + /// No description provided for @cubicDisarray. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get cubicDisarray; + + /// No description provided for @triangularMesh. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get triangularMesh; + + /// No description provided for @unDeuxTrois. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get unDeuxTrois; + + /// No description provided for @circlePacking. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get circlePacking; + + /// No description provided for @hypnoticSquares. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get hypnoticSquares; + + /// No description provided for @pietMondrian. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get pietMondrian; + + /// No description provided for @downloadCompressedPackage. + /// + /// In zh, this message translates to: + /// **'使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。'** + String get downloadCompressedPackage; + + /// No description provided for @qAIssues. + /// + /// In zh, this message translates to: + /// **'要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'** + String get qAIssues; + + /// No description provided for @tips. + /// + /// In zh, this message translates to: + /// **'注:'** + String get tips; + + /// No description provided for @visualSorting. + /// + /// In zh, this message translates to: + /// **'可视化排序'** + String get visualSorting; + + /// No description provided for @visual. + /// + /// In zh, this message translates to: + /// **'可视排序'** + String get visual; + + /// No description provided for @insertion. + /// + /// In zh, this message translates to: + /// **'插入排序'** + String get insertion; + + /// No description provided for @bubble. + /// + /// In zh, this message translates to: + /// **'冒泡排序'** + String get bubble; + + /// No description provided for @cocktail. + /// + /// In zh, this message translates to: + /// **'鸡尾酒排序(双向冒泡排序)'** + String get cocktail; + + /// No description provided for @comb. + /// + /// In zh, this message translates to: + /// **'梳排序'** + String get comb; + + /// No description provided for @pigeonHole. + /// + /// In zh, this message translates to: + /// **'鸽巢排序'** + String get pigeonHole; + + /// No description provided for @shell. + /// + /// In zh, this message translates to: + /// **'希尔排序'** + String get shell; + + /// No description provided for @selection. + /// + /// In zh, this message translates to: + /// **'选择排序'** + String get selection; + + /// No description provided for @gnome. + /// + /// In zh, this message translates to: + /// **'侏儒排序'** + String get gnome; + + /// No description provided for @cycle. + /// + /// In zh, this message translates to: + /// **'循环排序'** + String get cycle; + + /// No description provided for @heap. + /// + /// In zh, this message translates to: + /// **'堆排序'** + String get heap; + + /// No description provided for @quick. + /// + /// In zh, this message translates to: + /// **'快速排序'** + String get quick; + + /// No description provided for @merge. + /// + /// In zh, this message translates to: + /// **'归并排序'** + String get merge; + + /// No description provided for @sortingAlgorithmConfiguration. + /// + /// In zh, this message translates to: + /// **'排序算法配置'** + String get sortingAlgorithmConfiguration; + + /// No description provided for @dataCount. + /// + /// In zh, this message translates to: + /// **'数据数量(个数)'** + String get dataCount; + + /// No description provided for @timeInterval. + /// + /// In zh, this message translates to: + /// **'时间间隔(微秒)'** + String get timeInterval; + + /// No description provided for @randomSeed. + /// + /// In zh, this message translates to: + /// **'随机种子'** + String get randomSeed; + + /// No description provided for @codeGeneration. + /// + /// In zh, this message translates to: + /// **'代码生成'** + String get codeGeneration; + + /// No description provided for @generateCode. + /// + /// In zh, this message translates to: + /// **'生成代码'** + String get generateCode; + + /// No description provided for @artifactLocation. + /// + /// In zh, this message translates to: + /// **'产物位置'** + String get artifactLocation; + + /// No description provided for @codeClassLocation. + /// + /// In zh, this message translates to: + /// **'代码类存放位置'** + String get codeClassLocation; + + /// No description provided for @resourceDirectory. + /// + /// In zh, this message translates to: + /// **'资源目录'** + String get resourceDirectory; + + /// No description provided for @iconfontResourceLocation. + /// + /// In zh, this message translates to: + /// **'iconfont 资源存放位置'** + String get iconfontResourceLocation; + + /// No description provided for @projectPath. + /// + /// In zh, this message translates to: + /// **'项目路径'** + String get projectPath; + + /// No description provided for @inputProjectAddress. + /// + /// In zh, this message translates to: + /// **'请选择或输入项目地址'** + String get inputProjectAddress; + + /// No description provided for @iconfontCompressedPackagePath. + /// + /// In zh, this message translates to: + /// **'Iconfont 压缩包路径'** + String get iconfontCompressedPackagePath; + + /// No description provided for @pleaseSelectOrInputIconfontCompressedPackagePath. + /// + /// In zh, this message translates to: + /// **'请选择或输入 iconfont 下载的压缩包路径'** + String get pleaseSelectOrInputIconfontCompressedPackagePath; + + /// No description provided for @stayTuned. + /// + /// In zh, this message translates to: + /// **'敬请期待'** + String get stayTuned; + + /// No description provided for @iconFont. + /// + /// In zh, this message translates to: + /// **'IconFont'** + String get iconFont; + + /// No description provided for @dataClass. + /// + /// In zh, this message translates to: + /// **'数据类'** + String get dataClass; + + /// No description provided for @stateManagement. + /// + /// In zh, this message translates to: + /// **'状态管理'** + String get stateManagement; + + /// No description provided for @jsonParsing. + /// + /// In zh, this message translates to: + /// **'Json 解析'** + String get jsonParsing; + + /// No description provided for @clickHereToJump. + /// + /// In zh, this message translates to: + /// **'点击这里跳转'** + String get clickHereToJump; + + /// No description provided for @knowledgeTabToly. + /// + /// In zh, this message translates to: + /// **'捷特文库'** + String get knowledgeTabToly; + + /// No description provided for @knowledgeTabAlgo. + /// + /// In zh, this message translates to: + /// **'算法演绎'** + String get knowledgeTabAlgo; + + /// No description provided for @knowledgeTabLayout. + /// + /// In zh, this message translates to: + /// **'布局宝库'** + String get knowledgeTabLayout; + + /// No description provided for @knowledgeTabPoint. + /// + /// In zh, this message translates to: + /// **'要点宝库'** + String get knowledgeTabPoint; + + /// No description provided for @knowledgeConstruction. + /// + /// In zh, this message translates to: + /// **'正在建设中'** + String get knowledgeConstruction; + + /// No description provided for @knowledgeToJuejin. + /// + /// In zh, this message translates to: + /// **'前往掘金'** + String get knowledgeToJuejin; + + /// No description provided for @srcPath. + /// + /// In zh, this message translates to: + /// **'源码地址'** + String get srcPath; + + /// No description provided for @widgetsInn. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get widgetsInn; + + /// No description provided for @likedWidgets. + /// + /// In zh, this message translates to: + /// **'珍藏组件'** + String get likedWidgets; + + /// No description provided for @relatedComponents. + /// + /// In zh, this message translates to: + /// **'相关组件'** + String get relatedComponents; + + /// No description provided for @backupFavoritesCollectionData. + /// + /// In zh, this message translates to: + /// **'备份收藏集数据'** + String get backupFavoritesCollectionData; + + /// No description provided for @syncFavoritesCollectionData. + /// + /// In zh, this message translates to: + /// **'同步收藏集数据'** + String get syncFavoritesCollectionData; + + /// No description provided for @favoritesCollectionDataReset. + /// + /// In zh, this message translates to: + /// **'收藏集数据重置'** + String get favoritesCollectionDataReset; + + /// No description provided for @resetSuccess. + /// + /// In zh, this message translates to: + /// **'重置成功!'** + String get resetSuccess; + + /// No description provided for @dataSetBackupSuccess. + /// + /// In zh, this message translates to: + /// **'数据集备份成功!'** + String get dataSetBackupSuccess; + + /// No description provided for @dataSetBackupFailure. + /// + /// In zh, this message translates to: + /// **'数据集备份失败!'** + String get dataSetBackupFailure; + + /// No description provided for @dataSynchronizationCopySuccess. + /// + /// In zh, this message translates to: + /// **'数据同步份成功!'** + String get dataSynchronizationCopySuccess; + + /// No description provided for @dataSynchronizationCopyFailure. + /// + /// In zh, this message translates to: + /// **'数据同步份失败!'** + String get dataSynchronizationCopyFailure; + + /// No description provided for @destructionRed. + /// + /// In zh, this message translates to: + /// **'毁灭之红'** + String get destructionRed; + + /// No description provided for @rageOrange. + /// + /// In zh, this message translates to: + /// **'愤怒之橙'** + String get rageOrange; + + /// No description provided for @warningYellow. + /// + /// In zh, this message translates to: + /// **'警告之黄'** + String get warningYellow; + + /// No description provided for @camouflageGreen. + /// + /// In zh, this message translates to: + /// **'伪装之绿'** + String get camouflageGreen; + + /// No description provided for @coldBlue. + /// + /// In zh, this message translates to: + /// **'冷漠之蓝'** + String get coldBlue; + + /// No description provided for @infiniteBlue. + /// + /// In zh, this message translates to: + /// **'无限之靛'** + String get infiniteBlue; + + /// No description provided for @mysteryPurple. + /// + /// In zh, this message translates to: + /// **'神秘之紫'** + String get mysteryPurple; + + /// No description provided for @destinyBlack. + /// + /// In zh, this message translates to: + /// **'归宿之黑'** + String get destinyBlack; + + /// No description provided for @showBackground. + /// + /// In zh, this message translates to: + /// **'显示背景'** + String get showBackground; + + /// No description provided for @toly. + /// + /// In zh, this message translates to: + /// **'张风捷特烈'** + String get toly; + + /// No description provided for @dartHandbook. + /// + /// In zh, this message translates to: + /// **'Dart 手册'** + String get dartHandbook; + + /// No description provided for @codeCopiedSuccessfully. + /// + /// In zh, this message translates to: + /// **'代码复制成功'** + String get codeCopiedSuccessfully; + + /// No description provided for @favoriteFolderManagement. + /// + /// In zh, this message translates to: + /// **'收藏夹管理'** + String get favoriteFolderManagement; + + /// No description provided for @assembly. + /// + /// In zh, this message translates to: + /// **'组件'** + String get assembly; + + /// No description provided for @draw. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get draw; + + /// No description provided for @knowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get knowledge; + + /// No description provided for @collection. + /// + /// In zh, this message translates to: + /// **'收藏'** + String get collection; + + /// No description provided for @my. + /// + /// In zh, this message translates to: + /// **'我的'** + String get my; + + /// No description provided for @picture. + /// + /// In zh, this message translates to: + /// **'幅'** + String get picture; + + /// No description provided for @widgetInn. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get widgetInn; + + /// No description provided for @emptySearch. + /// + /// In zh, this message translates to: + /// **'没数据,哥也没办法\n(≡ _ ≡)/~┴┴'** + String get emptySearch; + + /// No description provided for @searchSomething. + /// + /// In zh, this message translates to: + /// **'哥们,搜点啥...≧◔◡◔≦'** + String get searchSomething; + + /// No description provided for @slogan. + /// + /// In zh, this message translates to: + /// **'Flutter 的联合,编程者的联合'** + String get slogan; +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'ja', 'ko', 'ru', 'zh'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return AppLocalizationsEn(); + case 'ja': return AppLocalizationsJa(); + case 'ko': return AppLocalizationsKo(); + case 'ru': return AppLocalizationsRu(); + case 'zh': return AppLocalizationsZh(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart new file mode 100644 index 00000000..f665029d --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get widgetCollection => 'Widgets'; + + @override + String get paintCollection => 'Painter'; + + @override + String get knowledgeCollection => 'Knowledge'; + + @override + String get treasureTools => 'Treasure'; + + @override + String get collectCollection => 'Collection'; + + @override + String get essentialCollection => 'KeypointsCollection'; + + @override + String get homeAccount => 'Application'; + + @override + String get homeAccountTabInfo => 'About App'; + + @override + String get homeAccountTabMe => 'Contact Me'; + + @override + String get homeAccountSupport => 'Support Project'; + + @override + String get searchWidget => 'search widget ...'; + + @override + String get stateless => 'Stateless'; + + @override + String get stateful => 'Stateful'; + + @override + String get single => 'Single'; + + @override + String get multi => 'Multi'; + + @override + String get sliver => 'Sliver'; + + @override + String get proxy => 'Proxy'; + + @override + String get other => 'Other'; + + @override + String get homeTabWidget => 'Widget'; + + @override + String get homeTabPaint => 'Paint'; + + @override + String get homeTabKnowledge => 'Knowledge'; + + @override + String get homeTabTools => 'Treasure'; + + @override + String get homeTabMine => 'Mine'; + + @override + String get dataManagement => 'Data management'; + + @override + String get userCollection => 'Collection'; + + @override + String get aboutApplications => 'About Applications'; + + @override + String get contactThisKing => 'Contact this king'; + + @override + String get appSettings => 'Application Setting'; + + @override + String get darkMode => 'Dark Mode '; + + @override + String get themeColorSetting => 'Theme Color'; + + @override + String get fontSetting => 'Font Setting'; + + @override + String get settingLanguageText => 'Setting Language'; + + @override + String get codeHighlightStyle => 'Code Highlight Style'; + + @override + String get versionInformation => 'App Version'; + + @override + String get displayPerformanceFloatingLayer => 'Performance Layer'; + + @override + String get showFloatingTools => 'Show floating tools'; + + @override + String get followSystem => 'Follow system'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => 'After activation, it will follow the system to turn on or off dark mode'; + + @override + String get manualSetting => 'Manual settings'; + + @override + String get lightMode => 'Light mode'; + + @override + String get settingLanguage => 'Language Setting'; + + @override + String get appDetails => 'Application details'; + + @override + String get checkUpdate => 'Check New Version'; + + @override + String get downloadNewVersion => 'Download New Version'; + + @override + String get downloadingNewVersion => 'Downloading New Version ...'; + + @override + String get currentIsNew => 'There is the latest version of FlutterUnit!'; + + @override + String get checkDatabaseNewVersion => 'Check for new versions of the database'; + + @override + String get viewThisProjectGithubRepository => '《View the Github Repository for this project》'; + + @override + String get favorite => 'Collected'; + + @override + String get enterComponentName => 'Input widget name'; + + @override + String get containerComponents => 'Container components'; + + @override + String get componentTavern => 'Component Tavern'; + + @override + String get cherishedComponents => 'Treasure components'; + + @override + String get textImageCollection => 'TextImageCollection'; + + @override + String get layoutCollection => 'LayoutCollection'; + + @override + String get eventCollection => 'EventCollection'; + + @override + String get animationCollection => 'AnimationCollection'; + + @override + String get slidingCollection => 'SlidingCollection'; + + @override + String get decorationCollection => 'DecorativeCollection'; + + @override + String get assemblyCollection => 'AssemblyCollection'; + + @override + String get functionCollection => 'FeatureCollection'; + + @override + String get popupCollection => 'Pop upCollection'; + + @override + String get themeCollection => 'ThemeCollection'; + + @override + String get derivativeCollection => 'DerivativeCollection'; + + @override + String get hardToCategorize => 'It\'s hard to distinguish'; + + @override + String get basicDrawing => 'Basic drawing'; + + @override + String get basicDrawingDesc => 'Including some basic graphics drawing examples would be very friendly to beginners in programming. Through these examples, one can learn how to draw basic shapes such as points, lines, rectangles, circles, arcs, text, images, etc., and understand the usage of core objects in drawing like Canvas, Paint, Path, etc.'; + + @override + String get animationGesture => 'Animated gestures'; + + @override + String get animationGestureDesc => 'Includes some drawing examples of animation and gestures, which make drawing more interactive. Through these examples, one can learn the usage of animation and gestures, such as sliding, rotating, scaling, moving effects, etc., making drawing not just static presentation.'; + + @override + String get particleDrawing => 'Particle drawing'; + + @override + String get particleDrawingDesc => 'Includes some drawing examples related to particles, which are top-level operations in drawing. Through these examples, one can learn how to use particles to create stunning visual effects, such as particle clocks, particle explosions, particle backgrounds, etc., giving drawing endless possibilities.'; + + @override + String get interestingDrawing => 'Fun drawing'; + + @override + String get interestingDrawingDesc => 'Includes some fun drawing examples, let\'s experience the joy of drawing, programming, and intelligence together here.'; + + @override + String get artGallery => 'Art galleries '; + + @override + String get artGalleryDesc => 'Includes some hall-level drawing examples, which are pinnacle works of drawing. They have no practicality and are not born for any demand. They exist only because they exist, serving as a medium for human wisdom and expression, called art.'; + + @override + String get drawingOfImages => 'This example explains how to draw images: by loading images and drawing image resources to a specified area. Draw a batch of 45 \"angled grid lines on the upper layer to practice drawing the lines '; + + @override + String get digitalDisplayTube => 'This example introduces how to draw LED digital display tubes to practice the use, transformation, combination of path paths, and knowledge of component packaging. It is a very good drawing case '; + + @override + String get pathDrawing => 'This example introduces how to perform simple path drawing, rotate the drawing board, and combine animation to make the windmill rotate. This is a very concise case of combining drawing and animation. '; + + @override + String get gridCoordinateSystem => 'This example explains how to use line diameter and text to draw a grid coordinate system, and encapsulate the drawn objects for easy reuse. The coordinate system also provides reference during drawing, which is essential for beginners.'; + + @override + String get polarCoordinateSystemOfFaces => 'This example explains how to use a polar coordinate system to draw a plane and collect polar coordinates based on a function equation for drawing. '; + + @override + String get drawFunctionCurvesForPathPairs => 'This example explains how to use a path to draw a function curve, fitting a small number of points on the function curve through a Bessel curve. '; + + @override + String get drawRegularPolygons => 'This example introduces how to collect points in a circle and draw regular polygons, which is a good example for practicing drawing and forming paths. \n Special operations:+, - Modify the number of edges'; + + @override + String get randomNumberProcessing => 'This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data.'; + + @override + String get clockDrawing => 'This example uses the drawing of a clock to practice the drawing technique of rotating scale types in Flutter, and uses animation to rotate the dial pointer.'; + + @override + String get drawSprings => ' This example introduces how to draw a spring, stretch and compress it vertically through the contact points, and restore the animation when releasing it. It is a good comprehensive small case. Special operation: Drag the telescopic spring up and down '; + + @override + String get theApplicationOfAnglesInDrawing => 'This example explains how to perform rotational motion based on a point as the center. Learn the application of the angle between two points in drawing. \n Special operation: Click to run'; + + @override + String get usingShadersAndFilters => 'This example explains how to use shaders and filters in painting, and achieve a rotating streamer effect through animation with numerical variations.'; + + @override + String get pathDrawingFunctionCurve => 'This example explains how to use path to draw function curves and use path measurement for animation'; + + @override + String get thePathOfBingDwenDwen => 'This sample will draw the path of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics and use path measurement for animation. \n Special operation: Click to run'; + + @override + String get drawCubicBesselCurve => 'This example introduces how to draw a cubic Bezier curve, determine whether a point is activated through the contacts, and use this to control the position of the point to achieve drag control effect. \n Special operation: Click on the drawing point, double-click to clear it'; + + @override + String get theEffectOfAnimationCurve => 'This example provides an intuitive way to examine the effect of animation curves, allowing everyone to have a deeper understanding of animation. \n Special operation: Click to run'; + + @override + String get randomParticlesAndBoundaryBouncing => 'This example introduces how to create random particles and handle boundary bounce logic, which is a great starting point for learning particle motion. Special operation: click to stop running '; + + @override + String get particleCollision => 'This example introduces how to perform collision detection on a particle and split multiple particles, which is an interesting case. \n Special operation: Click Reset'; + + @override + String get particle => 'This example introduces using particles to represent images and animating them to achieve explosive effects. \nSpecial operation: Click to run'; + + @override + String get rectangleAndRandomNumbers => 'This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data. \nSpecial operation: Click to randomly generate'; + + @override + String get bingDwenDwen => 'This example is to draw the shape of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics, from which you can learn knowledge such as path drawing and gradient colors.'; + + @override + String get pufengInjectionTest => 'This sample implements the testing process of the Pufeng needle injection test, estimating pi based on probability. You can learn some drawing tips and logical processing of data.'; + + @override + String get ticTacToe => 'This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset'; + + @override + String get tiledLines => 'The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get joyDivision => 'The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get cubicDisarray => 'The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get triangularMesh => 'The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get unDeuxTrois => 'The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get circlePacking => 'The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get hypnoticSquares => 'The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get pietMondrian => 'The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => 'Usage: \n1. Select the icon in iconfont.cn, add the project, and download the compressed file. \n2. Select the Flutter project address, configure resource and product file locations. \n3.Click the Generate Code button to generate the relevant code.'; + + @override + String get qAIssues => 'The QA data in the key points collection is included in FlutterUnit\'s issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.'; + + @override + String get tips => 'tips:'; + + @override + String get visualSorting => 'Visual sorting'; + + @override + String get visual => 'Visual sorting'; + + @override + String get insertion => 'Insert sorting'; + + @override + String get bubble => 'Bubble sorting'; + + @override + String get cocktail => 'Cocktail sorting (bidirectional bubble sorting)'; + + @override + String get comb => 'Comb sorting'; + + @override + String get pigeonHole => 'Pigeonhole sorting '; + + @override + String get shell => 'Shell sorting '; + + @override + String get selection => 'Select sorting'; + + @override + String get gnome => 'Dwarf Sorting'; + + @override + String get cycle => 'Circular sorting'; + + @override + String get heap => 'Heap sorting'; + + @override + String get quick => 'Quick sorting'; + + @override + String get merge => 'Merge sorting'; + + @override + String get sortingAlgorithmConfiguration => 'Sorting algorithm configuration'; + + @override + String get dataCount => 'Data quantity (number)'; + + @override + String get timeInterval => 'Time interval (microseconds)'; + + @override + String get randomSeed => 'Random Seed'; + + @override + String get codeGeneration => 'Code generation'; + + @override + String get generateCode => 'Generate Code'; + + @override + String get artifactLocation => 'Product location'; + + @override + String get codeClassLocation => 'Code class storage location'; + + @override + String get resourceDirectory => 'Resource Catalog'; + + @override + String get iconfontResourceLocation => 'iconfont Resource storage location'; + + @override + String get projectPath => 'Project Path'; + + @override + String get inputProjectAddress => 'Please select or enter the project address'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont Compressed package path'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'Please select or enter the compressed file path for iconfont download'; + + @override + String get stayTuned => 'Stay tuned'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'Data class'; + + @override + String get stateManagement => 'State management'; + + @override + String get jsonParsing => 'Json Parsing'; + + @override + String get clickHereToJump => 'Click here to jump to'; + + @override + String get knowledgeTabToly => 'Toly Articles'; + + @override + String get knowledgeTabAlgo => 'Algo Player'; + + @override + String get knowledgeTabLayout => 'Layout Treasury'; + + @override + String get knowledgeTabPoint => 'Key Points'; + + @override + String get knowledgeConstruction => 'In Construction'; + + @override + String get knowledgeToJuejin => 'To Juejin'; + + @override + String get srcPath => 'Source Path'; + + @override + String get widgetsInn => 'Widgets Inn'; + + @override + String get likedWidgets => 'Liked Widgets'; + + @override + String get relatedComponents => 'Related Widgets'; + + @override + String get backupFavoritesCollectionData => 'Backup Collection Data'; + + @override + String get syncFavoritesCollectionData => 'Synchronize collection data'; + + @override + String get favoritesCollectionDataReset => 'Reset Collection Data'; + + @override + String get resetSuccess => 'Reset successful!'; + + @override + String get dataSetBackupSuccess => 'Dataset backup successful!'; + + @override + String get dataSetBackupFailure => 'Dataset backup failed!'; + + @override + String get dataSynchronizationCopySuccess => 'Data synchronization successful!'; + + @override + String get dataSynchronizationCopyFailure => 'Data synchronization failed!'; + + @override + String get destructionRed => 'Destruction Red '; + + @override + String get rageOrange => 'Anger Orange'; + + @override + String get warningYellow => 'Warning Yellow'; + + @override + String get camouflageGreen => 'Disguising Green'; + + @override + String get coldBlue => 'Indifferent Blue'; + + @override + String get infiniteBlue => 'Infinite Indigo'; + + @override + String get mysteryPurple => 'Mysterious Purple'; + + @override + String get destinyBlack => 'Destiny Black'; + + @override + String get showBackground => 'Display Background'; + + @override + String get toly => 'toly'; + + @override + String get dartHandbook => 'Dart Handbook'; + + @override + String get codeCopiedSuccessfully => 'Code copied successfully'; + + @override + String get favoriteFolderManagement => 'Favorite folder management'; + + @override + String get assembly => 'Assembly'; + + @override + String get draw => 'Draw'; + + @override + String get knowledge => 'Knowledge'; + + @override + String get collection => 'Collection'; + + @override + String get my => 'My'; + + @override + String get picture => 'pics'; + + @override + String get widgetInn => 'Widget Collection'; + + @override + String get emptySearch => 'No Result \n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => 'Search Something ≧◔◡◔≦'; + + @override + String get slogan => 'The unity of flutter, The unity of coder.'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart new file mode 100644 index 00000000..8c4d33a2 --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppLocalizationsJa extends AppLocalizations { + AppLocalizationsJa([String locale = 'ja']) : super(locale); + + @override + String get widgetCollection => 'ウィジェットコレクション'; + + @override + String get paintCollection => '描画コレクション'; + + @override + String get knowledgeCollection => '知識集'; + + @override + String get treasureTools => 'ツールボックス'; + + @override + String get collectCollection => 'コレクション集'; + + @override + String get essentialCollection => '要点集'; + + @override + String get homeAccount => 'アプリ情報'; + + @override + String get homeAccountTabInfo => 'アプリについて'; + + @override + String get homeAccountTabMe => '本王に連絡'; + + @override + String get homeAccountSupport => 'プロジェクトをサポート'; + + @override + String get searchWidget => 'ウィジェットを検索'; + + @override + String get stateless => 'ステートレス'; + + @override + String get stateful => 'ステートフル'; + + @override + String get single => 'シングルレンダリング'; + + @override + String get multi => 'マルチレンダリング'; + + @override + String get sliver => 'スライバー'; + + @override + String get proxy => 'プロキシ'; + + @override + String get other => 'その他'; + + @override + String get homeTabWidget => 'ウィジェット'; + + @override + String get homeTabPaint => '描画'; + + @override + String get homeTabKnowledge => '知識'; + + @override + String get homeTabTools => 'ツール'; + + @override + String get homeTabMine => 'マイ'; + + @override + String get dataManagement => 'データ管理'; + + @override + String get userCollection => 'マイコレクション'; + + @override + String get aboutApplications => 'アプリについて'; + + @override + String get contactThisKing => '本王に連絡'; + + @override + String get appSettings => 'アプリ設定'; + + @override + String get darkMode => 'ダークモード'; + + @override + String get themeColorSetting => 'テーマカラー設定'; + + @override + String get fontSetting => 'フォント設定'; + + @override + String get settingLanguageText => '多言語'; + + @override + String get codeHighlightStyle => 'コードハイライトスタイル'; + + @override + String get versionInformation => 'バージョン情報'; + + @override + String get displayPerformanceFloatingLayer => 'パフォーマンスフローティングレイヤーを表示'; + + @override + String get showFloatingTools => 'フローティングツールを表示'; + + @override + String get followSystem => 'システムに従う'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '有効にすると、システムに従ってダークモードをオンまたはオフにします'; + + @override + String get manualSetting => '手動設定'; + + @override + String get lightMode => 'ライトモード'; + + @override + String get settingLanguage => '言語設定'; + + @override + String get appDetails => 'アプリ詳細'; + + @override + String get checkUpdate => '新しいバージョンを確認'; + + @override + String get downloadNewVersion => '新しいバージョンをダウンロード'; + + @override + String get downloadingNewVersion => '新しいバージョンをダウンロード中...'; + + @override + String get currentIsNew => '現在のアプリは最新バージョンです!'; + + @override + String get checkDatabaseNewVersion => 'データベースの新しいバージョンを確認'; + + @override + String get viewThisProjectGithubRepository => '《このプロジェクトのGithubリポジトリを表示》'; + + @override + String get favorite => 'お気に入り'; + + @override + String get enterComponentName => 'コンポーネント名を入力'; + + @override + String get containerComponents => 'コンテナコンポーネント'; + + @override + String get componentTavern => 'コンポーネント酒場'; + + @override + String get cherishedComponents => '大切なコンポーネント'; + + @override + String get textImageCollection => 'テキスト画像集'; + + @override + String get layoutCollection => 'レイアウト集'; + + @override + String get eventCollection => 'イベント集'; + + @override + String get animationCollection => 'アニメーション集'; + + @override + String get slidingCollection => 'スライド集'; + + @override + String get decorationCollection => '装飾集'; + + @override + String get assemblyCollection => 'アセンブリ集'; + + @override + String get functionCollection => '機能集'; + + @override + String get popupCollection => 'ポップアップ集'; + + @override + String get themeCollection => 'テーマ集'; + + @override + String get derivativeCollection => '派生集'; + + @override + String get hardToCategorize => '分類が難しい'; + + @override + String get basicDrawing => '基本描画'; + + @override + String get basicDrawingDesc => '基本的な図形描画のケースを収録しています。これらのケースは、描画を始めたばかりのプログラマーにとって非常に役立ちます。これらのケースを通じて、点、線、矩形、円、円弧、テキスト、画像などの基本的な図形の描画方法を学び、Canvas、Paint、Pathなどの描画の核心オブジェクトの使用方法を理解できます。'; + + @override + String get animationGesture => 'アニメーションとジェスチャー'; + + @override + String get animationGestureDesc => 'アニメーションとジェスチャーの描画ケースを収録しています。これらのケースは、描画をより操作可能にします。これらのケースを通じて、スライド、回転、拡大縮小、移動などの効果を学び、描画が静的な表現だけでなくなることを理解できます。'; + + @override + String get particleDrawing => '粒子描画'; + + @override + String get particleDrawingDesc => '粒子関連の描画ケースを収録しています。これらのケースは、描画のトップレベルの操作です。これらのケースを通じて、粒子を使用して驚くべき視覚効果を描画する方法を学び、粒子時計、粒子爆発、粒子背景などの効果を実現し、描画に無限の可能性を与えます。'; + + @override + String get interestingDrawing => '面白い描画'; + + @override + String get interestingDrawingDesc => 'いくつかの面白い描画ケースを収録しています。ここで一緒に描画の楽しさ、プログラミングの楽しさ、そして知恵の楽しさを体験しましょう。'; + + @override + String get artGallery => 'アートギャラリー'; + + @override + String get artGalleryDesc => '殿堂級の描画ケースを収録しています。これらのケースは、描画の頂点作品であり、それらは実用性がなく、いかなるニーズのためでもありません。それらは存在するために存在し、人間の知恵と表現の媒体であり、芸術と呼ばれます。'; + + @override + String get drawingOfImages => 'このサンプルでは、画像を描画する方法を紹介します。画像をロードし、指定された領域に画像リソースを描画します。上層に45度傾いたグリッド線を描画し、線の描画を練習します。'; + + @override + String get digitalDisplayTube => 'このサンプルでは、LEDデジタル表示管を描画する方法を紹介し、パスPathの使用、変換、組み合わせ、およびコンポーネントのカプセル化の知識を練習します。非常に良い描画ケースです。'; + + @override + String get pathDrawing => 'このサンプルでは、簡単なパスの描画とキャンバスの回転を紹介し、アニメーションと組み合わせて風車を回転させます。これは、描画とアニメーションを組み合わせた非常に簡潔なケースです。'; + + @override + String get gridCoordinateSystem => 'このサンプルでは、線パスとテキストを使用してグリッド座標系を描画し、描画オブジェクトをカプセル化して再利用しやすくします。座標系は描画時に参考を提供し、入門に最適です。'; + + @override + String get polarCoordinateSystemOfFaces => 'このサンプルでは、平面の極座標系を使用して描画し、関数方程式に基づいて極座標を収集して描画する方法を紹介します。'; + + @override + String get drawFunctionCurvesForPathPairs => 'このサンプルでは、パスを使用して関数曲線を描画し、関数曲線上の少数の点をベジェ曲線でフィッティングする方法を紹介します。'; + + @override + String get drawRegularPolygons => 'このサンプルでは、円内で点を収集し、正多角形を描画する方法を紹介します。描画とパス形成の練習に最適なケースです。\n特殊操作:+、- で辺の数を変更'; + + @override + String get randomNumberProcessing => 'このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。'; + + @override + String get clockDrawing => 'このサンプルでは、時計の描画を通じて、Flutterでの回転目盛りの描画テクニックを練習し、アニメーションで時計の針を回転させます。'; + + @override + String get drawSprings => 'このサンプルでは、バネを描画し、垂直にドラッグして伸縮し、手を離すと復元アニメーションを行う方法を紹介します。非常に良い総合的な小ケースです。特殊操作:上下にドラッグしてバネを伸縮'; + + @override + String get theApplicationOfAnglesInDrawing => 'このサンプルでは、ある点を中心に回転運動を行う方法を紹介します。これにより、2点間の角度を描画に適用する方法を学びます。\n特殊操作:クリックして実行'; + + @override + String get usingShadersAndFilters => 'このサンプルでは、描画でシェーダーとフィルターを使用し、アニメーションで数値を変化させて回転する光の効果を実現する方法を紹介します。'; + + @override + String get pathDrawingFunctionCurve => 'このサンプルでは、パスを使用して関数曲線を描画し、パス測定を使用してアニメーションを行う方法を紹介します。'; + + @override + String get thePathOfBingDwenDwen => 'このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンのパスを描画し、パス測定を使用してアニメーションを行います。\n特殊操作:クリックして実行'; + + @override + String get drawCubicBesselCurve => 'このサンプルでは、3次ベジェ曲線を描画し、タッチポイントを使用してある点がアクティブかどうかを判断し、それに応じて点の位置を制御してドラッグ制御効果を実現する方法を紹介します。\n特殊操作:クリックで点を描画、ダブルクリックでクリア'; + + @override + String get theEffectOfAnimationCurve => 'このサンプルでは、アニメーションカーブの効果を直感的に確認し、アニメーションに対する理解を深めます。\n特殊操作:クリックして実行'; + + @override + String get randomParticlesAndBoundaryBouncing => 'このサンプルでは、ランダムな粒子を作成し、境界でのバウンスロジックを処理する方法を紹介します。粒子運動を学ぶのに非常に良い入門ケースです。特殊操作:クリックで停止/実行'; + + @override + String get particleCollision => 'このサンプルでは、個々の粒子の衝突検出を行い、複数の粒子に分裂させる方法を紹介します。非常に面白いケースです。\n特殊操作:クリックでリセット'; + + @override + String get particle => 'このサンプルでは、画像を粒子として表現し、粒子にアニメーションを適用して爆発効果を実現する方法を紹介します。\n特殊操作:クリックして実行'; + + @override + String get rectangleAndRandomNumbers => 'このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。\n特殊操作:クリックしてランダム生成'; + + @override + String get bingDwenDwen => 'このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンの形を描画し、パス描画やグラデーションなどの知識を学びます。'; + + @override + String get pufengInjectionTest => 'このサンプルでは、蒲豊の針投げテストのプロセスを実装し、確率を使用して円周率を推定します。描画の小技やデータの論理処理を学ぶことができます。'; + + @override + String get ticTacToe => 'このサンプルでは、三目並べの描画と論理検証を通じて、ジェスチャー、描画、アニメーション、検証などの重要なスキルを組み合わせます。非常に良い練習ケースです。\n特殊操作:ダブルクリックでリセット'; + + @override + String get tiledLines => 'このサンプルは、generativeartistry.comのtiled-linesに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get joyDivision => 'このサンプルは、generativeartistry.comのjoy-divisionに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get cubicDisarray => 'このサンプルは、generativeartistry.comのcubic-disarrayに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get triangularMesh => 'このサンプルは、generativeartistry.comのtriangular-meshに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get unDeuxTrois => 'このサンプルは、generativeartistry.comのun-deux-troisに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get circlePacking => 'このサンプルは、generativeartistry.comのcircle-packingに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get hypnoticSquares => 'このサンプルは、generativeartistry.comのhypnotic-squaresに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get pietMondrian => 'このサンプルは、generativeartistry.comのpiet-mondrianに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '使用方法:\n1. iconfont.cnでアイコンを選び、プロジェクトに追加し、圧縮パッケージをダウンロードします。\n2. Flutterプロジェクトのアドレスを選択し、リソースと生成物ファイルの場所を設定します。\n3. コード生成ボタンをクリックすると、関連するコードが生成されます。'; + + @override + String get qAIssues => '要点集録のQAデータは、rUnitのpointタグが付いたissuesに収録されています。データを提供する必要がある場合は、issuesで質問してください。'; + + @override + String get tips => '注:'; + + @override + String get visualSorting => '可視化ソート'; + + @override + String get visual => '可視ソート'; + + @override + String get insertion => '挿入ソート'; + + @override + String get bubble => 'バブルソート'; + + @override + String get cocktail => 'カクテルソート(双方向バブルソート)'; + + @override + String get comb => 'コームソート'; + + @override + String get pigeonHole => '鳩の巣ソート'; + + @override + String get shell => 'シェルソート'; + + @override + String get selection => '選択ソート'; + + @override + String get gnome => 'ノームソート'; + + @override + String get cycle => 'サイクルソート'; + + @override + String get heap => 'ヒープソート'; + + @override + String get quick => 'クイックソート'; + + @override + String get merge => 'マージソート'; + + @override + String get sortingAlgorithmConfiguration => 'ソートアルゴリズム設定'; + + @override + String get dataCount => 'データ数(個数)'; + + @override + String get timeInterval => '時間間隔(マイクロ秒)'; + + @override + String get randomSeed => 'ランダムシード'; + + @override + String get codeGeneration => 'コード生成'; + + @override + String get generateCode => 'コードを生成'; + + @override + String get artifactLocation => '生成物の場所'; + + @override + String get codeClassLocation => 'コードクラスの保存場所'; + + @override + String get resourceDirectory => 'リソースディレクトリ'; + + @override + String get iconfontResourceLocation => 'iconfontリソースの保存場所'; + + @override + String get projectPath => 'プロジェクトパス'; + + @override + String get inputProjectAddress => 'プロジェクトアドレスを選択または入力してください'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont圧縮パッケージのパス'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'iconfontのダウンロードした圧縮パッケージのパスを選択または入力してください'; + + @override + String get stayTuned => 'お楽しみに'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'データクラス'; + + @override + String get stateManagement => '状態管理'; + + @override + String get jsonParsing => 'Json解析'; + + @override + String get clickHereToJump => 'ここをクリックしてジャンプ'; + + @override + String get knowledgeTabToly => 'ジェット文庫'; + + @override + String get knowledgeTabAlgo => 'アルゴリズム演繹'; + + @override + String get knowledgeTabLayout => 'レイアウト宝庫'; + + @override + String get knowledgeTabPoint => '要点宝庫'; + + @override + String get knowledgeConstruction => '建設中'; + + @override + String get knowledgeToJuejin => '掘金へ'; + + @override + String get srcPath => 'ソースアドレス'; + + @override + String get widgetsInn => 'ウィジェット酒場'; + + @override + String get likedWidgets => '大切なウィジェット'; + + @override + String get relatedComponents => '関連コンポーネント'; + + @override + String get backupFavoritesCollectionData => 'お気に入りコレクションデータのバックアップ'; + + @override + String get syncFavoritesCollectionData => 'お気に入りコレクションデータの同期'; + + @override + String get favoritesCollectionDataReset => 'お気に入りコレクションデータのリセット'; + + @override + String get resetSuccess => 'リセット成功!'; + + @override + String get dataSetBackupSuccess => 'データセットのバックアップ成功!'; + + @override + String get dataSetBackupFailure => 'データセットのバックアップ失敗!'; + + @override + String get dataSynchronizationCopySuccess => 'データ同期コピー成功!'; + + @override + String get dataSynchronizationCopyFailure => 'データ同期コピー失敗!'; + + @override + String get destructionRed => '破滅の赤'; + + @override + String get rageOrange => '怒りのオレンジ'; + + @override + String get warningYellow => '警告の黄'; + + @override + String get camouflageGreen => '偽装の緑'; + + @override + String get coldBlue => '冷徹な青'; + + @override + String get infiniteBlue => '無限の藍'; + + @override + String get mysteryPurple => '神秘の紫'; + + @override + String get destinyBlack => '帰宿の黒'; + + @override + String get showBackground => '背景を表示'; + + @override + String get toly => '張風捷特烈'; + + @override + String get dartHandbook => 'Dart 手引き'; + + @override + String get codeCopiedSuccessfully => 'コードがコピーされました'; + + @override + String get favoriteFolderManagement => 'お気に入りフォルダの管理'; + + @override + String get assembly => 'コンポーネント'; + + @override + String get draw => '描画'; + + @override + String get knowledge => '知識'; + + @override + String get collection => 'コレクション'; + + @override + String get my => '私の'; + + @override + String get picture => '枚'; + + @override + String get widgetInn => 'コンポーネント酒場'; + + @override + String get emptySearch => 'データがありません、俺もどうしようもない\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '友よ、何か検索しよう…≧◔◡◔≦'; + + @override + String get slogan => 'Flutterの連携、プログラマーの連携'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart new file mode 100644 index 00000000..5cd7f792 --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppLocalizationsKo extends AppLocalizations { + AppLocalizationsKo([String locale = 'ko']) : super(locale); + + @override + String get widgetCollection => '위젯 컬렉션'; + + @override + String get paintCollection => '그림 컬렉션'; + + @override + String get knowledgeCollection => '지식 모음'; + + @override + String get treasureTools => '도구 보물상자'; + + @override + String get collectCollection => '컬렉션 모음'; + + @override + String get essentialCollection => '핵심 모음'; + + @override + String get homeAccount => '앱 정보'; + + @override + String get homeAccountTabInfo => '앱 정보'; + + @override + String get homeAccountTabMe => '저에게 연락'; + + @override + String get homeAccountSupport => '프로젝트 지원'; + + @override + String get searchWidget => '위젯 검색'; + + @override + String get stateless => '무상태'; + + @override + String get stateful => '상태 있음'; + + @override + String get single => '단일 렌더링'; + + @override + String get multi => '다중 렌더링'; + + @override + String get sliver => '슬라이버'; + + @override + String get proxy => '프록시'; + + @override + String get other => '기타'; + + @override + String get homeTabWidget => '위젯'; + + @override + String get homeTabPaint => '그리기'; + + @override + String get homeTabKnowledge => '지식'; + + @override + String get homeTabTools => '도구'; + + @override + String get homeTabMine => '내 정보'; + + @override + String get dataManagement => '데이터 관리'; + + @override + String get userCollection => '내 컬렉션'; + + @override + String get aboutApplications => '앱 정보'; + + @override + String get contactThisKing => '저에게 연락'; + + @override + String get appSettings => '앱 설정'; + + @override + String get darkMode => '다크 모드'; + + @override + String get themeColorSetting => '테마 색상 설정'; + + @override + String get fontSetting => '폰트 설정'; + + @override + String get settingLanguageText => '다국어'; + + @override + String get codeHighlightStyle => '코드 하이라이트 스타일'; + + @override + String get versionInformation => '버전 정보'; + + @override + String get displayPerformanceFloatingLayer => '성능 플로팅 레이어 표시'; + + @override + String get showFloatingTools => '플로팅 도구 표시'; + + @override + String get followSystem => '시스템 따라가기'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '시스템 설정에 따라 다크 모드를 켜거나 끕니다.'; + + @override + String get manualSetting => '수동 설정'; + + @override + String get lightMode => '라이트 모드'; + + @override + String get settingLanguage => '언어 설정'; + + @override + String get appDetails => '앱 상세 정보'; + + @override + String get checkUpdate => '새 버전 확인'; + + @override + String get downloadNewVersion => '새 버전 다운로드'; + + @override + String get downloadingNewVersion => '새 버전 다운로드 중...'; + + @override + String get currentIsNew => '현재 버전이 최신입니다!'; + + @override + String get checkDatabaseNewVersion => '데이터베이스 새 버전 확인'; + + @override + String get viewThisProjectGithubRepository => '《이 프로젝트의 Github 저장소 보기》'; + + @override + String get favorite => '즐겨찾기'; + + @override + String get enterComponentName => '컴포넌트 이름 입력'; + + @override + String get containerComponents => '컨테이너 컴포넌트'; + + @override + String get componentTavern => '컴포넌트 선술집'; + + @override + String get cherishedComponents => '소중한 컴포넌트'; + + @override + String get textImageCollection => '텍스트 이미지 모음'; + + @override + String get layoutCollection => '레이아웃 모음'; + + @override + String get eventCollection => '이벤트 모음'; + + @override + String get animationCollection => '애니메이션 모음'; + + @override + String get slidingCollection => '슬라이딩 모음'; + + @override + String get decorationCollection => '장식 모음'; + + @override + String get assemblyCollection => '조립 모음'; + + @override + String get functionCollection => '기능 모음'; + + @override + String get popupCollection => '팝업 모음'; + + @override + String get themeCollection => '테마 모음'; + + @override + String get derivativeCollection => '파생 모음'; + + @override + String get hardToCategorize => '분류하기 어려움'; + + @override + String get basicDrawing => '기본 그리기'; + + @override + String get basicDrawingDesc => '기본 도형 그리기 예제를 포함합니다. 이 예제들은 그리기를 처음 접하는 프로그래머에게 매우 친숙할 것입니다. 이 예제들을 통해 점, 선, 사각형, 원, 호, 텍스트, 이미지 등 기본 도형을 그리는 방법을 배우고, Canvas, Paint, Path 등 그리기의 핵심 객체 사용법을 익힐 수 있습니다.'; + + @override + String get animationGesture => '애니메이션 제스처'; + + @override + String get animationGestureDesc => '애니메이션과 제스처 그리기 예제를 포함합니다. 이 예제들은 그리기를 더욱 상호작용적으로 만듭니다. 이 예제들을 통해 슬라이드, 회전, 확대/축소, 이동 등의 효과를 배울 수 있으며, 그리기가 단순히 정적인 표현이 아니게 됩니다.'; + + @override + String get particleDrawing => '입자 그리기'; + + @override + String get particleDrawingDesc => '입자 관련 그리기 예제를 포함합니다. 이 예제들은 그리기의 최고 수준의 작업입니다. 이 예제들을 통해 입자를 사용하여 놀라운 시각적 효과를 그리는 방법을 배울 수 있습니다. 입자 시계, 입자 폭발, 입자 배경 등 다양한 효과를 통해 그리기의 무한한 가능성을 경험할 수 있습니다.'; + + @override + String get interestingDrawing => '재미있는 그리기'; + + @override + String get interestingDrawingDesc => '재미있는 그리기 예제를 포함합니다. 여기서 그리기, 프로그래밍, 지혜의 즐거움을 함께 경험해 보세요.'; + + @override + String get artGallery => '예술 갤러리'; + + @override + String get artGalleryDesc => '최고 수준의 그리기 예제를 포함합니다. 이 예제들은 그리기의 정점에 있는 작품들로, 실용성은 없지만 존재 자체로 의미가 있는 예술 작품입니다.'; + + @override + String get drawingOfImages => '이 예제는 이미지를 그리는 방법을 소개합니다: 이미지를 로드하고 지정된 영역에 그립니다. 상단에 45도 각도의 그리드 선을 그려 선 그리기를 연습합니다.'; + + @override + String get digitalDisplayTube => '이 예제는 LED 디지털 디스플레이 튜브를 그리는 방법을 소개하며, Path 사용, 변환, 조합 및 컴포넌트 캡슐화를 연습합니다. 매우 좋은 그리기 예제입니다.'; + + @override + String get pathDrawing => '이 예제는 간단한 경로 그리기 및 캔버스 회전을 소개하며, 애니메이션을 결합하여 풍차를 회전시킵니다. 매우 간결한 그리기와 애니메이션 결합 예제입니다.'; + + @override + String get gridCoordinateSystem => '이 예제는 선 경로와 텍스트를 사용하여 그리드 좌표계를 그리는 방법을 소개하며, 그리기 객체를 캡슐화하여 재사용하기 쉽게 만듭니다. 좌표계는 그리기 시 참조를 제공하며, 입문자에게 필수입니다.'; + + @override + String get polarCoordinateSystemOfFaces => '이 예제는 평면의 극좌표계를 그리는 방법을 소개하며, 함수 방정식에 따라 극좌표를 수집하여 그립니다.'; + + @override + String get drawFunctionCurvesForPathPairs => '이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 함수 곡선 상의 소량의 점을 베지어 곡선으로 피팅합니다.'; + + @override + String get drawRegularPolygons => '이 예제는 원 안에서 점을 수집하여 정다각형을 그리는 방법을 소개하며, 그리기 및 경로 형성 연습에 매우 좋은 예제입니다.\n특수 조작: +, - 로 변 수정'; + + @override + String get randomNumberProcessing => '이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.'; + + @override + String get clockDrawing => '이 예제는 시계 그리기를 통해 Flutter에서 회전 눈금 그리기 기술을 연습하고, 애니메이션을 통해 시계 바늘이 회전하도록 합니다.'; + + @override + String get drawSprings => '이 예제는 스프링을 그리는 방법을 소개하며, 수직 드래그로 스프링을 늘이거나 줄이고, 놓을 때 복원 애니메이션을 수행합니다. 매우 좋은 종합 예제입니다. 특수 조작: 위아래 드래그로 스프링 늘이기/줄이기'; + + @override + String get theApplicationOfAnglesInDrawing => '이 예제는 특정 점을 중심으로 회전 운동을 수행하는 방법을 소개합니다. 이를 통해 두 점 사이의 각도가 그리기에서 어떻게 적용되는지 배울 수 있습니다.\n특수 조작: 클릭하여 실행'; + + @override + String get usingShadersAndFilters => '이 예제는 그리기에서 셰이더와 필터를 사용하는 방법을 소개하며, 애니메이션을 통해 수치를 변경하여 회전하는 빛의 효과를 만듭니다.'; + + @override + String get pathDrawingFunctionCurve => '이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 경로 측정을 사용하여 애니메이션을 만듭니다.'; + + @override + String get thePathOfBingDwenDwen => '이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 경로를 그리며, 경로 측정을 사용하여 애니메이션을 만듭니다.\n특수 조작: 클릭하여 실행'; + + @override + String get drawCubicBesselCurve => '이 예제는 3차 베지어 곡선을 그리는 방법을 소개하며, 접점을 통해 특정 점이 활성화되었는지 판단하여 점의 위치를 제어합니다.\n특수 조작: 클릭하여 점 그리기, 더블 클릭하여 지우기'; + + @override + String get theEffectOfAnimationCurve => '이 예제는 애니메이션 곡선의 효과를 직관적으로 보여줍니다. 이를 통해 애니메이션에 대한 이해를 높일 수 있습니다.\n특수 조작: 클릭하여 실행'; + + @override + String get randomParticlesAndBoundaryBouncing => '이 예제는 무작위 입자를 생성하고 경계에서 튕기는 로직을 처리하는 방법을 소개합니다. 입자 운동을 배우기에 매우 좋은 입문 예제입니다. 특수 조작: 클릭하여 정지/실행'; + + @override + String get particleCollision => '이 예제는 개별 입자에 대한 충돌 감지를 수행하고, 여러 입자로 분열시키는 방법을 소개합니다. 매우 재미있는 예제입니다.\n특수 조작: 클릭하여 재설정'; + + @override + String get particle => '이 예제는 이미지를 입자로 표현하고, 입자에 애니메이션을 적용하여 폭발 효과를 만드는 방법을 소개합니다.\n특수 조작: 클릭하여 실행'; + + @override + String get rectangleAndRandomNumbers => '이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.\n특수 조작: 클릭하여 무작위 생성'; + + @override + String get bingDwenDwen => '이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 형태를 그리는 방법을 소개하며, 경로 그리기 및 그라데이션 색상 사용법을 배울 수 있습니다.'; + + @override + String get pufengInjectionTest => '이 예제는 푸펑 투시험의 테스트 과정을 구현하며, 확률을 통해 원주율을 추정합니다. 그리기 기술 및 데이터 논리 처리 방법을 배울 수 있습니다.'; + + @override + String get ticTacToe => '이 예제는 틱택토 그리기 및 논리 검증을 통해 제스처, 그리기, 애니메이션, 검증 등의 중요한 기술을 종합적으로 연습할 수 있는 매우 좋은 예제입니다.\n특수 조작: 더블 클릭하여 재설정'; + + @override + String get tiledLines => '이 예제는 generativeartistry.com의 tiled-lines에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get joyDivision => '이 예제는 generativeartistry.com의 joy-division에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get cubicDisarray => '이 예제는 generativeartistry.com의 cubic-disarray에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get triangularMesh => '이 예제는 generativeartistry.com의 triangular-mesh에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get unDeuxTrois => '이 예제는 generativeartistry.com의 un-deux-trois에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get circlePacking => '이 예제는 generativeartistry.com의 circle-packing에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get hypnoticSquares => '이 예제는 generativeartistry.com의 hypnotic-squares에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get pietMondrian => '이 예제는 generativeartistry.com의 piet-mondrian에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '사용 방법:\n1. iconfont.cn에서 아이콘을 선택하고 프로젝트에 추가한 후 압축 파일을 다운로드합니다.\n2. Flutter 프로젝트 경로를 선택하고 리소스 및 산출물 파일 위치를 설정합니다.\n3. 코드 생성 버튼을 클릭하여 관련 코드를 생성합니다.'; + + @override + String get qAIssues => '핵심 모음의 QA 데이터는 rUnit의 point 태그가 있는 issues에 포함되어 있습니다. 데이터를 제공하려면 issues에서 질문하세요.'; + + @override + String get tips => '참고:'; + + @override + String get visualSorting => '시각적 정렬'; + + @override + String get visual => '시각적 정렬'; + + @override + String get insertion => '삽입 정렬'; + + @override + String get bubble => '버블 정렬'; + + @override + String get cocktail => '칵테일 정렬(양방향 버블 정렬)'; + + @override + String get comb => '빗질 정렬'; + + @override + String get pigeonHole => '비둘기집 정렬'; + + @override + String get shell => '셸 정렬'; + + @override + String get selection => '선택 정렬'; + + @override + String get gnome => '노움 정렬'; + + @override + String get cycle => '순환 정렬'; + + @override + String get heap => '힙 정렬'; + + @override + String get quick => '퀵 정렬'; + + @override + String get merge => '병합 정렬'; + + @override + String get sortingAlgorithmConfiguration => '정렬 알고리즘 설정'; + + @override + String get dataCount => '데이터 수(개수)'; + + @override + String get timeInterval => '시간 간격(마이크로초)'; + + @override + String get randomSeed => '무작위 시드'; + + @override + String get codeGeneration => '코드 생성'; + + @override + String get generateCode => '코드 생성'; + + @override + String get artifactLocation => '산출물 위치'; + + @override + String get codeClassLocation => '코드 클래스 위치'; + + @override + String get resourceDirectory => '리소스 디렉토리'; + + @override + String get iconfontResourceLocation => 'iconfont 리소스 위치'; + + @override + String get projectPath => '프로젝트 경로'; + + @override + String get inputProjectAddress => '프로젝트 주소를 선택하거나 입력하세요'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont 압축 파일 경로'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'iconfont 다운로드 압축 파일 경로를 선택하거나 입력하세요'; + + @override + String get stayTuned => '기대해 주세요'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => '데이터 클래스'; + + @override + String get stateManagement => '상태 관리'; + + @override + String get jsonParsing => 'Json 파싱'; + + @override + String get clickHereToJump => '여기를 클릭하여 이동'; + + @override + String get knowledgeTabToly => '제트 문고'; + + @override + String get knowledgeTabAlgo => '알고리즘 연습'; + + @override + String get knowledgeTabLayout => '레이아웃 보물'; + + @override + String get knowledgeTabPoint => '핵심 보물'; + + @override + String get knowledgeConstruction => '구축 중'; + + @override + String get knowledgeToJuejin => 'Juejin으로 이동'; + + @override + String get srcPath => '소스 경로'; + + @override + String get widgetsInn => '위젯 선술집'; + + @override + String get likedWidgets => '소중한 위젯'; + + @override + String get relatedComponents => '관련 컴포넌트'; + + @override + String get backupFavoritesCollectionData => '즐겨찾기 컬렉션 데이터 백업'; + + @override + String get syncFavoritesCollectionData => '즐겨찾기 컬렉션 데이터 동기화'; + + @override + String get favoritesCollectionDataReset => '즐겨찾기 컬렉션 데이터 재설정'; + + @override + String get resetSuccess => '재설정 성공!'; + + @override + String get dataSetBackupSuccess => '데이터 세트 백업 성공!'; + + @override + String get dataSetBackupFailure => '데이터 세트 백업 실패!'; + + @override + String get dataSynchronizationCopySuccess => '데이터 동기화 복사 성공!'; + + @override + String get dataSynchronizationCopyFailure => '데이터 동기화 복사 실패!'; + + @override + String get destructionRed => '파괴의 빨강'; + + @override + String get rageOrange => '분노의 주황'; + + @override + String get warningYellow => '경고의 노랑'; + + @override + String get camouflageGreen => '위장의 초록'; + + @override + String get coldBlue => '냉담의 파랑'; + + @override + String get infiniteBlue => '무한의 남색'; + + @override + String get mysteryPurple => '신비의 보라'; + + @override + String get destinyBlack => '운명의 검정'; + + @override + String get showBackground => '배경 표시'; + + @override + String get toly => '장풍제특렬'; + + @override + String get dartHandbook => 'Dart 핸드북'; + + @override + String get codeCopiedSuccessfully => '코드 복사 성공'; + + @override + String get favoriteFolderManagement => '즐겨찾기 폴더 관리'; + + @override + String get assembly => '컴포넌트'; + + @override + String get draw => '그리기'; + + @override + String get knowledge => '지식'; + + @override + String get collection => '컬렉션'; + + @override + String get my => '내 정보'; + + @override + String get picture => '그림'; + + @override + String get widgetInn => '위젯 선술집'; + + @override + String get emptySearch => '데이터가 없습니다, 형님도 방법이 없어요\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '형님, 뭘 검색하시겠어요...≧◔◡◔≦'; + + @override + String get slogan => 'Flutter의 연합, 프로그래머의 연합'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart new file mode 100644 index 00000000..ed59e2ec --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppLocalizationsRu extends AppLocalizations { + AppLocalizationsRu([String locale = 'ru']) : super(locale); + + @override + String get widgetCollection => 'Сборник компонентов'; + + @override + String get paintCollection => 'Сборник рисования'; + + @override + String get knowledgeCollection => 'Сборник знаний'; + + @override + String get treasureTools => 'Сундучок инструментов'; + + @override + String get collectCollection => 'Сборник избранного'; + + @override + String get essentialCollection => 'Сборник ключевых моментов'; + + @override + String get homeAccount => 'Информация о приложении'; + + @override + String get homeAccountTabInfo => 'О приложении'; + + @override + String get homeAccountTabMe => 'Связаться с этим королём'; + + @override + String get homeAccountSupport => 'Проекты поддержки'; + + @override + String get searchWidget => 'Поиск компонентов'; + + @override + String get stateless => 'Без состояния'; + + @override + String get stateful => 'С состоянием'; + + @override + String get single => 'Один рендеринг'; + + @override + String get multi => 'Многократный рендеринг'; + + @override + String get sliver => 'Скользящая панель'; + + @override + String get proxy => 'Прокси'; + + @override + String get other => 'Другие'; + + @override + String get homeTabWidget => 'Компоненты'; + + @override + String get homeTabPaint => 'Рисование'; + + @override + String get homeTabKnowledge => 'Знания'; + + @override + String get homeTabTools => 'Инструменты'; + + @override + String get homeTabMine => 'Мой профиль'; + + @override + String get dataManagement => 'Управление данными'; + + @override + String get userCollection => 'Мои избранные'; + + @override + String get aboutApplications => 'О приложении'; + + @override + String get contactThisKing => 'Связаться с этим королём'; + + @override + String get appSettings => 'Настройки приложения'; + + @override + String get darkMode => 'Тёмный режим'; + + @override + String get themeColorSetting => 'Настройки темы'; + + @override + String get fontSetting => 'Настройки шрифта'; + + @override + String get settingLanguageText => 'Многоязычность'; + + @override + String get codeHighlightStyle => 'Стиль подсветки кода'; + + @override + String get versionInformation => 'Информация о версии'; + + @override + String get displayPerformanceFloatingLayer => 'Показать плавающий слой производительности'; + + @override + String get showFloatingTools => 'Показать плавающие инструменты'; + + @override + String get followSystem => 'Следовать за системой'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => 'После включения будет следовать за системой для включения или отключения тёмного режима'; + + @override + String get manualSetting => 'Ручные настройки'; + + @override + String get lightMode => 'Светлый режим'; + + @override + String get settingLanguage => 'Настройки языка'; + + @override + String get appDetails => 'Детали приложения'; + + @override + String get checkUpdate => 'Проверить обновление'; + + @override + String get downloadNewVersion => 'Скачать новое обновление'; + + @override + String get downloadingNewVersion => 'Скачивание нового обновления...'; + + @override + String get currentIsNew => 'Текущая версия приложения уже самая новая!'; + + @override + String get checkDatabaseNewVersion => 'Проверить обновление базы данных'; + + @override + String get viewThisProjectGithubRepository => 'Посмотреть репозиторий проекта на Github'; + + @override + String get favorite => 'Добавлено в избранное'; + + @override + String get enterComponentName => 'Введите название компонента'; + + @override + String get containerComponents => 'Контейнерные компоненты'; + + @override + String get componentTavern => 'Таверна компонентов'; + + @override + String get cherishedComponents => 'Ценные компоненты'; + + @override + String get textImageCollection => 'Сборник изображений и текста'; + + @override + String get layoutCollection => 'Сборник макетов'; + + @override + String get eventCollection => 'Сборник событий'; + + @override + String get animationCollection => 'Сборник анимаций'; + + @override + String get slidingCollection => 'Сборник слайдов'; + + @override + String get decorationCollection => 'Сборник декораций'; + + @override + String get assemblyCollection => 'Сборник сборки'; + + @override + String get functionCollection => 'Сборник функций'; + + @override + String get popupCollection => 'Сборник всплывающих окон'; + + @override + String get themeCollection => 'Сборник тем'; + + @override + String get derivativeCollection => 'Сборник производных'; + + @override + String get hardToCategorize => 'Трудно классифицировать'; + + @override + String get basicDrawing => 'Основы рисования'; + + @override + String get basicDrawingDesc => 'Включает несколько примеров базового рисования, которые будут полезны для начинающих программистов. Эти примеры научат рисованию базовых фигур, таких как точки, линии, прямоугольники, круги и текст.'; + + @override + String get animationGesture => 'Анимация жестов'; + + @override + String get animationGestureDesc => 'Содержит примеры рисования анимаций и жестов, которые сделают рисование более интерактивным. Эти примеры научат использовать анимации и жесты, такие как скольжение, вращение, масштабирование и перемещение.'; + + @override + String get particleDrawing => 'Частицы в рисовании'; + + @override + String get particleDrawingDesc => 'Включает примеры рисования с использованием частиц. Эти примеры покажут, как использовать частицы для создания зрелищных эффектов, таких как взрывы или анимации с частицами.'; + + @override + String get interestingDrawing => 'Интересные рисунки'; + + @override + String get interestingDrawingDesc => 'Примеры интересных и забавных рисунков, где мы можем наслаждаться процессом рисования и программирования.'; + + @override + String get artGallery => 'Галерея искусства'; + + @override + String get artGalleryDesc => 'Содержит примеры высокого искусства, которые не предназначены для практических целей, а являются выражением человеческого интеллекта и творчества.'; + + @override + String get drawingOfImages => 'Пример рисования изображений: загрузка изображения и его отрисовка в определенной области. На верхнем слое добавлены линии сетки для практики рисования линий.'; + + @override + String get digitalDisplayTube => 'Пример рисования цифровых трубок с использованием пути Path и анимации.'; + + @override + String get pathDrawing => 'Пример рисования простых путей с анимацией.'; + + @override + String get gridCoordinateSystem => 'Пример рисования сетки координат с линиями и текстом для новичков.'; + + @override + String get polarCoordinateSystemOfFaces => 'Пример рисования полярной координатной системы с использованием функций.'; + + @override + String get drawFunctionCurvesForPathPairs => 'Пример рисования функциональных кривых с использованием пути и Беезье.'; + + @override + String get drawRegularPolygons => 'Пример рисования правильных многоугольников внутри круга.'; + + @override + String get randomNumberProcessing => 'Пример рисования прямоугольников с обработкой случайных чисел.'; + + @override + String get clockDrawing => 'Пример рисования часов с анимацией.'; + + @override + String get drawSprings => 'Пример рисования пружины с анимацией сжатия и растяжения.'; + + @override + String get theApplicationOfAnglesInDrawing => 'Пример рисования с использованием углов для вращения.'; + + @override + String get usingShadersAndFilters => 'Пример использования шейдеров и фильтров для создания анимации.'; + + @override + String get pathDrawingFunctionCurve => 'Пример рисования кривых с помощью пути и измерения анимации.'; + + @override + String get thePathOfBingDwenDwen => 'Пример рисования пути маскота Олимпиады Пекин-2022 с использованием анимации пути.'; + + @override + String get drawCubicBesselCurve => 'Пример рисования кривой кубического Безье с возможностью перетаскивания точек.'; + + @override + String get theEffectOfAnimationCurve => 'Пример демонстрации эффекта анимационной кривой для углубленного понимания анимаций.'; + + @override + String get randomParticlesAndBoundaryBouncing => 'Пример создания случайных частиц с отскоком от границ.'; + + @override + String get particleCollision => 'Пример столкновений частиц с анимацией их распада.'; + + @override + String get particle => 'Пример взрыва изображений с использованием частиц.'; + + @override + String get rectangleAndRandomNumbers => 'Пример рисования прямоугольников с использованием случайных чисел.'; + + @override + String get bingDwenDwen => 'Пример рисования формы маскота Олимпиады Пекин-2022.'; + + @override + String get pufengInjectionTest => 'Пример теста для вычисления числа Пи с использованием вероятности.'; + + @override + String get ticTacToe => 'Пример игры в крестики-нолики с логикой и анимацией.'; + + @override + String get tiledLines => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get joyDivision => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get cubicDisarray => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get triangularMesh => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get unDeuxTrois => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get circlePacking => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get hypnoticSquares => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get pietMondrian => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get downloadCompressedPackage => 'Инструкция по использованию:\n1. Выберите и скачайте иконки на iconfont.cn.\n2. Настройте путь к проекту Flutter.\n3. Нажмите кнопку для генерации кода.'; + + @override + String get qAIssues => 'Данные QA из сборника важных моментов rUnit будут добавлены в issues с меткой point.'; + + @override + String get tips => 'Совет:'; + + @override + String get visualSorting => 'Визуальная сортировка'; + + @override + String get visual => 'Визуальная сортировка'; + + @override + String get insertion => 'Сортировка вставками'; + + @override + String get bubble => 'Пузырьковая сортировка'; + + @override + String get cocktail => 'Коктейльная сортировка'; + + @override + String get comb => 'Сортировка расческой'; + + @override + String get pigeonHole => 'Сортировка по принципу дырок для голубей'; + + @override + String get shell => 'Сортировка Шелла'; + + @override + String get selection => 'Сортировка выбором'; + + @override + String get gnome => 'Сортировка гномом'; + + @override + String get cycle => 'Циклическая сортировка'; + + @override + String get heap => 'Сортировка кучей'; + + @override + String get quick => 'Быстрая сортировка'; + + @override + String get merge => 'Сортировка слиянием'; + + @override + String get sortingAlgorithmConfiguration => 'Настройки сортировки'; + + @override + String get dataCount => 'Количество данных'; + + @override + String get timeInterval => 'Интервал времени'; + + @override + String get randomSeed => 'Случайное зерно'; + + @override + String get codeGeneration => 'Генерация кода'; + + @override + String get generateCode => 'Сгенерировать код'; + + @override + String get artifactLocation => 'Местоположение артефакта'; + + @override + String get codeClassLocation => 'Местоположение класса кода'; + + @override + String get resourceDirectory => 'Каталог ресурсов'; + + @override + String get iconfontResourceLocation => 'Местоположение ресурсов iconfont'; + + @override + String get projectPath => 'Путь проекта'; + + @override + String get inputProjectAddress => 'Выберите или введите путь к проекту'; + + @override + String get iconfontCompressedPackagePath => 'Путь к сжатию иконок'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'Пожалуйста, выберите или введите путь к сжатому пакету iconfont'; + + @override + String get stayTuned => 'Ожидайте'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'Класс данных'; + + @override + String get stateManagement => 'Управление состоянием'; + + @override + String get jsonParsing => 'Парсинг JSON'; + + @override + String get clickHereToJump => 'Нажмите здесь для перехода'; + + @override + String get knowledgeTabToly => 'Библиотека Jet'; + + @override + String get knowledgeTabAlgo => 'Алгоритмы'; + + @override + String get knowledgeTabLayout => 'Библиотека макетов'; + + @override + String get knowledgeTabPoint => 'Библиотека ключевых моментов'; + + @override + String get knowledgeConstruction => 'На стадии строительства'; + + @override + String get knowledgeToJuejin => 'Перейти на Juejin'; + + @override + String get srcPath => 'Путь к исходному коду'; + + @override + String get widgetsInn => 'Таверна компонентов'; + + @override + String get likedWidgets => 'Избранные компоненты'; + + @override + String get relatedComponents => 'Связанные компоненты'; + + @override + String get backupFavoritesCollectionData => 'Резервное копирование данных избранного'; + + @override + String get syncFavoritesCollectionData => 'Синхронизация данных избранного'; + + @override + String get favoritesCollectionDataReset => 'Сброс данных избранного'; + + @override + String get resetSuccess => 'Сброс успешен!'; + + @override + String get dataSetBackupSuccess => 'Резервное копирование данных прошло успешно!'; + + @override + String get dataSetBackupFailure => 'Ошибка резервного копирования данных!'; + + @override + String get dataSynchronizationCopySuccess => 'Синхронизация данных успешна!'; + + @override + String get dataSynchronizationCopyFailure => 'Ошибка синхронизации данных!'; + + @override + String get destructionRed => 'Красный разрушения'; + + @override + String get rageOrange => 'Оранжевый гнева'; + + @override + String get warningYellow => 'Желтый предупреждения'; + + @override + String get camouflageGreen => 'Зеленый камуфляжа'; + + @override + String get coldBlue => 'Холодный синий'; + + @override + String get infiniteBlue => 'Бесконечный синий'; + + @override + String get mysteryPurple => 'Тайный фиолетовый'; + + @override + String get destinyBlack => 'Черный судьбы'; + + @override + String get showBackground => 'Показать фон'; + + @override + String get toly => 'Толь'; + + @override + String get dartHandbook => 'Руководство Dart'; + + @override + String get codeCopiedSuccessfully => 'Код успешно скопирован'; + + @override + String get favoriteFolderManagement => 'Управление папками избранного'; + + @override + String get assembly => 'Сборка'; + + @override + String get draw => 'Рисование'; + + @override + String get knowledge => 'Знания'; + + @override + String get collection => 'Коллекция'; + + @override + String get my => 'Мои'; + + @override + String get picture => 'Картинка'; + + @override + String get widgetInn => 'Таверна компонентов'; + + @override + String get emptySearch => 'Данных нет, я тоже не знаю, что делать\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => 'Друзья, давайте что-то искать…≧◔◡◔≦'; + + @override + String get slogan => 'Связь Flutter, связь программистов'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart new file mode 100644 index 00000000..eb94d85f --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class AppLocalizationsZh extends AppLocalizations { + AppLocalizationsZh([String locale = 'zh']) : super(locale); + + @override + String get widgetCollection => '组件集录'; + + @override + String get paintCollection => '绘制集录'; + + @override + String get knowledgeCollection => '知识集锦'; + + @override + String get treasureTools => '工具宝箱'; + + @override + String get collectCollection => '收藏集录'; + + @override + String get essentialCollection => '要点集录'; + + @override + String get homeAccount => '应用信息'; + + @override + String get homeAccountTabInfo => '关于应用'; + + @override + String get homeAccountTabMe => '联系本王'; + + @override + String get homeAccountSupport => '支持项目'; + + @override + String get searchWidget => '搜索组件'; + + @override + String get stateless => '无态'; + + @override + String get stateful => '有态'; + + @override + String get single => '单渲'; + + @override + String get multi => '多渲'; + + @override + String get sliver => '滑片'; + + @override + String get proxy => '代理'; + + @override + String get other => '其他'; + + @override + String get homeTabWidget => '组件'; + + @override + String get homeTabPaint => '绘制'; + + @override + String get homeTabKnowledge => '知识'; + + @override + String get homeTabTools => '工具'; + + @override + String get homeTabMine => '我的'; + + @override + String get dataManagement => '数据管理'; + + @override + String get userCollection => '我的收藏'; + + @override + String get aboutApplications => '关于应用'; + + @override + String get contactThisKing => '联系本王'; + + @override + String get appSettings => '应用设置'; + + @override + String get darkMode => '深色模式'; + + @override + String get themeColorSetting => '主题色设置'; + + @override + String get fontSetting => '字体设置'; + + @override + String get settingLanguageText => '多语言'; + + @override + String get codeHighlightStyle => '代码高亮样式'; + + @override + String get versionInformation => '版本信息'; + + @override + String get displayPerformanceFloatingLayer => '显示性能浮层'; + + @override + String get showFloatingTools => '显示浮动工具'; + + @override + String get followSystem => '跟随系统'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '开启后,将跟随系统打开或关闭深色模式'; + + @override + String get manualSetting => '手动设置'; + + @override + String get lightMode => '浅色模式'; + + @override + String get settingLanguage => '设置语言'; + + @override + String get appDetails => '应用详情'; + + @override + String get checkUpdate => '检查新版本'; + + @override + String get downloadNewVersion => '下载新版本'; + + @override + String get downloadingNewVersion => '新版本下载中...'; + + @override + String get currentIsNew => '当前应用已是最新版本!'; + + @override + String get checkDatabaseNewVersion => '检查数据库新版本'; + + @override + String get viewThisProjectGithubRepository => '《查看本项目Github仓库》'; + + @override + String get favorite => '已收藏'; + + @override + String get enterComponentName => '输入组件名称'; + + @override + String get containerComponents => '容器组件'; + + @override + String get componentTavern => '组件酒肆'; + + @override + String get cherishedComponents => '珍藏组件'; + + @override + String get textImageCollection => '图文集'; + + @override + String get layoutCollection => '布局集'; + + @override + String get eventCollection => '事件集'; + + @override + String get animationCollection => '动画集'; + + @override + String get slidingCollection => '滑动集'; + + @override + String get decorationCollection => '装饰集'; + + @override + String get assemblyCollection => '组装集'; + + @override + String get functionCollection => '功能集'; + + @override + String get popupCollection => '弹出集'; + + @override + String get themeCollection => '主题集'; + + @override + String get derivativeCollection => '衍生集'; + + @override + String get hardToCategorize => '很难分'; + + @override + String get basicDrawing => '基础绘制'; + + @override + String get basicDrawingDesc => '收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。'; + + @override + String get animationGesture => '动画手势'; + + @override + String get animationGestureDesc => '收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。'; + + @override + String get particleDrawing => '粒子绘制'; + + @override + String get particleDrawingDesc => '收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。'; + + @override + String get interestingDrawing => '趣味绘制'; + + @override + String get interestingDrawingDesc => '收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。'; + + @override + String get artGallery => '艺术画廊'; + + @override + String get artGalleryDesc => '收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。'; + + @override + String get drawingOfImages => '本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 '; + + @override + String get digitalDisplayTube => '本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 '; + + @override + String get pathDrawing => '本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 '; + + @override + String get gridCoordinateSystem => '本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 '; + + @override + String get polarCoordinateSystemOfFaces => '本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 '; + + @override + String get drawFunctionCurvesForPathPairs => '本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 '; + + @override + String get drawRegularPolygons => '本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数'; + + @override + String get randomNumberProcessing => '本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。'; + + @override + String get clockDrawing => '本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。'; + + @override + String get drawSprings => ' 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 '; + + @override + String get theApplicationOfAnglesInDrawing => '本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行'; + + @override + String get usingShadersAndFilters => '本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。'; + + @override + String get pathDrawingFunctionCurve => '本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画'; + + @override + String get thePathOfBingDwenDwen => '本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行'; + + @override + String get drawCubicBesselCurve => '本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除'; + + @override + String get theEffectOfAnimationCurve => '本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行'; + + @override + String get randomParticlesAndBoundaryBouncing => ' 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 '; + + @override + String get particleCollision => '本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置'; + + @override + String get particle => '本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行'; + + @override + String get rectangleAndRandomNumbers => '本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成'; + + @override + String get bingDwenDwen => '本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。'; + + @override + String get pufengInjectionTest => '本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。'; + + @override + String get ticTacToe => '本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置'; + + @override + String get tiledLines => '本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get joyDivision => '本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get cubicDisarray => '本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get triangularMesh => '本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get unDeuxTrois => '本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get circlePacking => '本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get hypnoticSquares => '本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get pietMondrian => '本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。'; + + @override + String get qAIssues => '要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'; + + @override + String get tips => '注:'; + + @override + String get visualSorting => '可视化排序'; + + @override + String get visual => '可视排序'; + + @override + String get insertion => '插入排序'; + + @override + String get bubble => '冒泡排序'; + + @override + String get cocktail => '鸡尾酒排序(双向冒泡排序)'; + + @override + String get comb => '梳排序'; + + @override + String get pigeonHole => '鸽巢排序'; + + @override + String get shell => '希尔排序'; + + @override + String get selection => '选择排序'; + + @override + String get gnome => '侏儒排序'; + + @override + String get cycle => '循环排序'; + + @override + String get heap => '堆排序'; + + @override + String get quick => '快速排序'; + + @override + String get merge => '归并排序'; + + @override + String get sortingAlgorithmConfiguration => '排序算法配置'; + + @override + String get dataCount => '数据数量(个数)'; + + @override + String get timeInterval => '时间间隔(微秒)'; + + @override + String get randomSeed => '随机种子'; + + @override + String get codeGeneration => '代码生成'; + + @override + String get generateCode => '生成代码'; + + @override + String get artifactLocation => '产物位置'; + + @override + String get codeClassLocation => '代码类存放位置'; + + @override + String get resourceDirectory => '资源目录'; + + @override + String get iconfontResourceLocation => 'iconfont 资源存放位置'; + + @override + String get projectPath => '项目路径'; + + @override + String get inputProjectAddress => '请选择或输入项目地址'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont 压缩包路径'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => '请选择或输入 iconfont 下载的压缩包路径'; + + @override + String get stayTuned => '敬请期待'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => '数据类'; + + @override + String get stateManagement => '状态管理'; + + @override + String get jsonParsing => 'Json 解析'; + + @override + String get clickHereToJump => '点击这里跳转'; + + @override + String get knowledgeTabToly => '捷特文库'; + + @override + String get knowledgeTabAlgo => '算法演绎'; + + @override + String get knowledgeTabLayout => '布局宝库'; + + @override + String get knowledgeTabPoint => '要点宝库'; + + @override + String get knowledgeConstruction => '正在建设中'; + + @override + String get knowledgeToJuejin => '前往掘金'; + + @override + String get srcPath => '源码地址'; + + @override + String get widgetsInn => '组件酒肆'; + + @override + String get likedWidgets => '珍藏组件'; + + @override + String get relatedComponents => '相关组件'; + + @override + String get backupFavoritesCollectionData => '备份收藏集数据'; + + @override + String get syncFavoritesCollectionData => '同步收藏集数据'; + + @override + String get favoritesCollectionDataReset => '收藏集数据重置'; + + @override + String get resetSuccess => '重置成功!'; + + @override + String get dataSetBackupSuccess => '数据集备份成功!'; + + @override + String get dataSetBackupFailure => '数据集备份失败!'; + + @override + String get dataSynchronizationCopySuccess => '数据同步份成功!'; + + @override + String get dataSynchronizationCopyFailure => '数据同步份失败!'; + + @override + String get destructionRed => '毁灭之红'; + + @override + String get rageOrange => '愤怒之橙'; + + @override + String get warningYellow => '警告之黄'; + + @override + String get camouflageGreen => '伪装之绿'; + + @override + String get coldBlue => '冷漠之蓝'; + + @override + String get infiniteBlue => '无限之靛'; + + @override + String get mysteryPurple => '神秘之紫'; + + @override + String get destinyBlack => '归宿之黑'; + + @override + String get showBackground => '显示背景'; + + @override + String get toly => '张风捷特烈'; + + @override + String get dartHandbook => 'Dart 手册'; + + @override + String get codeCopiedSuccessfully => '代码复制成功'; + + @override + String get favoriteFolderManagement => '收藏夹管理'; + + @override + String get assembly => '组件'; + + @override + String get draw => '绘制'; + + @override + String get knowledge => '知识'; + + @override + String get collection => '收藏'; + + @override + String get my => '我的'; + + @override + String get picture => '幅'; + + @override + String get widgetInn => '组件酒肆'; + + @override + String get emptySearch => '没数据,哥也没办法\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '哥们,搜点啥...≧◔◡◔≦'; + + @override + String get slogan => 'Flutter 的联合,编程者的联合'; +} diff --git a/modules/basic_system/l10n/lib/l10n.dart b/modules/basic_system/l10n/lib/l10n.dart new file mode 100644 index 00000000..74a26a66 --- /dev/null +++ b/modules/basic_system/l10n/lib/l10n.dart @@ -0,0 +1,4 @@ +library l10n; +export 'ext.dart'; +export 'enum/language.dart'; + diff --git a/modules/basic_system/l10n/pubspec.yaml b/modules/basic_system/l10n/pubspec.yaml new file mode 100644 index 00000000..d5b23bf5 --- /dev/null +++ b/modules/basic_system/l10n/pubspec.yaml @@ -0,0 +1,50 @@ +name: l10n +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/basic_system/l10n/test/l10n_copy.dart b/modules/basic_system/l10n/test/l10n_copy.dart new file mode 100644 index 00000000..9118552f --- /dev/null +++ b/modules/basic_system/l10n/test/l10n_copy.dart @@ -0,0 +1,22 @@ +import 'dart:io'; + +import 'package:path/path.dart' as path; + +void main() async { + Directory distDir = + Directory(path.join(Directory.current.path, '.dart_tool', 'flutter_gen', 'gen_l10n')); + if (!distDir.existsSync()) return; + + Directory srcDir = Directory(path.join(Directory.current.path, 'lib', 'gen_l10n')); + if (srcDir.existsSync()) { + await srcDir.delete(recursive: true); + } else { + await srcDir.create(recursive: true); + } + List entity = distDir.listSync(); + for (FileSystemEntity e in entity) { + if (e is File) { + e.copy(path.join(srcDir.path, path.basename(e.path))); + } + } +} diff --git a/modules/basic_system/l10n/test/l10n_test.dart b/modules/basic_system/l10n/test/l10n_test.dart new file mode 100644 index 00000000..a3097625 --- /dev/null +++ b/modules/basic_system/l10n/test/l10n_test.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:l10n/l10n.dart'; + +void main() { +} diff --git a/packages/db_storage/.gitignore b/modules/basic_system/storage/.gitignore similarity index 100% rename from packages/db_storage/.gitignore rename to modules/basic_system/storage/.gitignore diff --git a/packages/db_storage/.metadata b/modules/basic_system/storage/.metadata similarity index 100% rename from packages/db_storage/.metadata rename to modules/basic_system/storage/.metadata diff --git a/packages/old_fancy_mobile_ui/CHANGELOG.md b/modules/basic_system/storage/CHANGELOG.md similarity index 100% rename from packages/old_fancy_mobile_ui/CHANGELOG.md rename to modules/basic_system/storage/CHANGELOG.md diff --git a/packages/old_fancy_mobile_ui/LICENSE b/modules/basic_system/storage/LICENSE similarity index 100% rename from packages/old_fancy_mobile_ui/LICENSE rename to modules/basic_system/storage/LICENSE diff --git a/packages/old_fancy_mobile_ui/README.md b/modules/basic_system/storage/README.md similarity index 100% rename from packages/old_fancy_mobile_ui/README.md rename to modules/basic_system/storage/README.md diff --git a/packages/old_fancy_mobile_ui/analysis_options.yaml b/modules/basic_system/storage/analysis_options.yaml similarity index 100% rename from packages/old_fancy_mobile_ui/analysis_options.yaml rename to modules/basic_system/storage/analysis_options.yaml diff --git a/modules/basic_system/storage/lib/src/app_storage.dart b/modules/basic_system/storage/lib/src/app_storage.dart new file mode 100644 index 00000000..7e671a45 --- /dev/null +++ b/modules/basic_system/storage/lib/src/app_storage.dart @@ -0,0 +1,31 @@ + +import 'package:storage/storage.dart'; + +import 'db_storage/flutter/flutter_db_store.dart'; +import 'db_storage/flutter_unit/flutter_unit_db_store.dart'; + +class AppStorage { + + AppStorage._(); + + static AppStorage? _instance; + + factory AppStorage() => _instance ??= AppStorage._(); + + final FlutterDbStore _flutterDb = FlutterDbStore(); + final FlutterUnitDbStore _flutterUnitDb = FlutterUnitDbStore(); + + FlutterDbStore get flutter => _flutterDb; + FlutterUnitDbStore get flutterUnit => _flutterUnitDb; + + Future init() async{ + await _flutterDb.open(); + await _flutterUnitDb.open(); + } + + void close() async{ + await _flutterDb.close(); + await _flutterUnitDb.close(); + } + +} diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart new file mode 100644 index 00000000..e78b638c --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart @@ -0,0 +1,37 @@ +import 'dart:async'; +import 'package:sqflite/sqflite.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:fx_dao/fx_dao.dart'; + +import 'package:widget_module/widget_module.dart'; +import 'package:artifact/artifact.dart'; + +class FlutterDbStore extends FxDb { + @override + String get dbname => 'flutter.db'; + + @override + int get version => 1; + + @override + Future onCreate(Database db, int version) async {} + + @override + void afterOpen(String dbpath) { + super.afterOpen(dbpath); + print("===DbPath:$dbpath=============="); + } + + @override + Iterable<(int, MigrationOperation)> get migrations => []; + + @override + Iterable get tables => [ + ColumnizeDao(), + ArticleDao(), + CategoryDao(), + WidgetDao(), + NodeDao(), + LikeDao(), + ]; +} diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart new file mode 100644 index 00000000..423a28d3 --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart @@ -0,0 +1,76 @@ + +import 'package:fx_dao/fx_dao.dart'; +import 'package:sqflite/sqlite_api.dart'; + +import '../model/cache_po.dart'; + + +class CacheDao with HasDatabase, DbTable{ + @override + String get createSql =>""" +CREATE TABLE IF NOT EXISTS `$name` ( +`id` INTEGER PRIMARY KEY AUTOINCREMENT, +`filter` TEXT, +`content` TEXT, +`update` INTEGER, +`create` INTEGER, +`type` INTEGER +)"""; + + @override + String get name => 'app_cache'; + + + Future insert(CachePo po) => database.insert( + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(CachePo po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + name, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query({ + required int type, + int page = 1, + int pageSize = 20, + String? filter, + }) async { + String queryArgs = ''; + List args = [type]; + queryArgs = "WHERE type = ? "; + if(filter!=null){ + queryArgs+="AND filter = ? "; + args.add(filter); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([pageSize, (page - 1) * pageSize]); + + List> data = await database.rawQuery( + "SELECT * FROM $name $queryArgs", + args, + ); + + List result = data.map((e) => CachePo.fromJson(e)).toList(); + return result; + } +} diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart new file mode 100644 index 00000000..2b1d6a60 --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart @@ -0,0 +1,2 @@ +export 'dao/cache_dao.dart'; +export 'model/cache_po.dart'; \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart new file mode 100644 index 00000000..868f4ac6 --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart @@ -0,0 +1,28 @@ +import 'package:fx_dao/fx_dao.dart'; +import 'dao/cache_dao.dart'; + + + +class FlutterUnitDbStore extends FxDb { + + @override + Iterable get tables => [ + CacheDao() + ]; + + @override + String get dbname => 'flutter_unit.db'; + + @override + int get version => 1; + + @override + void afterOpen(String dbpath) { + super.afterOpen(dbpath); + print("====Opend:$dbpath==========="); + } + + @override + Iterable<(int, MigrationOperation)> get migrations => []; + +} diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart new file mode 100644 index 00000000..81e3b85e --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart @@ -0,0 +1,40 @@ +class CachePo { + // 0 专栏数据缓存 + // 1 文章列表数据缓存 + final int id; + final String filter; + final String content; + final int type; + final int create; + final int update; + + CachePo({ + required this.id, + required this.filter, + required this.content, + required this.type, + required this.create, + required this.update, + }); + + Map toJson() => { + "id": id == -1 ? null : id, + "filter": filter, + "content": content, + "type": type, + "create": create, + "update": update, + }; + + factory CachePo.fromJson(Map map) { + return CachePo( + id: map['id'], + filter: map['filter'], + content: map["content"], + create: map["create"], + type: map["type"], + update: map["update"], + ); + } + +} diff --git a/modules/basic_system/storage/lib/src/db_storage/storage.dart b/modules/basic_system/storage/lib/src/db_storage/storage.dart new file mode 100644 index 00000000..c07707a4 --- /dev/null +++ b/modules/basic_system/storage/lib/src/db_storage/storage.dart @@ -0,0 +1 @@ +export 'flutter_unit/flutter_unit.dart'; \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/sp_storage/cao/app_config_cao.dart b/modules/basic_system/storage/lib/src/sp_storage/cao/app_config_cao.dart new file mode 100644 index 00000000..c0cf9c38 --- /dev/null +++ b/modules/basic_system/storage/lib/src/sp_storage/cao/app_config_cao.dart @@ -0,0 +1,20 @@ +import 'dart:convert'; + +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:storage/storage.dart'; +const String kAppSpKey = 'app-config'; + +class AppConfigCao{ + final SharedPreferences sp; + AppConfigCao(this.sp); + + Future write(AppConfigPo appConfigPo) async { + String config = json.encode(appConfigPo); + return sp.setString(kAppSpKey, config); + } + + Future read() async { + String content = sp.getString(kAppSpKey) ?? "{}"; + return AppConfigPo.fromPo(json.decode(content)); + } +} \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/sp_storage/exp.dart b/modules/basic_system/storage/lib/src/sp_storage/exp.dart new file mode 100644 index 00000000..c07a1662 --- /dev/null +++ b/modules/basic_system/storage/lib/src/sp_storage/exp.dart @@ -0,0 +1,3 @@ +export 'cao/app_config_cao.dart'; +export 'models/app_config_po.dart'; +export 'sp_storage.dart'; \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart b/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart new file mode 100644 index 00000000..3f5399fd --- /dev/null +++ b/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart @@ -0,0 +1,51 @@ +// 用于维护 App 配置信息的存储类 +// 配置信息将通过 sp 存储在 xml 中 +class AppConfigPo { + final bool showBackGround; + final bool showOverlayTool; + final bool showPerformanceOverlay; + final int fontFamilyIndex; + final int languageIndex; + final int codeStyleIndex; + final int themeModeIndex; + final int itemStyleIndex; + final int themeColorIndex; + + AppConfigPo({ + this.showBackGround = false, + this.showOverlayTool = false, + this.showPerformanceOverlay = false, + this.fontFamilyIndex = 1, + this.languageIndex = 0, + this.themeColorIndex = 4, + this.codeStyleIndex = 0, + this.themeModeIndex = 0, + this.itemStyleIndex = 0, + }); + + factory AppConfigPo.fromPo(dynamic map) { + return AppConfigPo( + showBackGround: map['showBackGround'] ?? false, + showOverlayTool: map['showOverlayTool'] ?? false, + showPerformanceOverlay: map['showPerformanceOverlay'] ?? false, + fontFamilyIndex: map['fontFamilyIndex'] ?? 1, + themeColorIndex: map['themeColorIndex'] ?? 5, + codeStyleIndex: map['codeStyleIndex'] ?? 0, + themeModeIndex: map['themeModeIndex'] ?? 0, + itemStyleIndex: map['itemStyleIndex'] ?? 0, + languageIndex: map['languageIndex'] ?? 0, + ); + } + + Map toJson() => { + 'showBackGround': showBackGround, + 'showOverlayTool': showOverlayTool, + 'showPerformanceOverlay': showPerformanceOverlay, + 'fontFamilyIndex': fontFamilyIndex, + 'themeColorIndex': themeColorIndex, + 'codeStyleIndex': codeStyleIndex, + 'themeModeIndex': themeModeIndex, + 'itemStyleIndex': itemStyleIndex, + 'languageIndex': languageIndex, + }; +} diff --git a/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart b/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart new file mode 100644 index 00000000..98b06559 --- /dev/null +++ b/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart @@ -0,0 +1,25 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +import 'cao/app_config_cao.dart'; + +class SpStorage { + SpStorage._(); + + static final SpStorage _instance = SpStorage._(); + + factory SpStorage() => _instance; + + SharedPreferences? _sp; + + SharedPreferences get spf => _sp!; + + late AppConfigCao _appConfig; + + AppConfigCao get appConfig => _appConfig; + + Future initSp() async { + if (_sp != null) return; + _sp = _sp ?? await SharedPreferences.getInstance(); + _appConfig = AppConfigCao(_sp!); + } +} diff --git a/modules/basic_system/storage/lib/storage.dart b/modules/basic_system/storage/lib/storage.dart new file mode 100644 index 00000000..3e9dff1f --- /dev/null +++ b/modules/basic_system/storage/lib/storage.dart @@ -0,0 +1,6 @@ +library storage; + + +export 'src/db_storage/storage.dart'; +export 'src/sp_storage/exp.dart'; +export 'src/app_storage.dart'; diff --git a/modules/basic_system/storage/pubspec.yaml b/modules/basic_system/storage/pubspec.yaml new file mode 100644 index 00000000..df10e193 --- /dev/null +++ b/modules/basic_system/storage/pubspec.yaml @@ -0,0 +1,51 @@ +name: storage +description: A new Flutter project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/db_storage/test/db_storage_test.dart b/modules/basic_system/storage/test/db_storage_test.dart similarity index 86% rename from packages/db_storage/test/db_storage_test.dart rename to modules/basic_system/storage/test/db_storage_test.dart index ded4a7d8..47a0629b 100644 --- a/packages/db_storage/test/db_storage_test.dart +++ b/modules/basic_system/storage/test/db_storage_test.dart @@ -1,6 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:db_storage/db_storage.dart'; void main() { // test('adds one to input values', () { diff --git a/modules/basic_system/toly_ui/.gitignore b/modules/basic_system/toly_ui/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/basic_system/toly_ui/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/basic_system/toly_ui/.metadata b/modules/basic_system/toly_ui/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/modules/basic_system/toly_ui/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/packages/utils/CHANGELOG.md b/modules/basic_system/toly_ui/CHANGELOG.md similarity index 100% rename from packages/utils/CHANGELOG.md rename to modules/basic_system/toly_ui/CHANGELOG.md diff --git a/packages/utils/LICENSE b/modules/basic_system/toly_ui/LICENSE similarity index 100% rename from packages/utils/LICENSE rename to modules/basic_system/toly_ui/LICENSE diff --git a/packages/utils/README.md b/modules/basic_system/toly_ui/README.md similarity index 100% rename from packages/utils/README.md rename to modules/basic_system/toly_ui/README.md diff --git a/packages/utils/analysis_options.yaml b/modules/basic_system/toly_ui/analysis_options.yaml similarity index 100% rename from packages/utils/analysis_options.yaml rename to modules/basic_system/toly_ui/analysis_options.yaml diff --git a/modules/basic_system/toly_ui/lib/adapter/platform_view_adapter.dart b/modules/basic_system/toly_ui/lib/adapter/platform_view_adapter.dart new file mode 100644 index 00000000..d5d5f834 --- /dev/null +++ b/modules/basic_system/toly_ui/lib/adapter/platform_view_adapter.dart @@ -0,0 +1,77 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +typedef WidthConditionFun = bool Function(double width); +typedef WidgetBuilder = Widget Function(BuildContext context); + +enum ViewAdapterType { width, platform } + +class PlatformViewAdapter extends StatelessWidget { + final Widget mobile; + final Widget desk; + final ViewAdapterType type; + + const PlatformViewAdapter({ + super.key, + required this.mobile, + required this.desk, + this.type = ViewAdapterType.width, + }); + + @override + Widget build(BuildContext context) { + switch (type) { + case ViewAdapterType.width: + return WidthConditionBuilder( + conditionMap: { + phoneSize: (_) => mobile, + deskSize: (_) => desk, + }, + ); + case ViewAdapterType.platform: + bool isDesk = kIsWeb || + Platform.isMacOS || + Platform.isWindows || + Platform.isLinux; + return isDesk ? desk : mobile; + } + } + + bool phoneSize(double size) { + return size > 0 && size <= 500; + } + + bool deskSize(double size) { + return size > 500; + } +} + +class WidthConditionBuilder extends StatelessWidget { + final Map conditionMap; + final Widget unMatchWidget; + + const WidthConditionBuilder({ + super.key, + required this.conditionMap, + this.unMatchWidget = const SizedBox.shrink(), + }); + + @override + Widget build(BuildContext context) { + return LayoutBuilder(builder: (_, c) { + List conditions = conditionMap.keys.toList(); + WidthConditionFun? active; + for (int i = 0; i < conditions.length; i++) { + if (conditions[i](c.maxHeight)) { + active = conditions[i]; + } + } + if (active != null) { + return conditionMap[active]!(context); + } + return unMatchWidget; + }); + } +} diff --git a/packages/components/lib/toly_ui/button/feedback_widget.dart b/modules/basic_system/toly_ui/lib/button/feedback_widget.dart similarity index 82% rename from packages/components/lib/toly_ui/button/feedback_widget.dart rename to modules/basic_system/toly_ui/lib/button/feedback_widget.dart index f46e1c0c..f90777d7 100644 --- a/packages/components/lib/toly_ui/button/feedback_widget.dart +++ b/modules/basic_system/toly_ui/lib/button/feedback_widget.dart @@ -73,17 +73,21 @@ class _FeedBackState extends State with SingleTickerProviderStat @override Widget build(BuildContext context) { - return GestureDetector( - onLongPress: widget.onLongPressed, - onTap: () { - _controller.forward(); - widget.onPressed?.call(); - }, - child: AnimatedBuilder( - animation: _controller, - child: widget.child, - builder: (ctx, child) => _buildByMode(child, widget.mode), - )); + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onLongPress: widget.onLongPressed, + behavior: HitTestBehavior.opaque, + onTap: () { + _controller.forward(); + widget.onPressed?.call(); + }, + child: AnimatedBuilder( + animation: _controller, + child: widget.child, + builder: (ctx, child) => _buildByMode(child, widget.mode), + )), + ); } Widget _buildByMode(Widget? child, FeedMode mode) { diff --git a/packages/components/lib/toly_ui/code/code.dart b/modules/basic_system/toly_ui/lib/code/code.dart similarity index 100% rename from packages/components/lib/toly_ui/code/code.dart rename to modules/basic_system/toly_ui/lib/code/code.dart diff --git a/modules/basic_system/toly_ui/lib/code/code_widget.dart b/modules/basic_system/toly_ui/lib/code/code_widget.dart new file mode 100644 index 00000000..c0cc9cc4 --- /dev/null +++ b/modules/basic_system/toly_ui/lib/code/code_widget.dart @@ -0,0 +1,55 @@ +/// create by 张风捷特烈 on 2020-04-15 +/// contact me by email 1981462002@qq.com +/// 说明: +import 'package:flutter/material.dart'; + +import 'high_light_code.dart'; +import 'highlighter_style.dart'; +import 'language/dart_languge.dart'; + +class CodeWidget extends StatelessWidget { + CodeWidget( + {Key? key, + required this.code, + required this.style, + this.fontSize = 13, + this.fontFamily}) + : super(key: key); + + final String code; + final HighlighterStyle style; + final double fontSize; + final String? fontFamily; + + @override + Widget build(BuildContext context) { + Widget body; + Widget codeWidget; + try { + codeWidget = SelectableText.rich( + selectionControls: MaterialTextSelectionControls(), + TextSpan( + style: TextStyle(fontSize: fontSize, fontFamily: fontFamily), + children: [ + CodeHighlighter(style: style, language: const DartLanguage()) + .format(code) + ], + ), + ); + } catch (err) { + print(err); + codeWidget = SelectableText(code); + } + body = SingleChildScrollView( + child: Container( + alignment: Alignment.centerLeft, + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: style.backgroundColor ?? const Color(0xffF6F8FA), + borderRadius: const BorderRadius.all(Radius.circular(5.0))), + child: codeWidget, + ), + ); + return body; + } +} diff --git a/packages/components/lib/toly_ui/code/high_light_code.dart b/modules/basic_system/toly_ui/lib/code/high_light_code.dart similarity index 94% rename from packages/components/lib/toly_ui/code/high_light_code.dart rename to modules/basic_system/toly_ui/lib/code/high_light_code.dart index 84e42737..fc15af2d 100644 --- a/packages/components/lib/toly_ui/code/high_light_code.dart +++ b/modules/basic_system/toly_ui/lib/code/high_light_code.dart @@ -19,7 +19,7 @@ import 'language/language.dart'; abstract class Highlighter { // ignore: one_member_abstracts - Language language; + ProgramLanguage language; Highlighter({required this.language}); @@ -30,7 +30,7 @@ abstract class Highlighter { //暗黑模式下的高亮样式 class CodeHighlighter extends Highlighter { CodeHighlighter( - {Language language = const DartLanguage(), HighlighterStyle? style}):super(language: language) { + {ProgramLanguage language = const DartLanguage(), HighlighterStyle? style}):super(language: language) { _spans = <_HighlightSpan>[]; _style = style ?? HighlighterStyle.fromColors(HighlighterStyle.lightColor); } @@ -91,20 +91,19 @@ class CodeHighlighter extends Highlighter { } // Line comments - if (_scanner.scan('//')) { + if (_scanner.scan(RegExp(r'//'))) { final int startComment = _scanner.lastMatch?.start??0; - bool eof = false; int endComment; - if (_scanner.scan(RegExp(r'.*\n'))) { - endComment = _scanner.lastMatch?.end??0 - 1; + if (_scanner.scan(RegExp(r'(.*\r\n)|(.*\n)'))) { + int? end = _scanner.lastMatch?.end; + endComment = end==null?0:end - 1; } else { eof = true; endComment = _src.length; } - _spans.add( - _HighlightSpan(_HighlightType.comment, startComment, endComment)); + _spans.add(_HighlightSpan(_HighlightType.comment, startComment, endComment)); if (eof) break; continue; diff --git a/packages/components/lib/toly_ui/code/highlighter_style.dart b/modules/basic_system/toly_ui/lib/code/highlighter_style.dart similarity index 100% rename from packages/components/lib/toly_ui/code/highlighter_style.dart rename to modules/basic_system/toly_ui/lib/code/highlighter_style.dart diff --git a/packages/components/lib/toly_ui/code/language/dart_languge.dart b/modules/basic_system/toly_ui/lib/code/language/dart_languge.dart similarity index 96% rename from packages/components/lib/toly_ui/code/language/dart_languge.dart rename to modules/basic_system/toly_ui/lib/code/language/dart_languge.dart index 1c82d8ed..8341d147 100644 --- a/packages/components/lib/toly_ui/code/language/dart_languge.dart +++ b/modules/basic_system/toly_ui/lib/code/language/dart_languge.dart @@ -5,7 +5,7 @@ import 'language.dart'; /// contact me by email 1981462002@qq.com /// 说明: -class DartLanguage extends Language{ +class DartLanguage extends ProgramLanguage{ const DartLanguage() : super('Dart'); diff --git a/modules/basic_system/toly_ui/lib/code/language/language.dart b/modules/basic_system/toly_ui/lib/code/language/language.dart new file mode 100644 index 00000000..812a3db4 --- /dev/null +++ b/modules/basic_system/toly_ui/lib/code/language/language.dart @@ -0,0 +1,17 @@ +/// create by 张风捷特烈 on 2021/1/21 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class ProgramLanguage { + final String name; + + const ProgramLanguage(this.name); + + bool containsKeywords(String word); + + bool containsInTypes(String word); + + List get keywords; + + List get inTypes; +} diff --git a/packages/components/lib/toly_ui/decorations/round_rect_rab_indicator.dart b/modules/basic_system/toly_ui/lib/decorations/round_rect_rab_indicator.dart similarity index 100% rename from packages/components/lib/toly_ui/decorations/round_rect_rab_indicator.dart rename to modules/basic_system/toly_ui/lib/decorations/round_rect_rab_indicator.dart diff --git a/packages/components/lib/toly_ui/default/loading/planet_loading.dart b/modules/basic_system/toly_ui/lib/default/loading/planet_loading.dart similarity index 95% rename from packages/components/lib/toly_ui/default/loading/planet_loading.dart rename to modules/basic_system/toly_ui/lib/default/loading/planet_loading.dart index 029c01ee..29ba49b8 100644 --- a/packages/components/lib/toly_ui/default/loading/planet_loading.dart +++ b/modules/basic_system/toly_ui/lib/default/loading/planet_loading.dart @@ -1,8 +1,10 @@ import 'dart:math'; -import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; +import '../../ti/circle.dart'; +import '../../ti/math_runner.dart'; + /// create by 张风捷特烈 on 2020/10/24 /// contact me by email 1981462002@qq.com diff --git a/modules/basic_system/toly_ui/lib/dialog/alert_conform_dialog.dart b/modules/basic_system/toly_ui/lib/dialog/alert_conform_dialog.dart new file mode 100644 index 00000000..a3346bac --- /dev/null +++ b/modules/basic_system/toly_ui/lib/dialog/alert_conform_dialog.dart @@ -0,0 +1,132 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class AlertConformDialog extends StatelessWidget { + final String title; + final String content; + final String conformText; + final String cancelText; + final bool titleDivider; + + final Function()? onConform; + final VoidCallback? onCancel; + final Color? conformTextColor; + + const AlertConformDialog( + {this.title = "title", + this.content = "content", + this.conformText = "确定", + this.cancelText = "取消", + this.onConform, + this.titleDivider = false, + this.onCancel, + this.conformTextColor, + Key? key}) + : super(key: key); + + final TextStyle noticeStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = const TextStyle( + color: Colors.grey, fontSize: 18, fontWeight: FontWeight.bold); + + final TextStyle subTextStyle = const TextStyle( + color: Color(0xff929292), fontSize: 16, fontWeight: FontWeight.bold); + + @override + Widget build(BuildContext context) { + return Dialog( + backgroundColor: Colors.white, + elevation: 0, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15))), + child: SizedBox( + // height: 120, + width: 320, + // color: Colors.green, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: titleDivider?10:15,bottom: titleDivider?10:0), + child: Center( + child: Text( + title, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + )), + ), + if(titleDivider) + const Divider(height: 1,), + Center( + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 30, horizontal: 20), + child: Text( + content, + style: noticeStyle, + ), + ), + ), + Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + onCancel?.call(); + Navigator.of(context).pop(false); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '取消', + style: cancelTextStyle, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async { + Navigator.of(context).pop(); + onConform?.call(); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + conformText, + style: TextStyle( + color: conformTextColor, + fontSize: 18, + fontWeight: FontWeight.bold), + ), + ), + )), + ], + ), + ], + ), + ), + ); + } +} diff --git a/modules/basic_system/toly_ui/lib/dialog/delete_message_panel.dart b/modules/basic_system/toly_ui/lib/dialog/delete_message_panel.dart new file mode 100644 index 00000000..32a89c39 --- /dev/null +++ b/modules/basic_system/toly_ui/lib/dialog/delete_message_panel.dart @@ -0,0 +1,255 @@ + + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +typedef AsyncTask = Future Function(BuildContext context); + +/// create by 张风捷特烈 on 2020-04-23 +/// contact me by email 1981462002@qq.com +/// 说明: +class DeleteMessagePanel extends StatelessWidget { + final String title; + final String msg; + final String? conformText; + final String? cancelText; + final AsyncTask task; + final Widget? icon; + + const DeleteMessagePanel({ + Key? key, + required this.title, + required this.msg, + required this.task, + this.conformText, + this.icon, + this.cancelText, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + ButtonStyle style = ElevatedButton.styleFrom( + backgroundColor: Colors.redAccent, + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder(), + ); + Color? cancelTextColor = isDark?Colors.white:Theme.of(context).textTheme.displayMedium?.color; + return SizedBox( + width: 350, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + icon?? const Icon( + Icons.warning_amber_rounded, + color: Colors.orange, + ), + const SizedBox( + width: 20, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + Padding( + padding: const EdgeInsets.only( + top: 15, + bottom: 15, + ), + child: Text( + msg, + style: const TextStyle(fontSize: 14), + ), + ), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + style: OutlinedButton.styleFrom( + // backgroundColor: Color(value), + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder(), + ), + child: Text( + cancelText?? '取消', + style: + TextStyle(fontSize: 12, color: cancelTextColor,height: 1), + )), + const SizedBox( + width: 10, + ), + AsyncButton( + conformText: conformText??'删除', + task: task, + style: style, + ), + ], + ) + ], + ), + ), + ], + ), + ), + ); + } +} + + +class MobileMessagePanel extends StatelessWidget { + final String title; + final String msg; + final String? conformText; + final String? cancelText; + final Widget? icon; + final Color? conformColor; + final AsyncTask task; + + const MobileMessagePanel({ + Key? key, + required this.title, + required this.msg, + required this.task, + this.conformText, + this.conformColor, + this.icon, + this.cancelText, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + ButtonStyle style = ElevatedButton.styleFrom( + backgroundColor: conformColor??Colors.redAccent, + elevation: 0, + padding: EdgeInsets.zero, + minimumSize: Size(70, 35), + shape: const StadiumBorder(), + ); + Color? cancelTextColor =isDark?Colors.white: Theme.of(context).textTheme.displayMedium?.color; + return SizedBox( + width: 350, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ icon?? const Icon( + Icons.warning_amber_rounded, + color: Colors.orange, + ), + const SizedBox( + width: 6, + ), Text( + title, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + )], + ), + Padding( + padding: const EdgeInsets.only( + top: 15, + bottom: 15, + ), + child: Text( + msg, + style: const TextStyle(fontSize: 14), + ), + ), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + style: OutlinedButton.styleFrom( + // backgroundColor: Color(value), + elevation: 0, + padding: EdgeInsets.zero, + minimumSize: Size(70, 35), + shape: const StadiumBorder(), + ), + child: Text( + cancelText?? '取消', + style: + TextStyle(fontSize: 12, color: cancelTextColor,height: 1), + )), + const SizedBox( + width: 10, + ), + AsyncButton( + conformText: conformText??'删除', + task: task, + style: style, + ), + ], + ) + ], + ), + ), + ); + } +} + +class AsyncButton extends StatefulWidget { + final ButtonStyle? style; + final AsyncTask task; + final String conformText; + + const AsyncButton({ + super.key, + required this.task, + this.style, + required this.conformText, + }); + + @override + State createState() => _AsyncButtonState(); +} + +class _AsyncButtonState extends State { + bool _loading = false; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: _loading ? null : _doTask, + style: widget.style??ElevatedButton.styleFrom( + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder()), + child: _loading + ? const CupertinoActivityIndicator(radius: 8) + :Text( + widget.conformText, + style: const TextStyle(fontSize: 12,height: 1), + )); + } + + void _doTask() async { + setState(() { + _loading = true; + }); + await widget.task(context); + setState(() { + _loading = false; + }); + } +} diff --git a/packages/components/lib/toly_ui/input/edit_panel.dart b/modules/basic_system/toly_ui/lib/input/edit_panel.dart similarity index 100% rename from packages/components/lib/toly_ui/input/edit_panel.dart rename to modules/basic_system/toly_ui/lib/input/edit_panel.dart diff --git a/packages/components/lib/toly_ui/input/icon_input.dart b/modules/basic_system/toly_ui/lib/input/icon_input.dart similarity index 100% rename from packages/components/lib/toly_ui/input/icon_input.dart rename to modules/basic_system/toly_ui/lib/input/icon_input.dart diff --git a/packages/components/lib/toly_ui/input/input_button.dart b/modules/basic_system/toly_ui/lib/input/input_button.dart similarity index 96% rename from packages/components/lib/toly_ui/input/input_button.dart rename to modules/basic_system/toly_ui/lib/input/input_button.dart index 98eb494c..4a90f436 100644 --- a/packages/components/lib/toly_ui/input/input_button.dart +++ b/modules/basic_system/toly_ui/lib/input/input_button.dart @@ -52,7 +52,7 @@ class _InputButtonState extends State { super.initState(); _height = widget.config.height; _fontSize = widget.config.fontSize; - _radius = Radius.circular(_height / 3.6); + _radius = Radius.circular(6); _controller = TextEditingController(text: widget.defaultText); } @@ -98,7 +98,7 @@ class _InputButtonState extends State { elevation: 0, padding: EdgeInsets.zero, shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20))), + borderRadius: BorderRadius.only(topRight: Radius.circular(6),bottomRight: Radius.circular(6))), backgroundColor: const Color(0x99E0E0E0), ), child: Icon(widget.config.iconData,color: Theme.of(context).primaryColor,), diff --git a/packages/components/lib/toly_ui/markdown/markdown_widget.dart b/modules/basic_system/toly_ui/lib/markdown/markdown_widget.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/markdown_widget.dart rename to modules/basic_system/toly_ui/lib/markdown/markdown_widget.dart diff --git a/packages/components/lib/toly_ui/markdown/md_text_styles.dart b/modules/basic_system/toly_ui/lib/markdown/md_text_styles.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/md_text_styles.dart rename to modules/basic_system/toly_ui/lib/markdown/md_text_styles.dart diff --git a/packages/components/lib/toly_ui/markdown/syntax_high_lighter.dart b/modules/basic_system/toly_ui/lib/markdown/syntax_high_lighter.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/syntax_high_lighter.dart rename to modules/basic_system/toly_ui/lib/markdown/syntax_high_lighter.dart diff --git a/packages/components/lib/toly_ui/object/windmill.dart b/modules/basic_system/toly_ui/lib/object/windmill.dart similarity index 100% rename from packages/components/lib/toly_ui/object/windmill.dart rename to modules/basic_system/toly_ui/lib/object/windmill.dart diff --git a/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart b/modules/basic_system/toly_ui/lib/popable/drop_selectable_widget.dart similarity index 81% rename from packages/components/lib/toly_ui/popable/drop_selectable_widget.dart rename to modules/basic_system/toly_ui/lib/popable/drop_selectable_widget.dart index 5e30c67f..b0b637c8 100644 --- a/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart +++ b/modules/basic_system/toly_ui/lib/popable/drop_selectable_widget.dart @@ -80,18 +80,24 @@ class _DropSelectableWidgetState extends State @override Widget build(BuildContext context) { _nodeAttachment.reparent(); - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (_focused) { - _node.unfocus(); - } else { - _node.requestFocus(); - } + return TapRegion( + groupId: 'selector', + onTapOutside: (_){ + _node.unfocus(); }, - child: CompositedTransformTarget( - link: layerLink, - child: buildTarget(), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (_focused) { + _node.unfocus(); + } else { + _node.requestFocus(); + } + }, + child: CompositedTransformTarget( + link: layerLink, + child: buildTarget(), + ), ), ); } @@ -178,20 +184,23 @@ class _DropSelectableWidgetState extends State ); Widget _buildItem(BuildContext context, int index) { - return Material( - child: InkWell( - onTap: () { - if (_selectedIndex != index) widget.onDropSelected?.call(index); - _selectedIndex = index; - _overlayEntry?.markNeedsBuild(); - _node.unfocus(); - }, - child: Container( - padding: const EdgeInsets.all(8), - color: index == _selectedIndex - ? Colors.blue.withOpacity(0.2) - : Colors.transparent, - child: Text(widget.data[index],style: TextStyle(fontSize: widget.fontSize),)), + return TapRegion( + groupId: 'selector', + child: Material( + child: InkWell( + onTap: () { + if (_selectedIndex != index) widget.onDropSelected?.call(index); + _selectedIndex = index; + _overlayEntry?.markNeedsBuild(); + _node.unfocus(); + }, + child: Container( + padding: const EdgeInsets.all(8), + color: index == _selectedIndex + ? Colors.blue.withOpacity(0.2) + : Colors.transparent, + child: Text(widget.data[index],style: TextStyle(fontSize: widget.fontSize),)), + ), ), ); } diff --git a/packages/components/lib/toly_ui/selector/burst_menu.dart b/modules/basic_system/toly_ui/lib/selector/burst_menu.dart similarity index 100% rename from packages/components/lib/toly_ui/selector/burst_menu.dart rename to modules/basic_system/toly_ui/lib/selector/burst_menu.dart diff --git a/packages/components/lib/toly_ui/selector/color_chooser.dart b/modules/basic_system/toly_ui/lib/selector/color_chooser.dart similarity index 98% rename from packages/components/lib/toly_ui/selector/color_chooser.dart rename to modules/basic_system/toly_ui/lib/selector/color_chooser.dart index 2c7fdf29..9d70c648 100644 --- a/packages/components/lib/toly_ui/selector/color_chooser.dart +++ b/modules/basic_system/toly_ui/lib/selector/color_chooser.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import '../button/feedback_widget.dart'; + typedef CheckCallback = void Function(T color); diff --git a/packages/components/lib/toly_ui/selector/multi_chip_filter.dart b/modules/basic_system/toly_ui/lib/selector/multi_chip_filter.dart similarity index 100% rename from packages/components/lib/toly_ui/selector/multi_chip_filter.dart rename to modules/basic_system/toly_ui/lib/selector/multi_chip_filter.dart diff --git a/packages/components/lib/toly_ui/sliver_header/sliver_pinned_header.dart b/modules/basic_system/toly_ui/lib/sliver_header/sliver_pinned_header.dart similarity index 100% rename from packages/components/lib/toly_ui/sliver_header/sliver_pinned_header.dart rename to modules/basic_system/toly_ui/lib/sliver_header/sliver_pinned_header.dart diff --git a/packages/components/lib/toly_ui/sliver_header/sliver_snap_header.dart b/modules/basic_system/toly_ui/lib/sliver_header/sliver_snap_header.dart similarity index 100% rename from packages/components/lib/toly_ui/sliver_header/sliver_snap_header.dart rename to modules/basic_system/toly_ui/lib/sliver_header/sliver_snap_header.dart diff --git a/packages/components/lib/toly_ui/ti/circle.dart b/modules/basic_system/toly_ui/lib/ti/circle.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/circle.dart rename to modules/basic_system/toly_ui/lib/ti/circle.dart diff --git a/modules/basic_system/toly_ui/lib/ti/circle_image.dart b/modules/basic_system/toly_ui/lib/ti/circle_image.dart new file mode 100644 index 00000000..bb7d20cc --- /dev/null +++ b/modules/basic_system/toly_ui/lib/ti/circle_image.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:storage/storage.dart'; +import 'package:widget_module/widget_module.dart'; + +class CircleImage extends StatelessWidget { + + const CircleImage({ + Key? key, + this.borderSize = 3, + required this.image, + this.size = 70, + this.shadowColor, + this.roundColor, + }) : super(key: key); + + final ImageProvider image; //图片 + final double size; //大小 + final Color? shadowColor; //阴影颜色 + final Color? roundColor; //边框颜色 + final double borderSize; + + @override + Widget build(BuildContext context) { + return Container( + width: size, + height: size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: roundColor ?? Colors.white, + boxShadow: [ + BoxShadow( + color: shadowColor ?? Colors.grey.withOpacity(0.3), + offset: const Offset(0.0, 0.0), + blurRadius: 3.0, + spreadRadius: 0.0, + ), + ], + ), + child: Padding( + padding: EdgeInsets.all(borderSize), + child: GestureDetector( + onTap: () async{ + var data = await AppStorage().flutter().queryWidgetByName('Container'); + print(data); + }, + child: DecoratedBox( + decoration: BoxDecoration( + image: DecorationImage( + image: image, + fit: BoxFit.cover, + filterQuality: FilterQuality.low), + shape: BoxShape.circle, + ), + ), + ), + ), + ); + } +} diff --git a/packages/components/lib/toly_ui/ti/circle_text.dart b/modules/basic_system/toly_ui/lib/ti/circle_text.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/circle_text.dart rename to modules/basic_system/toly_ui/lib/ti/circle_text.dart diff --git a/packages/components/lib/toly_ui/ti/color_wrapper.dart b/modules/basic_system/toly_ui/lib/ti/color_wrapper.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/color_wrapper.dart rename to modules/basic_system/toly_ui/lib/ti/color_wrapper.dart diff --git a/packages/components/lib/toly_ui/ti/math_runner.dart b/modules/basic_system/toly_ui/lib/ti/math_runner.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/math_runner.dart rename to modules/basic_system/toly_ui/lib/ti/math_runner.dart diff --git a/packages/components/lib/toly_ui/ti/panel.dart b/modules/basic_system/toly_ui/lib/ti/panel.dart similarity index 76% rename from packages/components/lib/toly_ui/ti/panel.dart rename to modules/basic_system/toly_ui/lib/ti/panel.dart index d1b4f24f..2fc3bd77 100644 --- a/packages/components/lib/toly_ui/ti/panel.dart +++ b/modules/basic_system/toly_ui/lib/ti/panel.dart @@ -6,18 +6,20 @@ class Panel extends StatelessWidget { final double radius; final Color? color; final Widget? child; + final EdgeInsetsGeometry? margin; - const Panel({Key? key, this.radius = 5.0, this.color, this.child}) : super(key: key); + const Panel({Key? key, this.radius = 5.0, this.color, this.child, this.margin=const EdgeInsets.all(10)}) : super(key: key); @override Widget build(BuildContext context) { return Container( - child: child, - padding: const EdgeInsets.all(10), + alignment: Alignment.centerLeft, + padding: margin, decoration: BoxDecoration( color: color ?? const Color(0xffF6F8FA), borderRadius: BorderRadius.all(Radius.circular(radius))), + child: child, ); } } diff --git a/packages/components/lib/toly_ui/ti/tag.dart b/modules/basic_system/toly_ui/lib/ti/tag.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/tag.dart rename to modules/basic_system/toly_ui/lib/ti/tag.dart diff --git a/packages/components/lib/toly_ui/ti/text_typer.dart b/modules/basic_system/toly_ui/lib/ti/text_typer.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/text_typer.dart rename to modules/basic_system/toly_ui/lib/ti/text_typer.dart diff --git a/modules/basic_system/toly_ui/lib/ti/toly_switch_list_tile.dart b/modules/basic_system/toly_ui/lib/ti/toly_switch_list_tile.dart new file mode 100644 index 00000000..ad38db69 --- /dev/null +++ b/modules/basic_system/toly_ui/lib/ti/toly_switch_list_tile.dart @@ -0,0 +1,383 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +// Examples can assume: +// void setState(VoidCallback fn) { } +// bool _isSelected = true; + +enum _SwitchListTileType { material, adaptive } + +/// A [ListTile] with a [Switch]. In other words, a switch with a label. +/// +/// {@youtube 560 315 https://www.youtube.com/watch?v=0igIjvtEWNU} +/// +/// The entire list tile is interactive: tapping anywhere in the tile toggles +/// the switch. Tapping and dragging the [Switch] also triggers the [onChanged] +/// callback. +/// +/// To ensure that [onChanged] correctly triggers, the state passed +/// into [value] must be properly managed. This is typically done by invoking +/// [State.setState] in [onChanged] to toggle the state value. +/// +/// The [value], [onChanged], [activeColor], [activeThumbImage], and +/// [inactiveThumbImage] properties of this widget are identical to the +/// similarly-named properties on the [Switch] widget. +/// +/// The [title], [subtitle], [isThreeLine], and [dense] properties are like +/// those of the same name on [ListTile]. +/// +/// The [selected] property on this widget is similar to the [ListTile.selected] +/// property. This tile's [activeColor] is used for the selected item's text color, or +/// the theme's [SwitchThemeData.overlayColor] if [activeColor] is null. +/// +/// This widget does not coordinate the [selected] state and the +/// [value]; to have the list tile appear selected when the +/// switch button is on, use the same value for both. +/// +/// The switch is shown on the right by default in left-to-right languages (i.e. +/// in the [ListTile.trailing] slot) which can be changed using [controlAffinity]. +/// The [secondary] widget is placed in the [ListTile.leading] slot. +/// +/// This widget requires a [Material] widget ancestor in the tree to paint +/// itself on, which is typically provided by the app's [Scaffold]. +/// The [tileColor], and [selectedTileColor] are not painted by the +/// [TolySwitchListTile] itself but by the [Material] widget ancestor. In this +/// case, one can wrap a [Material] widget around the [TolySwitchListTile], e.g.: +/// +/// {@tool snippet} +/// ```dart +/// Container( +/// color: Colors.green, +/// child: Material( +/// child: SwitchListTile( +/// tileColor: Colors.red, +/// title: const Text('SwitchListTile with red background'), +/// value: true, +/// onChanged:(bool? value) { }, +/// ), +/// ), +/// ) +/// ``` +/// {@end-tool} +/// +/// ## Performance considerations when wrapping [TolySwitchListTile] with [Material] +/// +/// Wrapping a large number of [TolySwitchListTile]s individually with [Material]s +/// is expensive. Consider only wrapping the [TolySwitchListTile]s that require it +/// or include a common [Material] ancestor where possible. +/// +/// To show the [TolySwitchListTile] as disabled, pass null as the [onChanged] +/// callback. +/// +/// {@tool dartpad} +/// ![SwitchListTile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile.png) +/// +/// This widget shows a switch that, when toggled, changes the state of a [bool] +/// member field called `_lights`. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.0.dart ** +/// {@end-tool} +/// +/// ## Semantics in SwitchListTile +/// +/// Since the entirety of the SwitchListTile is interactive, it should represent +/// itself as a single interactive entity. +/// +/// To do so, a SwitchListTile widget wraps its children with a [MergeSemantics] +/// widget. [MergeSemantics] will attempt to merge its descendant [Semantics] +/// nodes into one node in the semantics tree. Therefore, SwitchListTile will +/// throw an error if any of its children requires its own [Semantics] node. +/// +/// For example, you cannot nest a [RichText] widget as a descendant of +/// SwitchListTile. [RichText] has an embedded gesture recognizer that +/// requires its own [Semantics] node, which directly conflicts with +/// SwitchListTile's desire to merge all its descendants' semantic nodes +/// into one. Therefore, it may be necessary to create a custom radio tile +/// widget to accommodate similar use cases. +/// +/// {@tool dartpad} +/// ![Switch list tile semantics sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_semantics.png) +/// +/// Here is an example of a custom labeled radio widget, called +/// LinkedLabelRadio, that includes an interactive [RichText] widget that +/// handles tap gestures. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.1.dart ** +/// {@end-tool} +/// +/// ## SwitchListTile isn't exactly what I want +/// +/// If the way SwitchListTile pads and positions its elements isn't quite what +/// you're looking for, you can create custom labeled switch widgets by +/// combining [Switch] with other widgets, such as [Text], [Padding] and +/// [InkWell]. +/// +/// {@tool dartpad} +/// ![Custom switch list tile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_custom.png) +/// +/// Here is an example of a custom LabeledSwitch widget, but you can easily +/// make your own configurable widget. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.2.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [ListTileTheme], which can be used to affect the style of list tiles, +/// including switch list tiles. +/// * [CheckboxListTile], a similar widget for checkboxes. +/// * [RadioListTile], a similar widget for radio buttons. +/// * [ListTile] and [Switch], the widgets from which this widget is made. +class TolySwitchListTile extends StatelessWidget { + /// Creates a combination of a list tile and a switch. + /// + /// The switch tile itself does not maintain any state. Instead, when the + /// state of the switch changes, the widget calls the [onChanged] callback. + /// Most widgets that use a switch will listen for the [onChanged] callback + /// and rebuild the switch tile with a new [value] to update the visual + /// appearance of the switch. + /// + /// The following arguments are required: + /// + /// * [value] determines whether this switch is on or off. + /// * [onChanged] is called when the user toggles the switch on or off. + const TolySwitchListTile({ + super.key, + required this.value, + required this.onChanged, + this.tileColor, + this.activeColor, + this.activeTrackColor, + this.inactiveThumbColor, + this.inactiveTrackColor, + this.activeThumbImage, + this.inactiveThumbImage, + this.title, + this.subtitle, + this.isThreeLine = false, + this.dense, + this.contentPadding, + this.secondary, + this.selected = false, + this.autofocus = false, + this.controlAffinity = ListTileControlAffinity.platform, + this.shape, + this.selectedTileColor, + this.visualDensity, + this.focusNode, + this.onFocusChange, + this.enableFeedback, + this.hoverColor, + }); + + /// Whether this switch is checked. + /// + /// This property must not be null. + final bool value; + + /// Called when the user toggles the switch on or off. + /// + /// The switch passes the new value to the callback but does not actually + /// change state until the parent widget rebuilds the switch tile with the + /// new value. + /// + /// If null, the switch will be displayed as disabled. + /// + /// The callback provided to [onChanged] should update the state of the parent + /// [StatefulWidget] using the [State.setState] method, so that the parent + /// gets rebuilt; for example: + /// + /// {@tool snippet} + /// ```dart + /// SwitchListTile( + /// value: _isSelected, + /// onChanged: (bool newValue) { + /// setState(() { + /// _isSelected = newValue; + /// }); + /// }, + /// title: const Text('Selection'), + /// ) + /// ``` + /// {@end-tool} + final ValueChanged? onChanged; + + /// The color to use when this switch is on. + /// + /// Defaults to accent color of the current [Theme]. + final Color? activeColor; + + /// The color to use on the track when this switch is on. + /// + /// Defaults to [ThemeData.toggleableActiveColor] with the opacity set at 50%. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? activeTrackColor; + + /// The color to use on the thumb when this switch is off. + /// + /// Defaults to the colors described in the Material design specification. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? inactiveThumbColor; + + /// The color to use on the track when this switch is off. + /// + /// Defaults to the colors described in the Material design specification. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? inactiveTrackColor; + + /// {@macro flutter.material.ListTile.tileColor} + final Color? tileColor; + + /// An image to use on the thumb of this switch when the switch is on. + final ImageProvider? activeThumbImage; + + /// An image to use on the thumb of this switch when the switch is off. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final ImageProvider? inactiveThumbImage; + + /// The primary content of the list tile. + /// + /// Typically a [Text] widget. + final Widget? title; + + /// Additional content displayed below the title. + /// + /// Typically a [Text] widget. + final Widget? subtitle; + + /// A widget to display on the opposite side of the tile from the switch. + /// + /// Typically an [Icon] widget. + final Widget? secondary; + + /// Whether this list tile is intended to display three lines of text. + /// + /// If false, the list tile is treated as having one line if the subtitle is + /// null and treated as having two lines if the subtitle is non-null. + final bool isThreeLine; + + /// Whether this list tile is part of a vertically dense list. + /// + /// If this property is null then its value is based on [ListTileThemeData.dense]. + final bool? dense; + + /// The tile's internal padding. + /// + /// Insets a [TolySwitchListTile]'s contents: its [title], [subtitle], + /// [secondary], and [Switch] widgets. + /// + /// If null, [ListTile]'s default of `EdgeInsets.symmetric(horizontal: 16.0)` + /// is used. + final EdgeInsetsGeometry? contentPadding; + + /// Whether to render icons and text in the [activeColor]. + /// + /// No effort is made to automatically coordinate the [selected] state and the + /// [value] state. To have the list tile appear selected when the switch is + /// on, pass the same value to both. + /// + /// Normally, this property is left to its default value, false. + final bool selected; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + + /// Defines the position of control and [secondary], relative to text. + /// + /// By default, the value of [controlAffinity] is [ListTileControlAffinity.platform]. + final ListTileControlAffinity controlAffinity; + + /// {@macro flutter.material.ListTile.shape} + final ShapeBorder? shape; + + /// If non-null, defines the background color when [TolySwitchListTile.selected] is true. + final Color? selectedTileColor; + + /// Defines how compact the list tile's layout will be. + /// + /// {@macro flutter.material.themedata.visualDensity} + final VisualDensity? visualDensity; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode? focusNode; + + /// {@macro flutter.material.inkwell.onFocusChange} + final ValueChanged? onFocusChange; + + /// {@macro flutter.material.ListTile.enableFeedback} + /// + /// See also: + /// + /// * [Feedback] for providing platform-specific feedback to certain actions. + final bool? enableFeedback; + + /// The color for the tile's [Material] when a pointer is hovering over it. + final Color? hoverColor; + + @override + Widget build(BuildContext context) { + final Widget control = Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: value, + activeColor: activeColor, + // thumbColor: activet, + trackColor: activeTrackColor, + onChanged:onChanged + )); + + Widget? leading, trailing; + switch (controlAffinity) { + case ListTileControlAffinity.leading: + leading = control; + trailing = secondary; + break; + case ListTileControlAffinity.trailing: + case ListTileControlAffinity.platform: + leading = secondary; + trailing = control; + break; + } + + final ThemeData theme = Theme.of(context); + final SwitchThemeData switchTheme = SwitchTheme.of(context); + final Set states = { + if (selected) MaterialState.selected, + }; + final Color effectiveActiveColor = activeColor + ?? switchTheme.thumbColor?.resolve(states) + ?? theme.colorScheme.secondary; + return MergeSemantics( + child: ListTile( + selectedColor: effectiveActiveColor, + leading: leading, + title: title, + subtitle: subtitle, + trailing: trailing, + isThreeLine: isThreeLine, + dense: dense, + contentPadding: contentPadding, + enabled: onChanged != null, + onTap: onChanged != null ? () { onChanged!(!value); } : null, + selected: selected, + selectedTileColor: selectedTileColor, + autofocus: autofocus, + shape: shape, + tileColor: tileColor, + visualDensity: visualDensity, + focusNode: focusNode, + onFocusChange: onFocusChange, + enableFeedback: enableFeedback, + hoverColor: hoverColor, + ), + ); + } +} diff --git a/packages/components/lib/toly_ui/toly_ui.dart b/modules/basic_system/toly_ui/lib/toly_ui.dart similarity index 76% rename from packages/components/lib/toly_ui/toly_ui.dart rename to modules/basic_system/toly_ui/lib/toly_ui.dart index c4437171..39daae04 100644 --- a/packages/components/lib/toly_ui/toly_ui.dart +++ b/modules/basic_system/toly_ui/lib/toly_ui.dart @@ -16,8 +16,12 @@ export 'selector/color_chooser.dart'; export 'selector/multi_chip_filter.dart'; export 'selector/burst_menu.dart'; export 'decorations/round_rect_rab_indicator.dart'; - +export 'dialog/alert_conform_dialog.dart'; +export 'dialog/delete_message_panel.dart'; export 'object/windmill.dart'; export 'sliver_header/sliver_pinned_header.dart'; export 'sliver_header/sliver_snap_header.dart'; -export 'markdown/markdown_widget.dart' hide Highlighter; \ No newline at end of file +export 'ti/toly_switch_list_tile.dart'; +export 'markdown/markdown_widget.dart' hide Highlighter; + +export 'adapter/platform_view_adapter.dart'; \ No newline at end of file diff --git a/modules/basic_system/toly_ui/pubspec.yaml b/modules/basic_system/toly_ui/pubspec.yaml new file mode 100644 index 00000000..7959688d --- /dev/null +++ b/modules/basic_system/toly_ui/pubspec.yaml @@ -0,0 +1,50 @@ +name: toly_ui +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/basic_system/toly_ui/test/toly_ui_test.dart b/modules/basic_system/toly_ui/test/toly_ui_test.dart new file mode 100644 index 00000000..a31c1f80 --- /dev/null +++ b/modules/basic_system/toly_ui/test/toly_ui_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:toly_ui/toly_ui.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/packages/old_fancy_mobile_ui/.gitignore b/modules/basic_system/utils/.gitignore similarity index 100% rename from packages/old_fancy_mobile_ui/.gitignore rename to modules/basic_system/utils/.gitignore diff --git a/packages/utils/.metadata b/modules/basic_system/utils/.metadata similarity index 100% rename from packages/utils/.metadata rename to modules/basic_system/utils/.metadata diff --git a/packages/widget_module/CHANGELOG.md b/modules/basic_system/utils/CHANGELOG.md similarity index 100% rename from packages/widget_module/CHANGELOG.md rename to modules/basic_system/utils/CHANGELOG.md diff --git a/packages/widget_module/LICENSE b/modules/basic_system/utils/LICENSE similarity index 100% rename from packages/widget_module/LICENSE rename to modules/basic_system/utils/LICENSE diff --git a/packages/widget_module/README.md b/modules/basic_system/utils/README.md similarity index 100% rename from packages/widget_module/README.md rename to modules/basic_system/utils/README.md diff --git a/packages/widget_module/analysis_options.yaml b/modules/basic_system/utils/analysis_options.yaml similarity index 100% rename from packages/widget_module/analysis_options.yaml rename to modules/basic_system/utils/analysis_options.yaml diff --git a/modules/basic_system/utils/lib/src/color_utils.dart b/modules/basic_system/utils/lib/src/color_utils.dart new file mode 100644 index 00000000..f95fdcae --- /dev/null +++ b/modules/basic_system/utils/lib/src/color_utils.dart @@ -0,0 +1,71 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'random_provider.dart'; + +class ColorUtils { + static Color randomColor({ + int limitA = 120, + int limitR = 0, + int limitG = 0, + int limitB = 0, + }) { + Random random = RandomProvider.random; + int a = limitA + random.nextInt(256 - limitA); //透明度值 + int r = limitR + random.nextInt(256 - limitR); //红值 + int g = limitG + random.nextInt(256 - limitG); //绿值 + int b = limitB + random.nextInt(256 - limitB); //蓝值 + return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 + } + + + /// 使用方法: + /// var color1=ColorUtils.parse("#33428A43"); + /// var color2=ColorUtils.parse("33428A43"); + /// var color3=ColorUtils.parse("#428A43"); + ///var color4=ColorUtils.parse("428A43"); + /// + static Color parse(String code) { + Color result =Colors.red; + int value = 0 ; + if (code.contains("#")) { + try { + value = int.parse(code.substring(1), radix: 16); + } catch (e) { + print(e); + } + switch (code.length) { + case 7://6位 + result = Color(value + 0xFF000000); + break; + case 9://8位 + result = Color(value); + break; + default: + result =Colors.red; + } + }else { + try { + value = int.parse(code, radix: 16); + } catch (e) { + print(e); + } + switch (code.length) { + case 6: + result = Color(value + 0xFF000000); + break; + case 8: + result = Color(value); + break; + default: + result =Colors.red; + } + } + return result; + } + + static String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} + diff --git a/lib/app/utils/convert_man.dart b/modules/basic_system/utils/lib/src/convert_man.dart similarity index 100% rename from lib/app/utils/convert_man.dart rename to modules/basic_system/utils/lib/src/convert_man.dart diff --git a/packages/utils/lib/src/http_utils/http_util.dart b/modules/basic_system/utils/lib/src/http_utils/http_util.dart similarity index 83% rename from packages/utils/lib/src/http_utils/http_util.dart rename to modules/basic_system/utils/lib/src/http_utils/http_util.dart index b67dba27..e0b734e5 100644 --- a/packages/utils/lib/src/http_utils/http_util.dart +++ b/modules/basic_system/utils/lib/src/http_utils/http_util.dart @@ -1,11 +1,10 @@ import 'package:dio/dio.dart'; -import 'logs_interceptor.dart'; import 'token_interceptor.dart'; -const int _kReceiveTimeout = 5000; -const int _kSendTimeout = 5000; -const int _kConnectTimeout = 5000; +const Duration _kReceiveTimeout = Duration(milliseconds: 5000); +const Duration _kSendTimeout = Duration(milliseconds: 5000); +const Duration _kConnectTimeout = Duration(milliseconds: 5000); class HttpUtil { TokenInterceptors? tokenInterceptors; diff --git a/packages/utils/lib/src/http_utils/http_utils.dart b/modules/basic_system/utils/lib/src/http_utils/http_utils.dart similarity index 100% rename from packages/utils/lib/src/http_utils/http_utils.dart rename to modules/basic_system/utils/lib/src/http_utils/http_utils.dart diff --git a/packages/utils/lib/src/http_utils/logs_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/logs_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/logs_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/logs_interceptor.dart diff --git a/packages/utils/lib/src/http_utils/response_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/response_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/response_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/response_interceptor.dart diff --git a/modules/basic_system/utils/lib/src/http_utils/task_result.dart b/modules/basic_system/utils/lib/src/http_utils/task_result.dart new file mode 100644 index 00000000..cd732a56 --- /dev/null +++ b/modules/basic_system/utils/lib/src/http_utils/task_result.dart @@ -0,0 +1,25 @@ +class TaskResult { + final T? data; + final bool success; + final String msg; + final int count; + + TaskResult({this.data, this.success=false, this.msg='',this.count=0}); + + @override + String toString() { + return 'RepResult{data: $data, status: $success, msg:$msg}'; + } + + const TaskResult.error({required this.msg}) + : success = false, + data = null, + count = 0 + ; + + const TaskResult.success({ + this.data, + this.msg = '', + this.count = 0, + }) : success = true; +} diff --git a/packages/utils/lib/src/http_utils/token_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/token_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/token_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/token_interceptor.dart diff --git a/lib/app/utils/random_provider.dart b/modules/basic_system/utils/lib/src/random_provider.dart similarity index 100% rename from lib/app/utils/random_provider.dart rename to modules/basic_system/utils/lib/src/random_provider.dart diff --git a/packages/utils/lib/src/toast.dart b/modules/basic_system/utils/lib/src/toast.dart similarity index 100% rename from packages/utils/lib/src/toast.dart rename to modules/basic_system/utils/lib/src/toast.dart diff --git a/packages/utils/lib/utils.dart b/modules/basic_system/utils/lib/utils.dart similarity index 78% rename from packages/utils/lib/utils.dart rename to modules/basic_system/utils/lib/utils.dart index 43bcda4c..f83611f3 100644 --- a/packages/utils/lib/utils.dart +++ b/modules/basic_system/utils/lib/utils.dart @@ -3,3 +3,4 @@ library utils; export 'src/color_utils.dart'; export 'src/http_utils/http_utils.dart'; export 'src/toast.dart'; +export 'src/convert_man.dart'; diff --git a/modules/basic_system/utils/pubspec.yaml b/modules/basic_system/utils/pubspec.yaml new file mode 100644 index 00000000..f6885348 --- /dev/null +++ b/modules/basic_system/utils/pubspec.yaml @@ -0,0 +1,51 @@ +name: utils +description: utils +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/utils/test/utils_test.dart b/modules/basic_system/utils/test/utils_test.dart similarity index 100% rename from packages/utils/test/utils_test.dart rename to modules/basic_system/utils/test/utils_test.dart diff --git a/packages/utils/.gitignore b/modules/knowledge_system/algorithm/.gitignore similarity index 100% rename from packages/utils/.gitignore rename to modules/knowledge_system/algorithm/.gitignore diff --git a/packages/widget_repository/.metadata b/modules/knowledge_system/algorithm/.metadata similarity index 100% rename from packages/widget_repository/.metadata rename to modules/knowledge_system/algorithm/.metadata diff --git a/packages/widget_repository/CHANGELOG.md b/modules/knowledge_system/algorithm/CHANGELOG.md similarity index 100% rename from packages/widget_repository/CHANGELOG.md rename to modules/knowledge_system/algorithm/CHANGELOG.md diff --git a/packages/widget_repository/LICENSE b/modules/knowledge_system/algorithm/LICENSE similarity index 100% rename from packages/widget_repository/LICENSE rename to modules/knowledge_system/algorithm/LICENSE diff --git a/packages/widget_repository/README.md b/modules/knowledge_system/algorithm/README.md similarity index 100% rename from packages/widget_repository/README.md rename to modules/knowledge_system/algorithm/README.md diff --git a/packages/widget_repository/analysis_options.yaml b/modules/knowledge_system/algorithm/analysis_options.yaml similarity index 100% rename from packages/widget_repository/analysis_options.yaml rename to modules/knowledge_system/algorithm/analysis_options.yaml diff --git a/modules/knowledge_system/algorithm/lib/algorithm.dart b/modules/knowledge_system/algorithm/lib/algorithm.dart new file mode 100644 index 00000000..8c8957d7 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/algorithm.dart @@ -0,0 +1,11 @@ +library algorithm; + +export 'src/sort/sort_parper.dart'; +export 'src/sort/top_bar/sort_bar.dart'; +export 'src/sort/top_bar/sort_button.dart'; +export 'src/sort/sort_setting.dart'; +export 'src/sort/sort_page.dart'; +export 'src/data_scope/sort_config.dart'; +export 'src/data_scope/state.dart'; + +export 'src/views/algo_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions.dart new file mode 100644 index 00000000..e0585797 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions.dart @@ -0,0 +1,35 @@ + +import '../../finding/data_scope/finding_state.dart'; +import 'functions/AStar.dart'; +import 'functions/BestFS.dart'; +import 'functions/BFS.dart'; +import 'functions/DFS.dart'; +import 'functions/dijkstra.dart'; + +typedef XY = (int,int); + +typedef FindFunction = Future Function(FindingState state); + +enum FindingAlgo { + bfs('BFS'), + dfs('DFS'), + aStar('AStar'), + bestFS('BestFS'), + dijkstra('dijkstra'), + ; + + final String path; + + const FindingAlgo(this.path); + + FindFunction get function{ + return switch(this){ + FindingAlgo.bfs => findingBFS, + FindingAlgo.dfs => findingDFS, + FindingAlgo.aStar => findingAStar, + FindingAlgo.bestFS => findingBestFS, + FindingAlgo.dijkstra => findingDijkstra, + }; + } +} + diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/AStar.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/AStar.dart new file mode 100644 index 00000000..6f4f5424 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/AStar.dart @@ -0,0 +1,109 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + +/// AStar算法 +Future findingAStar(FindingState state) async { + XY start = state.start; + XY end = state.end; + // 创建优先队列作为开放列表 + PriorityQueue openList = PriorityQueue(); + openList.add(Node(start, 0, heuristic(start, end))); + var (row, col) = state.config.size; + // 初始化路径记录和访问标记 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + + while (!openList.isEmpty) { + // 从开放列表中移除f值最小的节点作为当前节点 + Node current = openList.removeFirst(); + int x = current.p.$1; + int y = current.p.$2; + + // 检查当前节点是否超出地图范围 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果当前节点已经访问过,则继续下一个节点 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + // 回溯路径 + List> path = []; + Node? curNode = current; + while (curNode != null) { + path.add([curNode.p.$1, curNode.p.$2]); + curNode = curNode.parent; + } + // 将路径标记到pathList中,并显示路径动画 + state.pathList = List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; + } + + // 遍历当前节点的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果新节点在地图范围内且是可通行的空地且未被访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + int g = current.g + 1; // 更新新节点的g值 + double h = heuristic((newX, newY), end); // 计算新节点的启发值h + openList.add(Node((newX, newY), g, h, current)); // 将新节点加入开放列表 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); // 延迟显示效果 + } + } + } + + return false; // 开放列表为空,未找到路径,搜索失败 +} + +// 估价函数 +double heuristic(XY start, XY end) { + return ((start.$1 - end.$1).abs() + (start.$2 - end.$2).abs()).toDouble(); +} + +class Node { + XY p; // 坐标 + int g; // 节点的坐标和当前路径长度g值 + double h; // 启发值h + Node? parent; // 父节点 + + Node(this.p, this.g, this.h, [this.parent]); + + double get f => g + h; // 计算节点的总代价f值 +} + +class PriorityQueue { + final List _queue = []; // 优先队列使用的列表 + + bool get isEmpty => _queue.isEmpty; // 判断队列是否为空 + + void add(Node node) { + _queue.add(node); // 添加节点到队列 + _queue.sort((a, b) => a.f.compareTo(b.f)); // 根据f值排序,f值小的在前面 + } + + Node removeFirst() { + return _queue.removeAt(0); // 移除并返回队列中f值最小的节点 + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BFS.dart new file mode 100644 index 00000000..db37b8dc --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BFS.dart @@ -0,0 +1,88 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:collection'; + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + +/// 广度优先搜索(BFS)寻找路径 +Future findingBFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + + // 创建队列并添加起始位置 + Queue> queue = Queue(); + queue.add([start.$1, start.$2]); + var (row,col) = state.config.size; + + // 初始化访问标记、路径记录和父节点记录 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List>> parent = List.generate(col, (_) => List.generate(row, (_) => [-1, -1])); + + // 开始广度优先搜索 + while (queue.isNotEmpty) { + List current = queue.removeFirst(); + int x = current[0]; + int y = current[1]; + + // 检查当前位置是否越界 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果已经访问过当前位置,则继续下一个循环 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; // 标记当前位置为已访问 + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径并记录到 path 列表中 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + List prev = parent[curX][curY]; + curX = prev[0]; + curY = prev[1]; + } + + // 清空原路径记录,并设置新的路径记录为找到的路径 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); // 设置路径标记 + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 返回找到路径的结果 + } + + // 遍历当前位置的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 检查新位置是否在地图范围内,并且是可通过的道路,并且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + queue.add([newX, newY]); // 将新位置添加到队列中 + parent[newX][newY] = [x, y]; // 记录新位置的父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); // 等待一段时间,以便显示搜索过程(如果在 Flutter 中) + } + } + } + + return false; // 如果队列为空仍未找到路径,则返回 false +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BestFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BestFS.dart new file mode 100644 index 00000000..2d462797 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BestFS.dart @@ -0,0 +1,101 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; +import 'AStar.dart'; + +/// BestFS算法 +Future findingBestFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + + // 初始化优先队列、起始节点和父节点数组 + PriorityQueue priorityQueue = PriorityQueue(); + var (row,col) = state.config.size; + + Node startNode = + Node(start, 0, euclideanDistance(start.$1, start.$2, end.$1, end.$2)); + priorityQueue.add(startNode); + + // 初始化 visitedList、pathList 和 parent + // 初始化路径记录和访问标记 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List> parent = + List.generate(col, (_) => List.filled(row, -1)); + + while (!priorityQueue.isEmpty) { + Node currentNode = priorityQueue.removeFirst(); + int x = currentNode.p.$1; + int y = currentNode.p.$2; + + // 如果当前节点已访问过,则跳过 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + int prevX = parent[curX][curY] ~/ row; + int prevY = parent[curX][curY] % row; + curX = prevX; + curY = prevY; + print("curX:$curX,curY:$curY"); + // 防止出现死循环,检查是否回溯到起点 + if (curX == start.$1 && curY == start.$2) { + break; + } + } + // path = path.reversed.toList(); + + // 绘制路径到界面上 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 找到路径并绘制完成,返回true + } + + // 探索当前节点的邻居节点 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果邻居节点在地图范围内且是可通行的道路且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + Node newNode = Node((newX, newY), currentNode.g + 1, + euclideanDistance(newX, newY, state.end.$1, state.end.$2)); + priorityQueue.add(newNode); + parent[newX][newY] = x * row + y; // 记录父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); + } + } + } + + return false; // 未找到路径,返回false +} + +double euclideanDistance(int x, int y, int endX, int endY) { + return sqrt(pow((x - endX).toDouble(), 2) + pow((y - endY).toDouble(), 2)); +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/DFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/DFS.dart new file mode 100644 index 00000000..ffad96b7 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/DFS.dart @@ -0,0 +1,84 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + + /// 深度优先搜索(DFS)寻找路径 + Future findingDFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + var (row,col) = state.config.size; + + // 初始化访问标记、路径记录和父节点记录 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List>> parent = List.generate(col, (_) => List.generate(row, (_) => [-1, -1])); + + // 定义DFS递归函数 + Future dfs(int x, int y) async { + // 检查当前位置是否越界 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果已经访问过当前位置,则返回 false + if (state.visitedList[x][y]) return false; + state.visitedList[x][y] = true; // 标记当前位置为已访问 + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径并记录到 path 列表中 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + List prev = parent[curX][curY]; + curX = prev[0]; + curY = prev[1]; + } + + // 清空原路径记录,并设置新的路径记录为找到的路径 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); // 设置路径标记 + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 返回找到路径的结果 + } + + // 遍历当前位置的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 检查新位置是否在地图范围内,并且是可通过的道路,并且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + parent[newX][newY] = [x, y]; // 记录新位置的父节点 + state.tick(); // 更新界面状态(如果在 Flutter 中) + await Future.delayed(const Duration(milliseconds: 50)); + if (await dfs(newX, newY)) { + return true; // 如果找到路径,则返回 true + } + } + } + + return false; // 如果当前位置无法继续搜索,则返回 false + } + + // 调用DFS函数并返回最终结果 + return await dfs(start.$1, start.$2); + } \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart new file mode 100644 index 00000000..d028929a --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart @@ -0,0 +1,101 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import '../../../finding/data_scope/finding_state.dart'; + +import '../functions.dart'; +import 'AStar.dart'; + +/// Dijkstra算法 +Future findingDijkstra(FindingState state) async { + XY start = state.start; + XY end = state.end; + var (row, col) = state.config.size; + // 初始化优先队列、距离数组和父节点数组 + PriorityQueue priorityQueue = PriorityQueue(); + List> distance = + List.generate(col, (_) => List.filled(row, -1)); + List> parent = + List.generate(col, (_) => List.filled(row, -1)); + + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + // 将起始节点加入优先队列并初始化距离 + priorityQueue.add(Node(start, 0, 0.0)); + distance[start.$1][start.$2] = 0; + + while (!priorityQueue.isEmpty) { + // 从优先队列中取出当前节点 + Node currentNode = priorityQueue.removeFirst(); + int x = currentNode.p.$1; + int y = currentNode.p.$2; + int currentDistance = currentNode.g; + + // 如果当前节点已访问过,则跳过 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + int prevX = parent[curX][curY] ~/ row; + int prevY = parent[curX][curY] % row; + curX = prevX; + curY = prevY; + print("curX:$curX,curY:$curY"); + // 防止出现死循环,检查是否回溯到起点 + if (curX == start.$1 && curY == start.$2) { + break; + } + } + // path = path.reversed.toList(); + + // 绘制路径到界面上 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 找到路径并绘制完成,返回true + } + + // 探索当前节点的邻居节点 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果邻居节点在地图范围内且是可通行的道路且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + int newDistance = currentDistance + 1; // 更新距离 + + // 如果是第一次访问或找到更短的路径,则更新距离和父节点,并加入优先队列 + if (distance[newX][newY] == -1 || newDistance < distance[newX][newY]) { + distance[newX][newY] = newDistance; + Node newNode = Node((newX, newY), newDistance, 0.0); // Dijkstra没有启发式函数,h设为0 + priorityQueue.add(newNode); + parent[newX][newY] = x * row + y; // 记录父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); + } + } + } + } + + return false; // 未找到路径,返回false +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions.dart new file mode 100644 index 00000000..70cceba6 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions.dart @@ -0,0 +1,46 @@ +import 'functions/bubble.dart'; +import 'functions/cocktail.dart'; +import 'functions/comb.dart'; +import 'functions/cycle.dart'; +import 'functions/gnome.dart'; +import 'functions/heap.dart'; +import 'functions/insertion.dart'; +import 'functions/merge.dart'; +import 'functions/pigeonHole.dart'; +import 'functions/quick.dart'; +import 'functions/selection.dart'; +import 'functions/shell.dart'; + +typedef SortFunction = Future Function(List src, SortCallback callback); +typedef SortCallback = Future Function(List dist); + +Map sortFunctionMap = { + 'insertion': insertionSort, + 'bubble': bubbleSort, + 'cocktail': cocktailSort, + 'comb': combSort, + 'pigeonHole': pigeonHoleSort, + 'shell': shellSort, + 'selection': selectionSort, + 'gnome': gnomeSort, + 'cycle': cycleSort, + 'heap': heapSort, + 'quick': quickSort, + 'merge': mergeSort, +}; + +Map sortNameMap = { + 'insertion': '插入排序', + 'bubble': '冒泡排序', + 'cocktail': '鸡尾酒排序(双向冒泡排序)', + 'comb': '梳排序', + 'pigeonHole': '鸽巢排序', + 'shell': '希尔排序', + 'selection': '选择排序', + 'gnome': '侏儒排序', + 'cycle': '循环排序', + 'heap': '堆排序', + 'quick': '快速排序', + 'merge': '归并排序', +}; + diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/bubble.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/bubble.dart new file mode 100644 index 00000000..3cf3c996 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/bubble.dart @@ -0,0 +1,19 @@ +import '../functions.dart'; + +///冒泡排序 +Future bubbleSort(List src, SortCallback callback ) async{ + //控制需要进行排序的次数。每一轮循环都会确定一个数字的最终位置。 + for (int i = 0; i < src.length; ++i) { + //遍历当前未排序的元素,通过相邻的元素比较并交换位置来完成排序。 + for (int j = 0; j < src.length - i - 1; ++j) { + //如果 _numbers[j] 大于 _numbers[j + 1],则交换它们的位置,确保较大的元素移到右边。 + if (src[j] > src[j + 1]) { + int temp = src[j]; + src[j] = src[j + 1]; + src[j + 1] = temp; + } + //实现一个延迟,以便在ui上展示排序的动画效果 + await callback(src); + } + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cocktail.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cocktail.dart new file mode 100644 index 00000000..8c2d18cd --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cocktail.dart @@ -0,0 +1,52 @@ +import '../functions.dart'; + +///鸡尾酒排序(双向冒泡排序) +Future cocktailSort(List src, SortCallback callback ) async { + bool swapped = true; // 表示是否进行了交换 + int start = 0; // 当前未排序部分的起始位置 + int end = src.length; // 当前未排序部分的结束位置 + + // 开始排序循环,只有当没有进行交换时才会退出循环 + while (swapped == true) { + swapped = false; + + // 从左往右遍历需要排序的部分 + for (int i = start; i < end - 1; ++i) { + // 对每两个相邻元素进行比较 + if (src[i] > src[i + 1]) { + // 如果前面的元素大于后面的元素,则交换它们的位置 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + swapped = true; // 进行了交换 + } + + // 实现动画效果,延迟一段时间后更新数组状态 + await callback(src); + } + + // 如果没有进行交换,则说明已经排好序,退出循环 + if (swapped == false) break; + // 重设为false,准备进行下一轮排序 + swapped = false; + // 将end设置为上一轮排序的最后一个元素的位置 + end = end - 1; + + // 从右往左遍历需要排序的部分 + for (int i = end - 1; i >= start; i--) { + // 对每两个相邻元素进行比较 + if (src[i] > src[i + 1]) { + // 如果前面的元素大于后面的元素,则交换它们的位置 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + swapped = true; // 进行了交换 + } + + // 实现动画效果,延迟一段时间后更新数组状态 + await callback(src); + } + // 将start向右移一位,准备下一轮排序 + start = start + 1; + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/comb.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/comb.dart new file mode 100644 index 00000000..821f4a97 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/comb.dart @@ -0,0 +1,34 @@ +import '../functions.dart'; + +///梳排序(Comb Sort) +Future combSort(List src, SortCallback callback) async{ + int gap = src.length; + + bool swapped = true; + + // 当间隔不为1或存在交换时执行循环 + while (gap != 1 || swapped == true) { + // 通过缩小间隔来逐步将元素归位 + gap = getNextGap(gap); + swapped = false; + for (int i = 0; i < src.length - gap; i++) { + // 如果当前元素大于间隔位置上的元素,则交换它们的位置 + if (src[i] > src[i + gap]) { + int temp = src[i]; + src[i] = src[i + gap]; + src[i + gap] = temp; + swapped = true; + } + + // 实现一个延迟,以便在 UI 上展示排序的动画效果。 + await callback(src); + } + } +} + +int getNextGap(int gap) { + // 根据当前间隔值计算下一个间隔值 + gap = (gap * 10) ~/ 13; + if (gap < 1) return 1; + return gap; +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cycle.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cycle.dart new file mode 100644 index 00000000..4bef6eb9 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cycle.dart @@ -0,0 +1,54 @@ +import '../functions.dart'; + +///循环排序 +Future cycleSort(List src, SortCallback callback) async { + int writes = 0; + for (int cycleStart = 0; cycleStart <= src.length - 2; cycleStart++) { + int item = src[cycleStart]; + int pos = cycleStart; + + // 在未排序部分中寻找比当前元素小的元素个数 + for (int i = cycleStart + 1; i < src.length; i++) { + if (src[i] < item) pos++; + } + + // 如果当前元素已经在正确位置上,则跳过此次迭代 + if (pos == cycleStart) { + continue; + } + + // 将当前元素放置到正确的位置上,并记录写操作次数 + while (item == src[pos]) { + pos += 1; + } + if (pos != cycleStart) { + int temp = item; + item = src[pos]; + src[pos] = temp; + writes++; + } + + // 循环将位于当前位置的元素放置到正确的位置上 + while (pos != cycleStart) { + pos = cycleStart; + // 继续在未排序部分中寻找比当前元素小的元素个数 + for (int i = cycleStart + 1; i < src.length; i++) { + if (src[i] < item) pos += 1; + } + + // 将当前元素放置到正确的位置上,并记录写操作次数 + while (item == src[pos]) { + pos += 1; + } + if (item != src[pos]) { + int temp = item; + item = src[pos]; + src[pos] = temp; + writes++; + } + + // 添加延迟操作以展示排序过程 + await callback(src); + } + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/gnome.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/gnome.dart new file mode 100644 index 00000000..5e08fc33 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/gnome.dart @@ -0,0 +1,22 @@ +import '../functions.dart'; + +///地精排序 (侏儒排序) +Future gnomeSort(List src, SortCallback callback) async { + int index = 0; + while (index < src.length) { + // 当 index 小于数组长度时执行循环 + if (index == 0) index++; + if (src[index] >= src[index - 1]) { + // 如果当前元素大于等于前面的元素,则将 index 加1 + index++; + } else { + // 否则,交换这两个元素,并将 index 减1(使得元素可以沉到正确位置) + int temp = src[index]; + src[index] = src[index - 1]; + src[index - 1] = temp; + index--; + } + await callback(src); + } + return; +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/heap.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/heap.dart new file mode 100644 index 00000000..9f5410b2 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/heap.dart @@ -0,0 +1,38 @@ +import '../functions.dart'; + +///堆排序 +Future heapSort(List src, SortCallback callback) async { + // 从最后一个非叶子节点开始,构建最大堆 + for (int i = src.length ~/ 2; i >= 0; i--) { + await heapify(src,callback, src.length, i); + } + + // 依次取出最大堆的根节点(最大值),并进行堆化 + for (int i = src.length - 1; i >= 0; i--) { + int temp = src[0]; + src[0] = src[i]; + src[i] = temp; + await heapify(src, callback,i, 0); + } +} + +Future heapify(List src, SortCallback callback, int n, int i) async{ + int largest = i; + int l = 2 * i + 1; // 左子节点索引 + int r = 2 * i + 2; // 右子节点索引 + + // 如果左子节点存在并且大于父节点,则更新最大值索引 + if (l < n && src[l] > src[largest]) largest = l; + + // 如果右子节点存在并且大于父节点或左子节点,则更新最大值索引 + if (r < n && src[r] > src[largest]) largest = r; + + // 如果最大值索引不等于当前节点索引,则交换节点值,并递归进行堆化 + if (largest != i) { + int temp = src[i]; + src[i] = src[largest]; + src[largest] = temp; + heapify(src,callback, n, largest); + } + await callback(src); +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/insertion.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/insertion.dart new file mode 100644 index 00000000..b1c78144 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/insertion.dart @@ -0,0 +1,19 @@ +import '../functions.dart'; + +///插入排序 +Future insertionSort(List src, SortCallback callback) async { + for (int i = 1; i < src.length; i++) { + int temp = src[i]; // 将当前元素存储到临时变量 temp 中 + int j = i - 1; // j 表示已排序部分的最后一个元素的索引 + + // 在已排序部分从后往前查找,找到合适位置插入当前元素 + while (j >= 0 && temp < src[j]) { + src[j + 1] = src[j]; // 当前元素比已排序部分的元素小,将元素后移一位 + --j; // 向前遍历 + // 更新排序结果回调 + await callback(src); + } + src[j + 1] = temp; // 插入当前元素到已排序部分的正确位置 + await callback(src); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/merge.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/merge.dart new file mode 100644 index 00000000..12135b46 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/merge.dart @@ -0,0 +1,79 @@ +import '../functions.dart'; + +//快速排序 +Future mergeSort(List src, SortCallback callback) async { + await _mergeSort(src,callback,0,src.length-1); +} + +///归并排序 +Future _mergeSort(List src, SortCallback callback,int leftIndex, int rightIndex) async { + // 定义一个名为 merge 的异步函数,用于合并两个有序子数组 + Future merge(int leftIndex, int middleIndex, int rightIndex) async { + // 计算左侧子数组和右侧子数组的大小 + int leftSize = middleIndex - leftIndex + 1; + int rightSize = rightIndex - middleIndex; + + // 创建左侧子数组和右侧子数组 + List leftList = List.generate(leftSize, (index) => 0); + List rightList = List.generate(rightSize, (index) => 0); + + // 将原始数组中的元素分别复制到左侧子数组和右侧子数组中 + for (int i = 0; i < leftSize; i++) { + leftList[i] = src[leftIndex + i]; + } + for (int j = 0; j < rightSize; j++) { + rightList[j] = src[middleIndex + j + 1]; + } + + // 初始化游标和索引 + int i = 0, j = 0; + int k = leftIndex; + + // 比较左侧子数组和右侧子数组的元素,并按顺序将较小的元素放入原始数组中 + while (i < leftSize && j < rightSize) { + if (leftList[i] <= rightList[j]) { + src[k] = leftList[i]; + i++; + } else { + src[k] = rightList[j]; + j++; + } + + await callback(src); + + k++; + } + + // 将左侧子数组或右侧子数组中剩余的元素放入原始数组中 + while (i < leftSize) { + src[k] = leftList[i]; + i++; + k++; + + await callback(src); + } + + while (j < rightSize) { + src[k] = rightList[j]; + j++; + k++; + + await callback(src); + } + } + + // 如果左索引小于右索引,则递归地对数组进行归并排序 + if (leftIndex < rightIndex) { + // 计算中间索引位置 + int middleIndex = (rightIndex + leftIndex) ~/ 2; + + // 分别对左侧子数组和右侧子数组进行归并排序 + await _mergeSort(src,callback,leftIndex, middleIndex); + await _mergeSort(src,callback,middleIndex + 1, rightIndex); + + await callback(src); + + // 合并两个有序子数组 + await merge(leftIndex, middleIndex, rightIndex); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/oddEven.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/oddEven.dart new file mode 100644 index 00000000..bd6f548a --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/oddEven.dart @@ -0,0 +1,37 @@ +import '../functions.dart'; + +///奇偶排序(Odd-Even Sort) +Future oddEvenSort(List src, SortCallback callback) async { + bool isSorted = false; + + while (!isSorted) { + // 当 isSorted 为 false 时执行循环 + isSorted = true; // 先假设数组已经排好序 + + for (int i = 1; i <= src.length - 2; i = i + 2) { + // 对奇数索引位置进行比较 + if (src[i] > src[i + 1]) { + // 如果当前元素大于后面的元素,则交换它们的值 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + isSorted = false; // 若发生了交换,则说明数组仍未完全排序,将 isSorted 设为 false + await callback(src); + } + } + + for (int i = 0; i <= src.length - 2; i = i + 2) { + // 对偶数索引位置进行比较 + if (src[i] > src[i + 1]) { + // 如果当前元素大于后面的元素,则交换它们的值 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + isSorted = false; + await callback(src); + } + } + } + + return; +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart new file mode 100644 index 00000000..83bbce10 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart @@ -0,0 +1,33 @@ +import '../functions.dart'; + +///鸽巢排序 +Future pigeonHoleSort(List src, SortCallback callback ) async{ + int min = src[0]; + int max = src[0]; + int range, i, j, index; + + // 找到数组中的最大值和最小值 + for (int a = 0; a < src.length; a++) { + if (src[a] > max) max = src[a]; + if (src[a] < min) min = src[a]; + } + + // 计算鸽巢的个数 + range = max - min + 1; + List p = List.generate(range, (i) => 0); + + // 将数字分配到各个鸽巢中 + for (i = 0; i < src.length; i++) { + p[src[i] - min]++; + } + + index = 0; + + // 将鸽巢中的数字取出,重新放回到数组中 + for (j = 0; j < range; j++) { + while (p[j]-- > 0) { + src[index++] = j + min; + await callback(src); + } + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/quick.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/quick.dart new file mode 100644 index 00000000..25b9685f --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/quick.dart @@ -0,0 +1,65 @@ +import '../functions.dart'; + +//快速排序 +Future quickSort(List src, SortCallback callback) async { + await _quickSort(src,callback,0,src.length-1); +} + +///快速排序 +Future _quickSort(List src, SortCallback callback,int leftIndex,int rightIndex) async { + // 定义一个名为 _partition 的异步函数,用于划分数组,并返回划分后的基准元素的索引位置 + Future _partition(int left, int right) async { + // 选择中间位置的元素作为基准元素 + int p = (left + (right - left) / 2).toInt(); + + // 交换基准元素和最右边的元素 + var temp = src[p]; + src[p] = src[right]; + src[right] = temp; + await callback(src); + + // 初始化游标 cursor + int cursor = left; + + // 遍历数组并根据基准元素将元素交换到左侧或右侧 + for (int i = left; i < right; i++) { + if (cf(src[i], src[right]) <= 0) { + // 如果当前元素小于等于基准元素,则交换它和游标位置的元素 + var temp = src[i]; + src[i] = src[cursor]; + src[cursor] = temp; + cursor++; + await callback(src); + } + } + + // 将基准元素放置在游标位置 + temp = src[right]; + src[right] = src[cursor]; + src[cursor] = temp; + + await callback(src); + + return cursor; // 返回基准元素的索引位置 + } + + // 如果左索引小于右索引,则递归地对数组进行快速排序 + if (leftIndex < rightIndex) { + int p = await _partition(leftIndex, rightIndex); + + await _quickSort(src,callback,leftIndex, p - 1); // 对基准元素左侧的子数组进行快速排序 + + await _quickSort(src,callback, p + 1, rightIndex); // 对基准元素右侧的子数组进行快速排序 + } +} + +// 比较函数,用于判断两个元素的大小关系 +cf(int a, int b) { + if (a < b) { + return -1; // 若 a 小于 b,则返回 -1 + } else if (a > b) { + return 1; // 若 a 大于 b,则返回 1 + } else { + return 0; // 若 a 等于 b,则返回 0 + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/selection.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/selection.dart new file mode 100644 index 00000000..185dae21 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/selection.dart @@ -0,0 +1,18 @@ +import '../functions.dart'; + +///选择排序 +Future selectionSort(List src, SortCallback callback ) async { + for (int i = 0; i < src.length; i++) { + for (int j = i + 1; j < src.length; j++) { + // 遍历未排序部分,内层循环控制变量 j + if (src[i] > src[j]) { + // 判断当前元素是否比后续元素小 + int temp = src[j]; + // 交换当前元素和后续较小的元素 + src[j] = src[i]; + src[i] = temp; + } + await callback(src); + } + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/shell.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/shell.dart new file mode 100644 index 00000000..232f8724 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/shell.dart @@ -0,0 +1,21 @@ +import '../functions.dart'; + +///希尔排序 +Future shellSort(List src, SortCallback callback) async{ + //定义变量 gap 并初始化为数组长度的一半。每次循环完成后将 gap 减半直到等于 0。 + for (int gap = src.length ~/ 2; gap > 0; gap ~/= 2) { + //遍历每个子序列并进行插入排序。初始时从第一个子序列的第二个元素开始,即 i = gap,以 gap 为步长逐个遍历每个子序列。 + for (int i = gap; i < src.length; i += 1) { + //将当前遍历到的元素赋值给它 + int temp = src[i]; + //内部使用一个 for 循环来实现插入排序。 + //循环开始时定义变量 j 并将其初始化为当前遍历到的元素的下标。通过不断比较前后相隔 gap 的元素大小并交换位置,将当前元素插入到正确的位置。 + int j; + for (j = i; j >= gap && src[j - gap] > temp; j -= gap) { + src[j] = src[j - gap]; + } + src[j] = temp; + await callback(src); + } + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/data_scope/sort_config.dart b/modules/knowledge_system/algorithm/lib/src/data_scope/sort_config.dart new file mode 100644 index 00000000..4cf0e8f0 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/data_scope/sort_config.dart @@ -0,0 +1,28 @@ + +class SortConfig { + final int count; + final int seed; + final Duration duration; + final String name; + + SortConfig({ + this.count = 100, + this.duration = const Duration(microseconds: 1500), + this.seed = -1, + this.name = 'insertion', + }); + + SortConfig copyWith({ + int? count, + int? seed, + Duration? duration, + String? name, + }) => + SortConfig( + count:count??this.count, + seed:seed??this.seed, + duration:duration??this.duration, + name:name??this.name, + ); +} + diff --git a/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart b/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart new file mode 100644 index 00000000..a5a4b479 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart @@ -0,0 +1,70 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +import '../algorithm/sort/functions.dart'; +import 'sort_config.dart'; + +enum SortStatus{ + none, // 未操作 + sorting, // 排序中 + sorted, // 排序完成 +} + +class SortState with ChangeNotifier{ + + SortState(){ + reset(); + } + + SortStatus status = SortStatus.none; + List data = []; + SortConfig _config = SortConfig(); + SortConfig get config => _config; + Random random = Random(); + + set config(SortConfig config){ + _config = config; + reset(); + notifyListeners(); + } + + void reset(){ + data.clear(); + status = SortStatus.none; + notifyListeners(); + int count = config.count; + if(config.seed!=-1){ + random = Random(config.seed); + } + for (int i = 0; i < count; i++) { + data.add(random.nextInt(1000)); + } + } + + void sort() async{ + status = SortStatus.sorting; + notifyListeners(); + SortFunction? sortFunction = sortFunctionMap[config.name]; + print(config.name); + if(sortFunction!=null){ + await sortFunction(data,(arr) async { + await Future.delayed(config.duration); + notifyListeners(); + }); + } + status = SortStatus.sorted; + notifyListeners(); + } +} + +class SortStateScope extends InheritedNotifier { + const SortStateScope({ + required super.notifier, + required super.child, + super.key, + }); + + static SortState of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_config.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_config.dart new file mode 100644 index 00000000..61dc99a7 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_config.dart @@ -0,0 +1,25 @@ +import '../../algorithm/finding/functions.dart'; + + +class FindingConfig { + final XY size; + final int seed; + final FindingAlgo algo; + + FindingConfig({ + this.seed = -1, + this.algo = FindingAlgo.bfs, + this.size = (31, 31), + }); + + FindingConfig copyWith({ + XY? size, + int? seed, + FindingAlgo? algo, + }) => + FindingConfig( + size: size ?? this.size, + seed: seed ?? this.seed, + algo: algo ?? this.algo, + ); +} diff --git a/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_state.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_state.dart new file mode 100644 index 00000000..360bbc69 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_state.dart @@ -0,0 +1,250 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; +import 'package:flutter/material.dart'; + +import '../../algorithm/finding/functions.dart'; +import 'finding_config.dart'; +import 'position.dart'; +import 'random_queue.dart'; + +enum FindingStatus{ + none, // 未操作 + finding, // 寻路中 + find, // 寻路完成 +} + +class FindingState with ChangeNotifier { + + int road = 1; //路 + int wall = 0; //墙 + + bool lockMap = false; + + //路径是否被访问过 + List> visitedList = []; + + //迷宫地图 + List> blockList = []; + + //寻找到的正确路线 + List> pathList = []; + + //方向 + List> direction = [ + [-1, 0], + [0, -1], + [1, 0], + [0, 1] + ]; + + FindingState() { + reset(); + } + + List> cacheBlockList = [[]]; + + void lock(){ + print("============lock====="); + lockMap=true; + cacheBlockList.clear(); + var (row,col) = _config.size; + + List.generate(row, (i) { + List tempMazeList = []; + List.generate(col, (j) { + tempMazeList.add(blockList[i][j]); //设置为墙 + }); + cacheBlockList.add(tempMazeList); + }); + notifyListeners(); + } + + void unlock(){ + lockMap=false; + cacheBlockList.clear(); + notifyListeners(); + } + + void tick(){ + notifyListeners(); + } + + FindingStatus status = FindingStatus.none; + FindingConfig _config = FindingConfig(); + FindingConfig get config => _config; + + late XY start; + late XY end; + + void reset(){ + status = FindingStatus.none; + if(lockMap){ + resetLocMap(); + notifyListeners(); + return; + } + + var (row,col) = _config.size; + if (row % 2 == 0 || col % 2 == 0) { + throw "地图行数和列数不能为偶数"; + } + + start = (1,0); + end = (row-2,col-1); + + blockList = []; + visitedList = []; + pathList = []; + //初始化迷宫遍历的方向(上、左、右、下)顺序(迷宫趋势) + //随机遍历顺序,提高迷宫生成的随机性(共12种可能性) + List.generate(direction.length, (index) { + int random = Random().nextInt(direction.length); + List temp = direction[random]; + direction[random] = direction[index]; + direction[index] = temp; + }); + + List.generate(row, (i) { + List tempVisited = []; + List tempMazeList = []; + List tempPath = []; + List.generate(col, (j) { + //行和列为奇数都设置为路,否则设置为墙 + if (i % 2 == 1 && j % 2 == 1) { + tempMazeList.add(1); //设置为路 + } else { + tempMazeList.add(0); //设置为墙 + } + //初始化访问,所有都没有访问过 + tempVisited.add(false); + tempPath.add(false); + }); + visitedList.add(tempVisited); + blockList.add(tempMazeList); + pathList.add(tempPath); + }); + + blockList[start.$1][start.$2] = 1; + blockList[end.$1][end.$2] = 1; + createMap(start.$1,start.$2+1); + status = FindingStatus.none; + + notifyListeners(); + } + + + ///设置为正确的路径 + void setPath(int x, int y, bool isPath) { + if (isInMap(x, y)) { + pathList[x][y] = isPath; + } + tick(); + } + + void changeAlgo(String name){ + FindingAlgo algo = FindingAlgo.values.firstWhere((e)=>e.path==name); + _config = config.copyWith(algo: algo); + if(lockMap){ + + } + status = FindingStatus.none; + notifyListeners(); + } + + void resetLocMap(){ + cacheBlockList = cacheBlockList; + visitedList = visitedList.map((innerList) => innerList.map((element) => false).toList()).toList(); + pathList = pathList.map((innerList) => innerList.map((element) => false).toList()).toList(); + } + + void run() async{ + status = FindingStatus.finding; + await config.algo.function(this); + status = FindingStatus.find; + notifyListeners(); + } + + /// 创建地图并使用随机队列生成地图结构 + void createMap(int startX, int startY) { + RandomQueue randomQueue = RandomQueue(); // 创建一个随机队列实例 + Position start = Position(startX, startY); // 创建起始位置 + randomQueue.addRandomQueue(start); // 将起始位置加入随机队列 + + visitedList[startX][startY] = true; // 标记起始位置为已访问 + + // 使用随机队列生成地图 + while (randomQueue.getSize() != 0) { + Position position = randomQueue.removeRandomQueue(); // 移除队列中的一个位置 + + // 生成四个方向的新位置 + List.generate(4, (i) { + int newX = position.x! + direction[i][0] * 2; + int newY = position.y! + direction[i][1] * 2; + + // 检查新位置是否在地图内且未被访问过 + if (isInMap(newX, newY) && !visitedList[newX][newY]) { + // 将新位置加入随机队列,并记录为已访问 + randomQueue.addRandomQueue(Position(newX, newY, prePosition: position)); + visitedList[newX][newY] = true; + + // 设置新位置与当前位置之间的路径或道路 + setWithRoad(position.x! + direction[i][0], position.y! + direction[i][1]); + } + }); + } + + // 把visitedList全部设置为没有访问 + visitedList = visitedList.map((innerList) => innerList.map((element) => false).toList()).toList(); + } + + ///设置为路 + void setWithRoad(int x, int y) { + blockList[x][y] = road; + } + + ///用来判断blockList[i][j]是否在地图内 + bool isInMap(int i, int j) { + return i >= 0 && i < config.size.$1 && j >= 0 && j < config.size.$2; + } + + Color getBoxColor(int i, int j) { + Color color = Colors.white; + if (blockList[i][j] == 0) { + color = Colors.black54; + } else if (start.$1 == i && start.$2 == j) { + color = Colors.blue; + } else if (end.$1 == i && end.$2 == j) { + color = Colors.red; + } else if (visitedList[i][j]) { + color = Colors.blue.shade200; + } + if (pathList[i][j]) { + color = Colors.orange; + } + return color; + } + +} + +/// Provides the current [FindingState] to descendant widgets in the tree. +class FindingStateScope extends InheritedNotifier { + const FindingStateScope({ + required super.notifier, + required super.child, + super.key, + }); + + static FindingState of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; + + + static FindingState read(BuildContext context) => + context.getInheritedWidgetOfExactType()!.notifier!; +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/finding/data_scope/position.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/position.dart new file mode 100644 index 00000000..1f739aab --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/position.dart @@ -0,0 +1,11 @@ +import 'dart:collection'; + +base class Position extends LinkedListEntry { + int? x, y; + Position? prePosition; + + Position(int x, int y, {this.prePosition}) { + this.x = x; + this.y = y; + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/finding/data_scope/random_queue.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/random_queue.dart new file mode 100644 index 00000000..2bf66b70 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/random_queue.dart @@ -0,0 +1,48 @@ +import 'dart:collection'; +import 'dart:math'; + +import 'position.dart'; + +///借助LinkedList链表实现随机队列 +class RandomQueue { + LinkedList _queue = LinkedList(); + + RandomQueue() { + _queue = LinkedList(); + } + + void addRandomQueue(Position position) { + if (Random().nextInt(100) < 50) { + _queue.addFirst(position);// 插入到队列头部 + } else { + _queue.add(position);// 插入到队列尾部 + } + } + + ///返回随机队列中的一个元素 + Position removeRandomQueue() { + if (_queue.isEmpty) { + throw "数组为空"; + } else { + if (Random().nextInt(100) < 50) { + Position position = _queue.first; + _queue.remove(position); + return position; + } else { + Position position = _queue.last; + _queue.remove(position); + return position; + } + } + } + + //返回随机队列元素数量 + int getSize() { + return _queue.length; + } + + //判断随机队列是否为空 + bool isEmpty() { + return _queue.isEmpty; + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/finding/view/board.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/board.dart new file mode 100644 index 00000000..897f34a6 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/board.dart @@ -0,0 +1,51 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +import '../data_scope/finding_state.dart'; + +class MazeBoard extends StatelessWidget { + const MazeBoard({super.key}); + + @override + Widget build(BuildContext context) { + FindingState state = FindingStateScope.of(context); + + return LayoutBuilder( + builder: (ctx,cts){ + double side = cts.biggest.shortestSide*0.9; + double cellSize = side / state.config.size.$1; + + List rowList = []; + List.generate(state.blockList.length, (i) { + List columnList = []; + List.generate(state.blockList[i].length, (j) { + columnList.add(Container( + width: cellSize, + height: cellSize, + decoration: BoxDecoration( + color: state.getBoxColor(i, j), + ), + )); + }); + + rowList.add(Row( + mainAxisAlignment: MainAxisAlignment.center, + children: columnList, + )); + }); + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: rowList, + ); + }, + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart new file mode 100644 index 00000000..5b83760f --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../data_scope/finding_state.dart'; + +class FindingButton extends StatelessWidget { + const FindingButton({super.key}); + + @override + Widget build(BuildContext context) { + FindingState state = FindingStateScope.of(context); + VoidCallback? action; + IconData icon; + String? tip; + Color color; + switch (state.status) { + case FindingStatus.none: + icon = Icons.not_started_outlined; + color = Colors.green; + action = state.run; + tip = '运行'; + break; + case FindingStatus.finding: + icon = Icons.stop_circle_outlined; + color = Colors.grey; + tip = '排序中'; + action = null; + break; + case FindingStatus.find: + icon = Icons.refresh; + color = Colors.black; + action = state.reset; + tip = '重置'; + break; + } + return TolyAction( + onTap: action, + tooltip: tip, + child: Icon(icon, color: color, size: 20), + ); + } + +} + diff --git a/modules/knowledge_system/algorithm/lib/src/finding/view/finding_page.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_page.dart new file mode 100644 index 00000000..4bc13209 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_page.dart @@ -0,0 +1,18 @@ +import 'package:algorithm/src/finding/view/board.dart'; +import 'package:flutter/material.dart'; +import 'finding_tool_bar.dart'; + +class FindingPage extends StatelessWidget { + const FindingPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold( + appBar: FindingToolBar(), + body: Column( + children: [ + Expanded(child: MazeBoard()), + ], + )); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart new file mode 100644 index 00000000..0ffbbeeb --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart @@ -0,0 +1,140 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/algorithm/sort/functions.dart'; +import 'package:algorithm/src/finding/view/finding_button.dart'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../data_scope/finding_state.dart'; + + +class FindingToolBar extends StatelessWidget implements PreferredSizeWidget{ + const FindingToolBar({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + FindingState state = FindingStateScope.of(context); + String name = state.config.algo.name; + + + return DragToMoveWrapper( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 42, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + const FindingButton(), + TolyAction( + tooltip: '更新地图', + onTap: () { + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + state.reset(); + // Scaffold.of(context).openEndDrawer(); + }, + child: const Icon( + Icons.refresh, + color: Colors.orange, + size: 20, + )), + TolyAction( + selected: state.lockMap, + tooltip: state.lockMap?'解除锁定':'锁定地图', + onTap: () { + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + if(state.lockMap){ + state.unlock(); + + }else{ + state.lock(); + + } + // Scaffold.of(context).openEndDrawer(); + }, + child: const Icon( + Icons.lock, + color: Colors.blue, + size: 20, + )), + Spacer(), + TolyLink( + href: + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/finding/functions/$%7Bname%7D.dart', + text: '查看[$name 寻路]源码', + hoverColor: Colors.blue, + style: TextStyle(fontSize: 12,fontFamily: '宋体'), + onTap: jumpURL), + const SizedBox(width: 10), + // TolyAction( + // tooltip: '设置', + // onTap: () { + // Scaffold.of(context).openEndDrawer(); + // }, + // child: const Icon( + // Icons.settings, + // size: 20, + // )), + ], + ), + ), + ); + } + + @override + // TODO: implement preferredSize + Size get preferredSize => Size.fromHeight(42); +} + +class SortBar extends StatelessWidget { + const SortBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SortButton(), + const SizedBox( + width: 10, + ), + const SortSelector(), + const SizedBox( + width: 10, + ), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} + +class SortSelector extends StatelessWidget { + const SortSelector({super.key}); + + @override + Widget build(BuildContext context) { + return DropSelectableWidget( + fontSize: 12, + data: sortNameMap.values.toList(), + iconSize: 20, + height: 28, + width: 200, + disableColor: const Color(0xff1F425F), + onDropSelected: (int index) async { + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: sortNameMap.keys.toList()[index]); + }, + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/menu/algo_menu.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/algo_menu.dart new file mode 100644 index 00000000..2118f0a5 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/menu/algo_menu.dart @@ -0,0 +1,9 @@ +import 'sort.dart'; +import 'finding.dart'; + +Map get algoMenus => { + 'children': [ + findingMenus, + sortMenus, + ] +}; diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/menu/finding.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/finding.dart new file mode 100644 index 00000000..a370c6f0 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/menu/finding.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +Map get findingMenus => { + 'path': '/finding', + 'icon': Icons.pages_outlined, + 'label': '寻路算法', + 'children': [ + { + 'path': '/BFS', + 'label': '广度优先搜索', + }, + { + 'path': '/DFS', + 'label': '深度优先搜索', + }, + { + 'path': '/AStar', + 'label': 'A* 寻路算法', + }, + { + 'path': '/BestFS', + 'label': '最佳优先算法', + }, + { + 'path': '/dijkstra', + 'label': 'Dijkstra 算法', + }, + ] +}; \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/menu/sort.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/sort.dart new file mode 100644 index 00000000..6af6c48f --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/menu/sort.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +Map get sortMenus => { + 'path': '/sort', + 'icon': Icons.sort, + 'label': '排序算法', + 'children': [ + { + 'path': '/insertion', + 'label': '插入排序', + }, + { + 'path': '/bubble', + 'label': '冒泡排序', + }, + { + 'path': '/cocktail', + 'label': '鸡尾酒排序', + }, + { + 'path': '/comb', + 'label': '梳排序', + }, + { + 'path': '/pigeonHole', + 'label': '鸽巢排序', + }, + { + 'path': '/shell', + 'label': '希尔排序', + }, + { + 'path': '/selection', + 'label': '选择排序', + }, + { + 'path': '/gnome', + 'label': '侏儒排序', + }, + { + 'path': '/cycle', + 'label': '循环排序', + }, + { + 'path': '/heap', + 'label': '堆排序', + }, + { + 'path': '/quick', + 'label': '快速排序', + }, + { + 'path': '/merge', + 'label': '归并排序', + }, + ] +}; \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart new file mode 100644 index 00000000..32c0ea91 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart @@ -0,0 +1,40 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/finding/view/finding_page.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; + +import '../../sort/sort_page.dart'; +import '../view/algo_desk_navigation.dart'; + +RouteBase get algoRoutes => GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return AppDeskNavigation(content: child); + }, + routes: [ + GoRoute( + path: 'sort/:name', + builder: (BuildContext context, GoRouterState state) { + return const DeskSortPage(); + }, + ), + GoRoute( + path: 'finding/:name', + builder: (BuildContext context, GoRouterState state) { + return const FindingPage(); + }, + ), + ]) + ], +); diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_desk_navigation.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_desk_navigation.dart new file mode 100644 index 00000000..d721ec79 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_desk_navigation.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import 'algo_menu_tree.dart'; + +class AppDeskNavigation extends StatelessWidget { + final Widget content; + + const AppDeskNavigation({super.key, required this.content}); + + @override + Widget build(BuildContext context) { + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return Scaffold( + backgroundColor: backgroundColor, + body: Row( + children: [ + const AppMenuTree(), + Expanded(child: content), + ], + ), + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart new file mode 100644 index 00000000..c3b297b7 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart @@ -0,0 +1,187 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-23 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +class AlgoMenuMetaExt extends Extra { + final String? subtitle; + final String? tag; + final bool? isFlutter; + + const AlgoMenuMetaExt({ + required this.subtitle, + required this.tag, + required this.isFlutter, + }); + + factory AlgoMenuMetaExt.fromMap(Map map) { + return AlgoMenuMetaExt( + subtitle: map['subtitle'], + tag: map['tag'], + isFlutter: map['isFlutter'], + ); + } +} + +class AlgoMenuCell extends StatelessWidget { + final MenuNode menuNode; + final DisplayMeta display; + final MenuTreeCellStyle? style; + + const AlgoMenuCell({ + super.key, + required this.menuNode, + required this.display, + this.style, + }); + + MenuTreeCellStyle get effectStyle => + style ?? + (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + + Color? effectForegroundColor(MenuTreeCellStyle style) { + if (display.selected) { + return display.isDark ? Colors.white : style.activeForegroundColor; + } + if (display.hovered) { + return display.isDark ? Colors.white : style.hoverForegroundColor; + } + return style.inactiveForegroundColor; + } + + double get anim => display.anima ?? 1; + + Color? backgroundColor(MenuTreeCellStyle style) { + if (hasChild) return null; + if (selectOrPlaying) { + return style.activeBackgroundColor.withOpacity(anim); + } + if (display.hovered) { + return style.hoverBackgroundColor; + } + return null; + } + + bool get selectOrPlaying => (display.selected || display.playing); + + bool get hasChild => menuNode.children.isNotEmpty; + + @override + Widget build(BuildContext context) { + MenuTreeCellStyle effectStyle = style ?? + (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + + Color? bgColor = backgroundColor(effectStyle); + Color? fgColor = effectForegroundColor(effectStyle); + EdgeInsets padding = const EdgeInsets.symmetric(horizontal: 8, vertical: 2); + + IconData? icon; + if (menuNode.data is IconMenu) { + icon = (menuNode.data as IconMenu).icon; + } + Widget cell = DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + color: bgColor, + ), + child: Row( + children: [ + Expanded( + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only( + left: 12.0 + (28 * menuNode.depth), + top: ext?.subtitle == null ? 8 : 8, + bottom: ext?.subtitle == null ? 8 : 8, + ), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + if (icon != null) + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon(icon, size: 20, color: fgColor), + ), + _buildTitle(fgColor) + ], + ), + ), + ), + if (ext?.tag != null) _buildTag(ext), + if (menuNode.children.isNotEmpty) + _buildExpandIndicator(display.expanded, fgColor) + ], + ), + ); + if (selectOrPlaying && effectStyle.showIndicator && !hasChild) { + cell = Stack( + alignment: Alignment.centerLeft, + children: [ + cell, + LineIndicator(progress: anim, color: fgColor), + ], + ); + } + return Padding(padding: padding, child: cell); + } + + AlgoMenuMetaExt? get ext => menuNode.data.ext?.me(); + + Widget _buildTitle(Color? fgColor) { + TextStyle subStyle = const TextStyle(fontSize: 12, color: Colors.grey); + TextStyle titleStyle = TextStyle(color: fgColor); + Widget child = Text( + menuNode.data.label, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: titleStyle, + ); + if (ext?.isFlutter ?? false) { + child = Wrap( + spacing: 4, + crossAxisAlignment: WrapCrossAlignment.center, + children: [child, const FlutterLogo(size: 14)], + ); + } + if (ext?.subtitle != null) { + child = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [child, Text(ext!.subtitle!, style: subStyle)], + ); + } + return child; + } + + Widget _buildTag(AlgoMenuMetaExt? ext) { + TextStyle tagStyle = + const TextStyle(color: Colors.white, height: 1, fontSize: 10); + Widget child = Text('${ext?.tag}', + overflow: TextOverflow.ellipsis, maxLines: 1, style: tagStyle); + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + decoration: BoxDecoration( + color: Colors.blue.withOpacity(0.8), + borderRadius: BorderRadius.circular(4)), + child: child), + ); + } + + Widget _buildExpandIndicator(bool expanded, Color? color) { + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Transform.rotate( + angle: display.rate * pi, + child: Icon(CupertinoIcons.chevron_down, size: 16, color: color))); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart new file mode 100644 index 00000000..83be03b6 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart @@ -0,0 +1,96 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../finding/data_scope/finding_state.dart'; +import '../menu/algo_menu.dart'; +import 'package:path/path.dart' as p ; + +import 'algo_menu_cell.dart'; + +class AppMenuTree extends StatefulWidget { + const AppMenuTree({super.key}); + + @override + State createState() => _AppMenuTreeState(); +} + +class _AppMenuTreeState extends State with RouterChangeListenerMixin { + late MenuTreeMeta _menuMeta; + + @override + void initState() { + super.initState(); + _initTreeMeta(); + } + + void _initTreeMeta() { + MenuNode root = MenuNode.fromMap(algoMenus); + List parts = Uri.parse(path).pathSegments; + String parentPath = parts.sublist(0, parts.length - 1).join('/'); + _menuMeta = MenuTreeMeta( + expandMenus: ['/$parentPath'], + activeMenu: root.find(path), + root: root, + ); + } + + @override + Widget build(BuildContext context) { + Color expandBackgroundColor = context.isDark ? Colors.black : Colors.transparent; + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return TolyRailMenuTree( + enableWidthChange: true, + maxWidth: 360, + width: 190, + meta: _menuMeta, + builder: (node, display) => AlgoMenuCell( + menuNode: node, + display: display, + ), + backgroundColor: backgroundColor, + expandBackgroundColor: expandBackgroundColor, + onSelect: _onSelect, + ); + } + + + void _onSelect(MenuNode menu) { + if (menu.isLeaf) { + FindingState state = FindingStateScope.read(context); + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + context.go(menu.id); + } else { + _menuMeta = _menuMeta.select(menu, singleExpand: true); + setState(() {}); + } + } + + @override + void reassemble() { + MenuNode root = MenuNode.fromMap(algoMenus); + _menuMeta = _menuMeta.copyWith(root: root); + super.reassemble(); + } + + @override + void onChangeRoute(String path) { + if(path.startsWith('/sort')){ + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: p.basename(path)); + print("=====path:${p.basename(path)}==${state.config.name}======"); + + }else{ + FindingState state = FindingStateScope.read(context); + state.changeAlgo(p.basename(path)); + } + + _menuMeta = _menuMeta.selectPath(path, singleExpand: true); + setState(() {}); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/sort/data_painter.dart b/modules/knowledge_system/algorithm/lib/src/sort/data_painter.dart new file mode 100644 index 00000000..e719d6bc --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/data_painter.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +class DataPainter extends CustomPainter { + final List data; + + DataPainter({required this.data}); + + @override + void paint(Canvas canvas, Size size) { + canvas.clipRect(Offset.zero & size); + double itemWidth = size.width / data.length; + + Paint paint = Paint(); + paint.strokeWidth = itemWidth; + paint.strokeCap = StrokeCap.round; + + for (int i = 0; i < data.length; i++) { + int value = data[i]; + if (value < 1000 * .10) { + paint.color = Colors.blue.shade100; + } else if (value < 1000 * .20) { + paint.color = Colors.blue.shade200; + } else if (value < 1000 * .30) { + paint.color = Colors.blue.shade300; + } else if (value < 1000 * .40) { + paint.color = Colors.blue.shade400; + } else if (value < 1000 * .50) { + paint.color = Colors.blue.shade500; + } else if (value < 1000 * .60) { + paint.color = Colors.blue.shade600; + } else if (value < 1000 * .70) { + paint.color = Colors.blue.shade700; + } else if (value < 1000 * .80) { + paint.color = Colors.blue.shade800; + } else if (value < 1000 * .90) { + paint.color = Colors.blue.shade900; + } else { + paint.color = const Color(0xFF011E51); + } + canvas.drawLine( + Offset(i * itemWidth + itemWidth / 2, 0), + Offset( + i * itemWidth + itemWidth / 2, + size.height * (value / 1000), + ), + paint); + } + } + + @override + bool shouldRepaint(covariant DataPainter oldDelegate) { + return true; + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart new file mode 100644 index 00000000..99a65dfb --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +import 'sort_parper.dart'; +import 'sort_setting.dart'; +import 'top_bar/sort_bar.dart'; + +class DeskSortPage extends StatelessWidget{ + const DeskSortPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold( + endDrawer: Drawer( + child: SortSettings(), + ), + body: Column( + children: [ + DeskSortBar(), + Expanded(child: SortPaper()), + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart new file mode 100644 index 00000000..f1cd8cac --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart @@ -0,0 +1,23 @@ + +import 'package:flutter/material.dart'; + +import '../../algorithm.dart'; +import 'data_painter.dart'; + +class SortPaper extends StatelessWidget{ + const SortPaper({super.key}); + + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + List numbers = state.data; + + return CustomPaint( + painter: DataPainter(data: numbers), + child: ConstrainedBox(constraints: BoxConstraints.expand()), + ); + } +} + + diff --git a/modules/knowledge_system/algorithm/lib/src/sort/sort_setting.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_setting.dart new file mode 100644 index 00000000..44a27351 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/sort_setting.dart @@ -0,0 +1,121 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:flutter/material.dart'; + + +class SortSettings extends StatefulWidget { + + const SortSettings({super.key,}); + + @override + State createState() => _SortSettingsState(); +} + +class _SortSettingsState extends State { + late TextEditingController _count = + TextEditingController(); + late TextEditingController _duration = TextEditingController(); + late TextEditingController _seed = + TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + SortState state = SortStateScope.of(context); + _count.text = state.config.count.toString(); + _duration.text = state.config.duration.inMicroseconds.toString(); + _seed.text = state.config.seed.toString(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + leading: BackButton(), + actions: [ + IconButton(onPressed: (){ + SortState state = SortStateScope.of(context); + state.config =state.config.copyWith( + count: int.parse(_count.text), + duration: Duration( + microseconds: int.parse(_duration.text), + ), + seed: int.parse(_seed.text) + ); + Navigator.of(context).pop(); + }, icon: Icon(Icons.check))], + iconTheme: IconThemeData(color: Colors.black), + titleTextStyle: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + centerTitle: true, + title: Text('排序算法配置'), + ), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + children: [ + Text('数据数量(个数):'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _count, + )), + ], + ), + Row( + children: [ + Text('时间间隔(微秒):'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _duration, + )), + ], + ), + Row( + children: [ + Text('随机种子:'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _seed, + )), + ], + ), + Spacer(), + // ElevatedButton( + // onPressed: () { + // SortState state = SortStateScope.of(context); + // state.config =state.config.copyWith( + // count: int.parse(_count.text), + // duration: Duration( + // microseconds: int.parse(_duration.text), + // ), + // seed: int.parse(_seed.text) + // ); + // Navigator.of(context).pop(); + // }, + // child: Text('确定设置')) + ], + ), + ), + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart new file mode 100644 index 00000000..251b90f2 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart @@ -0,0 +1,89 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/algorithm/sort/functions.dart'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; + +import 'sort_button.dart'; + +class DeskSortBar extends StatelessWidget { + const DeskSortBar({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + String name = SortStateScope.of(context).config.name; + + return DragToMoveWrapper( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 42, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + const SortButton(), + Spacer(), + TolyLink( + href: + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart', + text: '查看排序源码', + hoverColor: Colors.blue, + style: TextStyle(fontSize: 12, fontFamily: '宋体'), + onTap: jumpURL), + const SizedBox(width: 10), + TolyAction( + tooltip: '设置', + onTap: Scaffold.of(context).openEndDrawer, + child: const Icon(Icons.settings, size: 20)), + ], + ), + ), + ); + } +} + +class SortBar extends StatelessWidget { + const SortBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SortButton(), + const SizedBox( + width: 10, + ), + const SortSelector(), + const SizedBox( + width: 10, + ), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} + +class SortSelector extends StatelessWidget { + const SortSelector({super.key}); + + @override + Widget build(BuildContext context) { + return DropSelectableWidget( + fontSize: 12, + data: sortNameMap.values.toList(), + iconSize: 20, + height: 28, + width: 200, + disableColor: const Color(0xff1F425F), + onDropSelected: (int index) async { + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: sortNameMap.keys.toList()[index]); + }, + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart new file mode 100644 index 00000000..b7103001 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../../algorithm.dart'; + +class SortButton extends StatelessWidget { + const SortButton({super.key}); + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + VoidCallback? action; + IconData icon; + String? tip; + Color color; + switch (state.status) { + case SortStatus.none: + icon = Icons.not_started_outlined; + color = Colors.green; + action = state.sort; + tip = '运行'; + break; + case SortStatus.sorting: + icon = Icons.stop_circle_outlined; + color = Colors.grey; + tip = '寻路中'; + action = null; + break; + case SortStatus.sorted: + icon = Icons.refresh; + color = Colors.black; + action = state.reset; + tip = '重置'; + break; + } + return TolyAction( + onTap: action, + tooltip: tip, + child: Icon(icon, color: color, size: 20), + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart b/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart new file mode 100644 index 00000000..92680610 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart @@ -0,0 +1,67 @@ +import 'package:algorithm/src/finding/data_scope/finding_state.dart'; +import 'package:algorithm/src/navigation/router/router.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; + +import '../../algorithm.dart'; + +class AlgoScope extends StatelessWidget { + final Widget child; + + const AlgoScope({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + print("=====build======="); + return SortStateScope( + notifier: SortState(), + child: FindingStateScope( + notifier: FindingState(), + child: child, + ), + ); + } +} + +class AlgoRouterPage extends StatefulWidget { + const AlgoRouterPage({super.key}); + + @override + State createState() => _AlgoRouterPageState(); +} + +class _AlgoRouterPageState extends State { + final GoRouter _router = GoRouter( + initialLocation: '/finding/BFS', + routes: [algoRoutes], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go('/404', extra: state.uri.toString()); + }, + ); + + // late final DisplayLogic logic; + + @override + void initState() { + // logic = DisplayLogic(DisplayState( + // router: '/base/size', + // activeIndex: 0, + // total: kDisplayMap['/base/size']!.length, + // )); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AlgoScope( + child: Column( + children: [ + const Divider(), + Expanded( + child: Router.withConfig(config: _router), + ), + ], + ), + ); + } +} diff --git a/modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart b/modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart new file mode 100644 index 00000000..61a8f6ae --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart @@ -0,0 +1,62 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +// class LayoutRouterPage extends StatefulWidget { +// LayoutRouterPage({super.key}); +// +// @override +// State createState() => _LayoutRouterPageState(); +// } +// +// class _LayoutRouterPageState extends State { +// final GoRouter _router = GoRouter( +// initialLocation: '/base/size', +// routes: [layoutRoutes], +// onException: (BuildContext ctx, GoRouterState state, GoRouter router) { +// router.go('/404', extra: state.uri.toString()); +// }, +// ); +// +// late final DisplayLogic logic; +// +// @override +// void initState() { +// logic = DisplayLogic(DisplayState( +// router: '/base/size', +// activeIndex: 0, +// total: kDisplayMap['/base/size']!.length, +// )); +// super.initState(); +// } +// +// @override +// Widget build(BuildContext context) { +// return DisplayScope( +// notifier: logic, +// child: Column( +// children: [ +// const Divider(), +// Expanded( +// child: Router.withConfig(config: _router), +// ), +// ], +// ), +// ); +// } +// } + +class DeskAlgoPanel extends StatelessWidget { + const DeskAlgoPanel({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + + ); + } +} diff --git a/modules/knowledge_system/algorithm/pubspec.yaml b/modules/knowledge_system/algorithm/pubspec.yaml new file mode 100644 index 00000000..51cf4b61 --- /dev/null +++ b/modules/knowledge_system/algorithm/pubspec.yaml @@ -0,0 +1,54 @@ +name: algorithm +description: algorithm +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + + + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/knowledge_system/algorithm/test/utils_test.dart b/modules/knowledge_system/algorithm/test/utils_test.dart new file mode 100644 index 00000000..ba04b36e --- /dev/null +++ b/modules/knowledge_system/algorithm/test/utils_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + +} diff --git a/packages/widget_module/.gitignore b/modules/knowledge_system/artifact/.gitignore similarity index 100% rename from packages/widget_module/.gitignore rename to modules/knowledge_system/artifact/.gitignore diff --git a/modules/knowledge_system/artifact/.metadata b/modules/knowledge_system/artifact/.metadata new file mode 100644 index 00000000..6c08927e --- /dev/null +++ b/modules/knowledge_system/artifact/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: package diff --git a/packages/widgets/CHANGELOG.md b/modules/knowledge_system/artifact/CHANGELOG.md similarity index 100% rename from packages/widgets/CHANGELOG.md rename to modules/knowledge_system/artifact/CHANGELOG.md diff --git a/packages/widgets/LICENSE b/modules/knowledge_system/artifact/LICENSE similarity index 100% rename from packages/widgets/LICENSE rename to modules/knowledge_system/artifact/LICENSE diff --git a/packages/widgets/README.md b/modules/knowledge_system/artifact/README.md similarity index 100% rename from packages/widgets/README.md rename to modules/knowledge_system/artifact/README.md diff --git a/packages/widgets/analysis_options.yaml b/modules/knowledge_system/artifact/analysis_options.yaml similarity index 100% rename from packages/widgets/analysis_options.yaml rename to modules/knowledge_system/artifact/analysis_options.yaml diff --git a/modules/knowledge_system/artifact/lib/artifact.dart b/modules/knowledge_system/artifact/lib/artifact.dart new file mode 100644 index 00000000..42e84e72 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/artifact.dart @@ -0,0 +1,7 @@ +library artifact; + +export 'src/articles/view/artifact_page.dart'; + +export 'src/points/exp.dart'; +export 'src/articles/data/exp.dart'; +export 'src/articles/view/desk_artifact_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart new file mode 100644 index 00000000..5e73e1f6 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart @@ -0,0 +1,81 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../data/exp.dart'; + +import '../../data/repository/article_repository.dart'; + +class ArticleBloc extends Cubit { + ArticleBloc( + this.repository, { + this.pageSize = 20, + this.groupId, + }) : super(ArticleState.empty()); + + final int pageSize; + final int? groupId; + final ArticleRepository repository; + + /// 初始化时,加载 [pageSize] 条记录 + /// + void init() { + _loadDataFromDb(1, pageSize, filter: groupId?.toString(), requestNet: true); + } + + Future loadNextPageMore() async { + int curPage = state.data.length ~/ pageSize; + int nextPage = curPage + 1; + ArticleFilter filter = ArticleFilter( + page: nextPage, + pageSize: pageSize, + groupId: groupId, + ); + List
result = await repository.queryByDb(filter); + int count = await repository.total(filter); + emit(ArticleWithData( + data: state.data + result, + total: count, + )); + } + + Future _loadDataFromDb( + int page, + int pageSize, { + bool requestNet = false, + String? filter, + }) async { + ArticleFilter filter = ArticleFilter( + page: page, + pageSize: pageSize, + groupId: groupId, + ); + List
data = await repository.queryByDb(filter); + + // 没有内存缓存 并且数据库有数据 + if (data.isNotEmpty) { + emit(ArticleWithData(data: data, total: data.length)); + } + } + +} + +sealed class ArticleState { + final List
data; + + const ArticleState({this.data = const []}); + + factory ArticleState.empty() => const ArticleWithData(); +} + +class ArticleLoading extends ArticleState { + const ArticleLoading({super.data}); +} + +class ArticleWithData extends ArticleState { + final int total; + const ArticleWithData({super.data, this.total = 0}); +} + +class ArticleFailed extends ArticleState { + final String error; + const ArticleFailed(this.error, {super.data}); +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart new file mode 100644 index 00000000..9fda14c6 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart @@ -0,0 +1,39 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../data/exp.dart'; +import '../../data/repository/columnize_repository.dart'; + +class ColumnizeBloc extends Cubit { + final ColumnizeRepository repository; + + ColumnizeBloc(this.repository) : super(ColumnizeState.initial()); + + void init() { + _loadDataFromDb(requestNet: true); + } + + Future _loadDataFromDb({bool requestNet = false}) async { + /// + List data = await repository.queryByDb(); + + // + if (data.isNotEmpty) { + emit(ColumnizeState(data)); + } + } +} + +class ColumnizeState { + List data; + + ColumnizeState(this.data); + + factory ColumnizeState.initial() => ColumnizeState([ + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + ]); +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/bloc/exp.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/exp.dart new file mode 100644 index 00000000..2f17c65f --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/bloc/exp.dart @@ -0,0 +1,2 @@ +export 'article/bloc.dart'; +export 'columnize/bloc.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart new file mode 100644 index 00000000..51faed9f --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart @@ -0,0 +1,89 @@ +import 'package:fx_dao/fx_dao.dart'; +import 'package:sqflite/sqflite.dart'; + +import '../model/article.dart'; + +class ArticleDao extends Dao { + @override + String get createSql => ''; + + @override + String get name => 'article'; + + Future insert(Article po) => database.insert( + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(Article po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + name, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query(ArticleFilter filter) async { + String queryArgs = ''; + List args = []; + if (filter.filter != null) { + queryArgs += "AND filter = ? "; + args.add(filter.filter); + } + if (filter.groupId != null) { + if (queryArgs.isEmpty) { + queryArgs += 'WHERE groupId = ? '; + } else { + queryArgs += "AND groupId = ? "; + } + args.add(filter.groupId); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([filter.pageSize, filter.offset]); + + List> data = await database.rawQuery( + "SELECT * FROM $name $queryArgs", + args, + ); + + List
result = data.map(Article.fromDb).toList(); + return result; + } + + Future total(ArticleFilter filter) async { + bool hasGroupId = filter.groupId != null; + String familySql = hasGroupId ? 'WHERE groupId = ?' : ''; + List familyArg = hasGroupId ? [filter.groupId!] : []; + + String sql = "SELECT count(id) as `count` FROM article $familySql"; + + List> result = await database.rawQuery(sql, familyArg); + if (result.isNotEmpty) { + return result.first['count'] as int ?? 0; + } + return 0; + } + + @override + Convertor
get convertor => Article.fromDb; + + @override + Future update(String id, Article frame) async { + return 0; + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart new file mode 100644 index 00000000..131f4a3b --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart @@ -0,0 +1,62 @@ +import 'package:fx_dao/fx_dao.dart'; + +import '../model/columnize.dart'; + +class ColumnizeDao extends Dao { + @override + String get createSql => ''; + + @override + String get name => 'columnize'; + + Future insert(Columnize po) => database.insert( + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(Columnize po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + name, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query({ + int page = 1, + int pageSize = 20, + String? filter, + }) async { + String queryArgs = ''; + List args = []; + if (filter != null) { + queryArgs += "AND filter = ? "; + args.add(filter); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([pageSize, (page - 1) * pageSize]); + + List> data = await database.rawQuery( + "SELECT * FROM $name $queryArgs", + args, + ); + + List result = data.map(Columnize.fromDb).toList(); + return result; + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart b/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart new file mode 100644 index 00000000..4207924f --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart @@ -0,0 +1,6 @@ +export 'repository/article_repository.dart'; +export 'repository/columnize_repository.dart'; +export 'model/article.dart'; +export 'model/columnize.dart'; +export 'dao/article_dao.dart'; +export 'dao/columnize_dao.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart b/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart new file mode 100644 index 00000000..b1ef595b --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart @@ -0,0 +1,104 @@ +import 'package:fx_dao/fx_dao.dart'; + +class Article implements Po{ + final String? username; + final String title; + final String? subtitle; + final String url; + final String? cover; + final int create; + final int update; + final int id; + final int userId; + final int groupId; + + Article({ + this.username = '', + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + required this.userId, + this.id = -1, + required this.groupId, + + }); + + Map toJson() => + { + "id": id, + "userId": userId, + "groupId": groupId, + "username": username, + "title": title, + "createAt": create, + "subtitle": subtitle, + "url": url, + "cover": cover, + "updateAt": update, + }; + + factory Article.fromMap(dynamic map)=> + Article( + id: map['articleId'] ?? '', + username: map['userName'] ?? '', + userId: map['userId'] ?? '', + title: map['title'] ?? '', + create: DateTime.parse(map['createAt']).millisecondsSinceEpoch, + update: DateTime.parse(map['updateAt']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + groupId: map['groupId'] ?? 1, + cover: map['caver'] ?? '', + ); + + factory Article.fromDb(dynamic map)=> + Article( + id: map['id'] ?? '', + username: map['username'] ?? '', + userId: map['userId'] ?? '', + title: map['title'] ?? '', + create: map['createAt'] ?? 0 , + update: map['updateAt'] ?? 0, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + groupId: map['groupId'] ?? 1, + cover: map['cover'] ?? '', + ); +} + +class ArticleFilter{ + final String? filter; + final int? groupId; + final int page; + final int pageSize; + + const ArticleFilter({ + this.filter, + this.groupId, + this.page = 1, + this.pageSize = 20, + }); + + int get offset =>pageSize*(page-1); + + ArticleFilter copyWith({ + String? filter, + int? groupId, + int? page, + }) { + return ArticleFilter( + filter: filter ?? this.filter, + groupId: groupId ?? this.groupId, + page: page ?? this.page, + pageSize: pageSize + ); + } + + @override + String toString() { + return 'ArticleFilter{filter: $filter, groupId: $groupId, page: $page, pageSize: $pageSize}'; + } +} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart b/modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart new file mode 100644 index 00000000..63c4debb --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart @@ -0,0 +1,71 @@ + +class Columnize { + final String? username; + final String title; + final String subtitle; + final String? url; + final String? cover; + final int create; + final int update; + final int count; + final int userId; + final int id; + + Columnize({ + this.username = '', + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + this.count = 0, + this.id = -1, + this.userId = -1, + }); + + Map toJson() => { + "username": username, + "id": id, + "title": title, + "createAt": create, + "subtitle": subtitle, + "userId": userId, + "url": url, + "cover": cover, + "updateAt": update, + "count": count, + }; + + factory Columnize.fromMap(dynamic map) => Columnize( + username: map['userName'] ?? '', + title: map['title'] ?? '', + create: DateTime.parse(map['createAt']).millisecondsSinceEpoch, + update: DateTime.parse(map['updateAt']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['caver'] ?? '', + count: map['count'] ?? 0, + userId: map['userId'] ?? 0, + id: map['columnizeId'] ?? -1, + ); + + factory Columnize.fromDb(dynamic map)=> + Columnize( + id: map['id'] ?? '', + username: map['username'] ?? '', + userId: map['userId'] ?? '', + title: map['title'] ?? '', + create: map['createAt'] ?? 0 , + count: map['count'] ?? 0 , + update: map['updateAt'] ?? 0, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', + ); + + @override + String toString() { + return 'Columnize{username: $username, title: $title, subtitle: $subtitle, url: $url, cover: $cover, create: $create, update: $update, count: $count}'; + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart new file mode 100644 index 00000000..094a7a98 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart @@ -0,0 +1,22 @@ + +import 'package:storage/storage.dart'; + +import '../dao/article_dao.dart'; +import '../exp.dart'; + + + +// 仓储: 提供数据 +class ArticleRepository { + const ArticleRepository(); + + ArticleDao get dao => AppStorage().flutter(); + + // 从数据库加载资源 + Future> queryByDb(ArticleFilter filter) async { + List
caches = await dao.query(filter); + return caches; + } + + Future total(ArticleFilter filter) => dao.total(filter); +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart new file mode 100644 index 00000000..60ac4d52 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart @@ -0,0 +1,27 @@ + +import 'package:storage/storage.dart'; + +import '../exp.dart'; + +// 仓储: 提供数据 +class ColumnizeRepository { + + const ColumnizeRepository(); + + ColumnizeDao get dao => AppStorage().flutter(); + + + // 从数据库加载资源 + Future> queryByDb({ + int page = 1, + int pageSize = 20, + }) async { + List caches = await dao.query( + page: page, + pageSize: pageSize, + ); + return caches; + } + + +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart new file mode 100644 index 00000000..36718457 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart @@ -0,0 +1,80 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../data/exp.dart'; + +class ArticleDetailPage extends StatefulWidget { + final Article article; + + const ArticleDetailPage({Key? key, required this.article}) : super(key: key); + + @override + State createState() => _ArticleDetailPageState(); +} + +class _ArticleDetailPageState extends State { + late WebViewController controller; + + int progress = 0; + + @override + void initState() { + print(widget.article.url); + super.initState(); + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..loadRequest(Uri.parse('https://juejin.cn${widget.article.url}/')) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + print(progress); + this.progress =progress; + setState(() { + + }); + }, + onPageStarted: (String url) { + + }, + onPageFinished: (String url) { + }, + )); + } + + _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + + @override + Widget build(BuildContext context) { + + + return Scaffold( + appBar: AppBar(title: Text(widget.article.title),actions: [ + IconButton(onPressed: (){ + _launchURL('https://juejin.cn${widget.article.url}/'); + }, icon: Icon(TolyIcon.icon_artifact,size: 20,)) + ],), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + if(progress!=100) + Center( + child: CupertinoActivityIndicator(), + ) + ], + ), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart new file mode 100644 index 00000000..cbbc67f9 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + + +import '../../data/exp.dart'; +import 'sliver_article.dart'; + +class ColumnDetailPage extends StatelessWidget { + final Columnize columnize; + + const ColumnDetailPage({Key? key, required this.columnize}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(columnize.title), + ), + body: CustomScrollView( + slivers: [ + SliverPadding( + padding: EdgeInsets.only(top: 8), + sliver: SliverArticlePanel()) + // SliverAppBar( + // title: Text(columnize.title), + // ), + ], + ), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart new file mode 100644 index 00000000..d3f1f4ff --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -0,0 +1,286 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:intl/intl.dart'; +import '../../bloc/article/bloc.dart'; +import '../../bloc/exp.dart'; +import '../../data/exp.dart'; +import '../../data/repository/article_repository.dart'; + +import 'column_detail_page.dart'; + +DateFormat formatLong = DateFormat('yyyy-MM-dd HH:mm:ss'); + +const colors = [ + Color(0xFF0829FB), + Color(0xFFF60C0C), + Color(0xFFE7F716), + Color(0xFFF3B913), + Color(0xFF3DF30B), + Color(0xFFB709F4), + Color(0xFF0DF6EF), +]; + +class ColumnizePageView extends StatefulWidget { + const ColumnizePageView({Key? key}) : super(key: key); + + @override + _ColumnizePageViewState createState() => _ColumnizePageViewState(); +} + +class _ColumnizePageViewState extends State { + final ValueNotifier factor = ValueNotifier(0); + + late PageController _ctrl; + + final int _firstOffset = 1000; //初始偏移 + int _position = 0; //页面位置 + + @override + void initState() { + super.initState(); + _position = _position + _firstOffset; + + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; + _ctrl = PageController( + viewportFraction: kAppEnv.isDesktopUI ? 0.5 : 0.9, + initialPage: _position, + )..addListener(() { + if (_ctrl.page != null) { + double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; + factor.value = value == 0 ? 1 : value; + } + }); + } + + @override + void dispose() { + _ctrl.dispose(); + factor.dispose(); + super.dispose(); + } + + Color get color => Colors.blue; + + Color get nextColor => Colors.orangeAccent; + bool get isDark => Theme.of(context).brightness == Brightness.dark; + + BoxDecoration get boxDecoration => BoxDecoration( + color: isDark ? Colors.white.withAlpha(33) : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(40), topRight: Radius.circular(40)), + ); + + @override + Widget build(BuildContext context) { + List data = context.watch().state.data; + Widget child = PageView.builder( + controller: _ctrl, // itemCount: 7, + itemBuilder: (_, index) { + return AnimatedBuilder( + child: _buildByIndex(context, index, data), + animation: _ctrl, + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), + ); + }, + onPageChanged: (index) { + _position = index; + }, + ); + if (!kIsDesk) { + return child; + } + + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + child: Stack( + alignment: Alignment.center, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 48.0), + child: child), + Positioned( + right: 0, + child: IconButton( + onPressed: () { + _position += 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icon(Icons.navigate_next_outlined))), + Positioned( + left: 0, + child: IconButton( + onPressed: () { + _position -= 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icon(Icons.navigate_before))), + ], + ), + ); + } + + Widget? _buildByIndex(BuildContext context, int index, List data) { + int realIndex = _fixPosition(index, _firstOffset, data.length); + return ColumnizeItem( + columnize: data[realIndex], + color: colors[realIndex % colors.length], + ); + } + + Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { + double value; + if (_ctrl.position.haveDimensions && _ctrl.page != null) { + value = _ctrl.page! - index; + } else { + value = (_position - index).toDouble(); + } + value = (1 - ((value.abs()) * .3)).clamp(0, 1).toDouble(); + value = Curves.easeOut.transform(value); + + return Transform( + transform: Matrix4.diagonal3Values(1.0, value, 1.0), + alignment: Alignment.center, + child: Padding( + padding: const EdgeInsets.all(6.0), + child: child, + ), + ); + } + + int _fixPosition(int realPos, int initPos, int length) { + final int offset = realPos - initPos; + int result = offset % length; + return result < 0 ? length + result : result; + } + + bool _hover = false; + void _onEnter(PointerEnterEvent event) { + setState(() { + _hover = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hover = false; + }); + } +} + +class ColumnizeItem extends StatelessWidget { + final Columnize columnize; + final Color color; + const ColumnizeItem({Key? key, required this.columnize, required this.color}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + ArticleRepository repository = context.read().repository; + Navigator.of(context).push(SlidePageRoute( + child: MultiBlocProvider(providers: [ + BlocProvider( + create: (_) => + ArticleBloc(repository, groupId: columnize.id, pageSize: 100) + ..init(), + ), + ], child: ColumnDetailPage(columnize: columnize)))); + }, + child: Container( + alignment: Alignment.topLeft, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10), + // margin: EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + columnize.title, + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + Text( + '作者: ${columnize.username}', + style: TextStyle( + fontSize: 12, + color: Color( + 0xff6A6D76, + )), + ), + ], + ), + Spacer(), + Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + border: Border.all(color: Color(0xff3872E0))), + child: Text( + '${columnize.count} 篇', + style: TextStyle( + color: Color(0xff3872E0), fontSize: 12, height: 1.1), + ), + ) + ], + ), + const SizedBox( + height: 6, + ), + Text( + '专栏简介: ${columnize.subtitle}', + style: TextStyle( + color: Color( + 0xffA3A3A3, + ), + fontSize: 12), + maxLines: 3, + ), + Spacer(), + Row( + children: [ + Text( + '更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(columnize.update, isUtc: true))}', + style: TextStyle( + color: Color( + 0xff6A6D76, + ), + fontSize: 12), + ), + Spacer(), + ], + ), + ], + ), + decoration: BoxDecoration( + gradient: + LinearGradient(transform: GradientRotation(3 * pi / 4), colors: [ + color.withOpacity(0.1), + color.withOpacity(0.08), + color.withOpacity(0), + // Theme.of(context).primaryColor.withAlpha(88) + ]), // color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + ), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart new file mode 100644 index 00000000..155a5696 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart @@ -0,0 +1,185 @@ +import 'dart:io'; + +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../bloc/exp.dart'; + +import '../../data/exp.dart'; +import 'article_detail_page.dart'; +import 'columnize_page_view.dart'; + +class SliverArticlePanel extends StatelessWidget { + const SliverArticlePanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + ArticleState state = context.watch().state; + return switch (state) { + ArticleLoading() => const SliverToBoxAdapter( + child: CupertinoActivityIndicator(), + ), + ArticleWithData() => SliverArticle( + data: state.data, + ), + ArticleFailed() => const SliverToBoxAdapter( + child: Text('error'), + ), + }; + } +} + +class SliverArticle extends StatelessWidget { + final List
data; + + const SliverArticle({Key? key, required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + const SliverGridDelegate deskGridDelegate = + SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 420, + mainAxisSpacing: 8, + mainAxisExtent: 188, + crossAxisSpacing: 8, + ); + + Widget child = kIsDesk + ? SliverGrid( + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + ), + gridDelegate: deskGridDelegate) + : SliverList( + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + )); + + return SliverPadding( + padding: const EdgeInsets.only(bottom: 0), sliver: child); + } + + Widget? _buildItem(BuildContext context, int index) { + return ArticlePanel(article: data[index]); + } +} + +class ArticlePanel extends StatelessWidget { + final Article article; + + const ArticlePanel({Key? key, required this.article}) : super(key: key); + + void toArticleDetail(BuildContext context) { + if (Platform.isAndroid || Platform.isIOS) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ArticleDetailPage(article: article), + ), + ); + } + _launchURL('https://juejin.cn${article.url}/'); + } + + void _launchURL(String url) async { + print(url); + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => toArticleDetail(context), + child: Container( + color: Theme.of(context).listTileTheme.tileColor, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: const EdgeInsets.only(bottom: 6), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/icon_head.webp', + ), + backgroundColor: Colors.transparent, + radius: 10, + ), + const SizedBox( + width: 6, + ), + Expanded( + child: Text('${article.username}', + style: const TextStyle( + color: Color(0xff6A6D76), fontSize: 12))), + const Text( + '掘金', + style: TextStyle(fontSize: 12, color: Color(0xff6A6D76)), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Text( + article.title, + maxLines: 2, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + Expanded( + child: Text( + '${article.subtitle}', + maxLines: 4, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, + color: Color( + 0xffA3A3A3, + )), + )), + if (article.cover != null && article.cover!.isNotEmpty) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + article.cover!, + width: 110, + )), + ) + ], + ), + const SizedBox( + height: 4, + ), + Row( + children: [ + const Spacer(), + Text( + '更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(article.update, isUtc: true))}', + style: const TextStyle( + color: Color( + 0xff6A6D76, + ), + fontSize: 12), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_columnize.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_columnize.dart new file mode 100644 index 00000000..8a4fc370 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_columnize.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'columnize_page_view.dart'; +import 'package:l10n/l10n.dart'; +class ColumnizeViewPage extends StatefulWidget { + const ColumnizeViewPage({Key? key}) : super(key: key); + + @override + State createState() => _ColumnizeViewPageState(); +} + +class _ColumnizeViewPageState extends State { + + late PageController _ctrl; + + @override + void initState() { + super.initState(); + _ctrl = PageController(viewportFraction: 0.9); + } + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return Container( + height: 220, + color: Theme.of(context).listTileTheme.tileColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 16.0,right: 16,top: 12,bottom: 4), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp',), + backgroundColor: Colors.transparent, + radius: 10, + ), + SizedBox(width: 6,), + Text("捷特文章专栏",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + Spacer(), + GestureDetector( + onTap: () async{ + Uri uri = Uri.parse('https://juejin.im/user/5b42c0656fb9a04fe727eb37'); + if (await canLaunchUrl(uri)) { + await launchUrl(uri,mode:LaunchMode.externalNonBrowserApplication ); + } else { + debugPrint('Could not launch ${uri.path}'); + } + }, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + context.l10n.knowledgeToJuejin + + ,style: TextStyle(fontSize: 12,color: Colors.blue),), + Icon(Icons.navigate_next,size: 12,color: Colors.blue,) + ], + ), + ), + + ], + ), + ), + Expanded( + child: ColumnizePageView(), + ), + SizedBox(height: 10,) + ], + ), + ); + } + +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart new file mode 100644 index 00000000..d1deb5d0 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart @@ -0,0 +1,93 @@ + +import 'package:artifact/artifact.dart'; +import 'package:components/components.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:refresh/refresh.dart'; + +import '../../bloc/exp.dart'; + +import 'sliver_article.dart'; +import 'sliver_columnize.dart'; + +class TolyArticleScrollPage extends StatefulWidget { + const TolyArticleScrollPage({Key? key}) : super(key: key); + + @override + State createState() => _TolyArticleScrollPageState(); +} + +class _TolyArticleScrollPageState extends State { + + final RefreshController _refreshController = + RefreshController(initialRefresh: false); + + int maxCount = 60; + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RefreshConfigWrapper( + child: SmartRefresher( + enablePullUp: true, + onRefresh: _onRefresh, + onLoading: _loadMore, + controller: _refreshController, + child: CustomScrollView( + slivers: [ + // SliverOverlapInjector( + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // ), + SliverPadding( + padding: EdgeInsets.only(top: 10,bottom: 10), + sliver: const SliverToBoxAdapter( + child: ColumnizeViewPage(), + ), + ), + SliverArticlePanel(), + ], + ) + + // ListView.builder( + // padding: EdgeInsets.only(top: 10), + // itemCount: data.length, + // itemBuilder: _buildItem, + // ), + ), + ); + } + + void _onRefresh() async { + // monitor network fetch + await Future.delayed(Duration(milliseconds: 500)); + + _refreshController.refreshCompleted(); + } + + void _loadMore() async { + ArticleBloc bloc = context.read(); + await context.read().loadNextPageMore(); + // int length = data.length; + ArticleState state = bloc.state; + if(state is ArticleWithData){ + if (state.data.length >= state.total) { + _refreshController.loadNoData(); + await Future.delayed(Duration(milliseconds: 2000)); + _refreshController.resetNoData(); + return; + } + + _refreshController.loadComplete(); + } + + } + + +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart new file mode 100644 index 00000000..101e3bac --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart @@ -0,0 +1,286 @@ +import 'dart:math'; + +import 'package:algorithm/algorithm.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../bloc/columnize/bloc.dart'; +import '../bloc/exp.dart'; +import '../data/exp.dart'; +import '../data/repository/article_repository.dart'; +import 'article/toly_article_scroll_page.dart'; + +import 'dart:ui' as ui; + +import 'building/building_panel.dart'; + +class ArtifactPage extends StatefulWidget { + const ArtifactPage({Key? key}) : super(key: key); + + @override + State createState() => _ArtifactPageState(); +} + +// 任意处下滑可出现 AppBar +// |--- NestedScrollView#floatHeaderSlivers: true +// |--- SliverAppBar#floating: true + +// 任意处下滑可出现 AppBar + 轻滑出现 +// |--- NestedScrollView#floatHeaderSlivers: true +// |--- SliverAppBar#floating: true +// |--- SliverAppBar#snap: true + +const List kArtifactInfo = [ + '分类收录张风捷特烈的博客文章', + '可视化排序算法', + '收录布局方案,提供界面样板', + 'Flutter 知识小要点,一网打尽', +]; + +class _ArtifactPageState extends State + with SingleTickerProviderStateMixin { + late TabController controller; + List data = []; + + @override + void initState() { + super.initState(); + controller = TabController(length: 4, vsync: this); + controller.addListener(_listen); + data = List.generate(5, (index) => 'Init $index'); + } + + int _curIndex = 0; + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + ArticleRepository aRepository = const ArticleRepository(); + ColumnizeRepository cRepository = const ColumnizeRepository(); + + @override + Widget build(BuildContext context) { + double bottom = MediaQuery.of(context).padding.bottom; + String name = SortStateScope.of(context).config.name; + + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider(create: (_) => ArticleBloc(aRepository)..init()), + ], + child: Scaffold( + endDrawer: SortSettings(), + backgroundColor: const Color(0xffF2F3F5), + bottomNavigationBar: Container(height: bottom), + body: NestedScrollView( + headerSliverBuilder: _buildAppBar, + floatHeaderSlivers: true, + body: TabBarView( + controller: controller, + children: [ + TolyArticleScrollPage(), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + GestureDetector( + onTap: () { + _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + }, + child: Text( + '查看排序源码', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).primaryColor, + ), + )), + Spacer(), + SortSelector(), + ], + ), + ), + Expanded(child: SortPaper()), + ], + ), + BuildingPanel(), + BuildingPanel(), + ], + ), + ), + ), + ); + } + + _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + + + + List _buildAppBar(BuildContext context, bool innerBoxIsScrolled) { + // print('innerBoxIsScrolled:$innerBoxIsScrolled'); + return [ + // SliverOverlapAbsorber( + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // + // sliver: + SliverAppBar( + floating: true, + snap: true, + pinned: true, + backgroundColor: Colors.white, + leading: _curIndex == 1 ? SortButton() : null, + + // flexibleSpace: Image.network( + // 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/448d4eb270f44edab0192a1281141954~tplv-k3u1fbpfcp-watermark.image?', + // fit: BoxFit.cover, + // ), + + // expandedHeight: 120, + + flexibleSpace: Container( + // height: 240, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Color(0xffD3D5F5), + Color(0xffC8EBFA), + ], transform: GradientRotation(pi / 4))), + ), + // flexibleSpace: Doodle(), + // leading: Center( + // child: Text( + // '宝具库', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + // )), + // actions: [Icon(Icons.cached_outlined)], + titleSpacing: 0, + // leadingWidth: 40, + + title: Column( + children: [ + Text( + 'Flutter 知识宝库', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + const SizedBox( + height: 4, + ), + Text( + kArtifactInfo[_curIndex], + maxLines: 2, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.normal, + color: Colors.purple), + ), + ], + ), + actions: [ + if (_curIndex == 1) + IconButton( + onPressed: () { + Scaffold.of(context).openEndDrawer(); + }, + icon: Icon(Icons.settings)), + if (_curIndex != 1) + IconButton(onPressed: () {}, icon: Icon(Icons.search_rounded)) + ], + // title: Padding( + // padding: const EdgeInsets.only(right: 8.0), + // child: CupertinoTextField(), + // ), + bottom: TabBar( + controller: controller, + tabs: + [ + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: context.l10n.knowledgeTabToly, + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: context.l10n.knowledgeTabAlgo, + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text:context.l10n.knowledgeTabLayout, + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text:context.l10n.knowledgeTabPoint, + ), + ], + ), + ), // ) + ]; + } + + Widget? _buildItem(BuildContext context, int index) { + return ListTile( + tileColor: Colors.white, + title: Text(data[index]), + ); + } + + void _listen() { + print('${controller.index}'); + if (_curIndex != controller.index) { + setState(() { + _curIndex = controller.index; + }); + } + } +} + +class Doodle extends StatelessWidget { + const Doodle({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return RepaintBoundary( + child: CustomPaint( + painter: DoodlePainter(), + child: const Center(), + ), + ); + } +} + +class DoodlePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + Paint pen = Paint(); + pen.shader = ui.Gradient.linear( + Offset.zero, + Offset(size.width, size.height), + [const Color(0xffD3D5F5), const Color(0xffC8EBFA)], + [0, 1], + TileMode.mirror, + Matrix4.rotationZ(pi / 4).storage); + canvas.drawRect(Offset.zero & size, pen); + // print(size); + canvas.drawCircle( + Offset(size.width / 2, size.height / 2), + size.height / 6, + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/building/building_panel.dart b/modules/knowledge_system/artifact/lib/src/articles/view/building/building_panel.dart new file mode 100644 index 00000000..e4696d54 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/building/building_panel.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +class BuildingPanel extends StatelessWidget { + const BuildingPanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.add_chart,size: 36,color: Colors.grey,), + const SizedBox(height: 8,), + + Text( + context.l10n.knowledgeConstruction + ,style: TextStyle(color: Colors.grey),), + ], + ), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart new file mode 100644 index 00000000..288c21e3 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -0,0 +1,172 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:artifact/artifact.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:layout/layout.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../bloc/exp.dart'; +import '../data/exp.dart'; +import 'article/sliver_article.dart'; +import 'article/sliver_columnize.dart'; +import 'building/building_panel.dart'; +import 'package:l10n/l10n.dart'; + +class DeskKnowledgePage extends StatefulWidget { + const DeskKnowledgePage({super.key}); + + @override + State createState() => _DeskKnowledgePageState(); +} + +class _DeskKnowledgePageState extends State + with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { + late TabController controller; + List data = []; + int _curIndex = 0; + + @override + void initState() { + super.initState(); + controller = TabController(length: 3, vsync: this); + controller.addListener(_listen); + data = List.generate(5, (index) => 'Init $index'); + } + + ArticleRepository aRepository = const ArticleRepository(); + ColumnizeRepository cRepository = const ColumnizeRepository(); + + @override + Widget build(BuildContext context) { + super.build(context); + AppLocalizations l10n = context.l10n; + + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider( + create: (_) => ArticleBloc(aRepository, pageSize: 1000)..init()), + ], + child: Scaffold( + endDrawer: SortSettings(), + body: Column( + children: [ + DeskKnowledgeTabTopBar( + onTabPressed: (int value) { + controller.index = value; + }, + tabs: [ + l10n.knowledgeTabLayout, + l10n.knowledgeTabAlgo, + l10n.knowledgeTabToly, + ], + ), + Expanded( + child: TabBarView( + controller: controller, + children: [ + LayoutRouterPage(), + AlgoRouterPage(), + TolyArticlesPage(), + // DeskPointPage(), + ], + )) + ], + ), + ), + ); + } + + void _listen() { + print('${controller.index}'); + if (_curIndex != controller.index) { + setState(() { + _curIndex = controller.index; + }); + } + } + + @override + bool get wantKeepAlive => true; +} + +class TolyArticlesPage extends StatelessWidget { + const TolyArticlesPage({super.key}); + + @override + Widget build(BuildContext context) { + return CustomScrollView( + slivers: [ + SliverPadding( + padding: EdgeInsets.only(top: 10, bottom: 10, right: 36, left: 36), + sliver: const SliverToBoxAdapter( + child: ColumnizeViewPage(), + ), + ), + SliverPadding( + padding: EdgeInsets.only(right: 36, left: 36), + sliver: SliverArticlePanel(), + ), + ], + ); + } +} + +class SoreAlgoPage extends StatelessWidget { + const SoreAlgoPage({super.key}); + + @override + Widget build(BuildContext context) { + String name = SortStateScope.of(context).config.name; + + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + GestureDetector( + onTap: () { + _launchURL( + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + }, + child: Text( + '查看排序源码', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).primaryColor, + ), + )), + Spacer(), + SortButton(), + const SizedBox( + width: 12, + ), + SortSelector(), + const SizedBox( + width: 12, + ), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: Icon(Icons.settings)) + ], + ), + ), + Expanded(child: SortPaper()), + ], + ); + } + + void _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } +} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart new file mode 100644 index 00000000..89c84966 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart @@ -0,0 +1,4 @@ +export 'point_comment_bloc.dart'; +export 'point_bloc.dart'; + + diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart new file mode 100644 index 00000000..91f6d32d --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart @@ -0,0 +1,53 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../repository/api/point_api.dart'; +import 'package:equatable/equatable.dart'; +import '../data/model/issue.dart'; + +/// create by 张风捷特烈 on 2020-09-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointBloc extends Cubit { + final PointApi api; + + PointBloc(this.api) : super(const PointLoading()); + + void loadPoint() async { + emit(const PointLoading()); + ApiRet> ret = await api.getIssues(); + if(ret.failed){ + emit(PointLoadFailure(ret.msg)); + } + emit(PointLoaded(ret.data)); + } +} + +sealed class PointState extends Equatable { + const PointState(); +} + +class PointLoading extends PointState { + const PointLoading(); + + @override + List get props => []; +} + +class PointLoaded extends PointState { + final List issues; + + const PointLoaded(this.issues); + + @override + List get props => [issues]; +} + +class PointLoadFailure extends PointState { + final String error; + + const PointLoadFailure(this.error); + + @override + List get props => [error]; +} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart new file mode 100644 index 00000000..0a71207a --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart @@ -0,0 +1,75 @@ +import 'package:artifact/src/points/repository/api/point_api.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../data/model/github_model.dart'; +import 'package:equatable/equatable.dart'; + +/// create by 张风捷特烈 on 2020-09-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointCommentBloc extends Cubit { + final PointApi api = PointApiImpl(); + + PointCommentBloc() : super(const PointCommentInitial()); + + void loadPointComment(Issue point) async { + emit(PointCommentLoading(point)); + if (point.number == null) { + emit(const PointCommentLoadFailure('point_bloc id 为空')); + return; + } + ApiRet> ret = await api.getIssuesComment(point.number!); + if (ret.failed) { + emit(PointCommentLoadFailure(ret.msg)); + return; + } + final List comments = ret.data; + comments.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); + emit(PointCommentLoaded(point, comments)); + } +} + +sealed class PointCommentState extends Equatable { + const PointCommentState(); +} + +class PointCommentInitial extends PointCommentState { + const PointCommentInitial(); + + @override + List get props => []; +} + +class PointCommentLoading extends PointCommentState { + final Issue issue; + + const PointCommentLoading(this.issue); + + @override + List get props => [issue]; +} + +class PointCommentLoaded extends PointCommentState { + final Issue issue; + final List comments; + + const PointCommentLoaded(this.issue, this.comments); + + @override + List get props => [issue, comments]; + + @override + String toString() { + return 'PointCommentLoaded{issue: $issue, comments: $comments}'; + } +} + +class PointCommentLoadFailure extends PointCommentState { + final String error; + + const PointCommentLoadFailure(this.error); + + @override + List get props => [error]; +} diff --git a/modules/knowledge_system/artifact/lib/src/points/data/api/app_info.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/app_info.dart new file mode 100644 index 00000000..73201835 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/data/api/app_info.dart @@ -0,0 +1,55 @@ +import 'package:app/app.dart'; +import 'package:equatable/equatable.dart'; +import 'package:utils/utils.dart'; + +class AppInfoApi { + + static Future> getAppVersion({required String appName}) async { + String errorMsg = ""; + var result = await HttpUtil.instance + .client + .get(PathUnit.appInfo+"/$appName") + .catchError((err) { + errorMsg = err.toString(); + }); + + // 获取的数据非空且 status = true + if (result.data != null && result.data['status']) { + // 说明有数据 + if (result.data['data'] != null) { + return TaskResult.success( + data: AppInfo( + appName: result.data['data']['appName'], + appVersion: result.data['data']['appVersion'], + appUrl: result.data['data']['appUrl'], + appSize: result.data['data']['appSize'], + )); + } else { + return const TaskResult.success(data: null); + } + } + return TaskResult.error(msg: '请求错误: $errorMsg'); + } +} + +class AppInfo extends Equatable{ + final String appName; + final String appVersion; + final String appUrl; + final int appSize; + + const AppInfo({ + required this.appName, + required this.appVersion, + required this.appUrl, + required this.appSize, + }); + + @override + List get props => [appName,appVersion,appUrl,appSize]; + + @override + String toString() { + return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; + } +} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/data/api/category_api.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/category_api.dart new file mode 100644 index 00000000..df6be8fb --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/data/api/category_api.dart @@ -0,0 +1,73 @@ +import 'package:app/app.dart'; +import 'package:utils/utils.dart'; + + +/// create by 张风捷特烈 on 2021/2/24 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryApi { + static Future> uploadCategoryData( + {required String data, required String likeData}) async { + String errorMsg = ""; + + try { + var result = await HttpUtil.instance.client.post( + PathUnit.categoryDataSync, + data: {"data": data, "likeData": likeData}); + print(result.data); + if (result.data != null) { + return TaskResult.success(data:result.data['status']); + } + } catch (e) { + print(e); + errorMsg = e.toString(); + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } + + static Future> getCategoryData() async { + String errorMsg = ""; + var result = await HttpUtil.instance + .client + .get(PathUnit.categoryData) + .catchError((err) { + errorMsg =err.toString(); + + }); + + // 获取的数据非空且 status = true + if (result.data != null && result.data['status']) { + // 说明有数据 + if (result.data['data'] != null) { + return TaskResult.success(data:CategoryData.fromJson(result.data['data'])); + } else { + return const TaskResult.success(data:null); + } + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } +} + +class CategoryData{ + final int categoryDataId; + final int userId; + final String data; + final String likeData; + + CategoryData( + {required this.categoryDataId, + required this.userId, + required this.data, + required this.likeData}); + + factory CategoryData.fromJson(Map map) { + return CategoryData( + categoryDataId: map['categoryDataId'], + userId: map["userId"], + likeData: map["likeData"], + data: map["data"]); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart new file mode 100644 index 00000000..9856b9a4 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart @@ -0,0 +1,13 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; + +import '../model/github_model.dart'; +import '../model/issue.dart'; +import '../model/repository.dart'; + + +/// create by 张风捷特烈 on 2020/6/17 +/// contact me by email 1981462002@qq.com +/// 说明: + diff --git a/lib/point_system/github_model/github_model.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/github_model.dart similarity index 100% rename from lib/point_system/github_model/github_model.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/github_model.dart diff --git a/lib/point_system/github_model/github_user.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/github_user.dart similarity index 100% rename from lib/point_system/github_model/github_user.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/github_user.dart diff --git a/lib/point_system/github_model/issue.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/issue.dart similarity index 100% rename from lib/point_system/github_model/issue.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/issue.dart diff --git a/lib/point_system/github_model/issue_comment.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/issue_comment.dart similarity index 100% rename from lib/point_system/github_model/issue_comment.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/issue_comment.dart diff --git a/lib/point_system/github_model/license.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/license.dart similarity index 100% rename from lib/point_system/github_model/license.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/license.dart diff --git a/lib/point_system/github_model/repository.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/repository.dart similarity index 100% rename from lib/point_system/github_model/repository.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/repository.dart diff --git a/lib/point_system/github_model/repository_permissions.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/repository_permissions.dart similarity index 100% rename from lib/point_system/github_model/repository_permissions.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/repository_permissions.dart diff --git a/modules/knowledge_system/artifact/lib/src/points/exp.dart b/modules/knowledge_system/artifact/lib/src/points/exp.dart new file mode 100644 index 00000000..dd213594 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/exp.dart @@ -0,0 +1,8 @@ +export 'data/api/category_api.dart'; + +export 'view/desk_ui/desk_point_page.dart'; +export 'view/desk_ui/github_repo_panel.dart'; +export 'view/issues_point/issues_point_page.dart'; +export 'view/issues_point/issues_detail.dart'; + +export 'bloc/bloc.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart new file mode 100644 index 00000000..d9a4da21 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart @@ -0,0 +1,55 @@ +import 'dart:convert'; + +import '../../data/model/issue.dart'; +import '../../data/model/issue_comment.dart'; +import '../../data/model/repository.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +export 'package:fx_dio/fx_dio.dart' show ApiRet; + +abstract interface class PointApi { + /// 获取 github 中 FlutterUnit 仓库信息 + Future> getFlutterUnitRepo(); + + /// 获取 github 中 FlutterUnit 仓库 issues 列表 + Future>> getIssues(); + + Future>> getIssuesComment(int pointId); +} + +class PointApiImpl implements PointApi { + Host get unit => FxDio()(); + + @override + Future> getFlutterUnitRepo() async { + return unit.get(UnitApi.repository.path, convertor: (data) { + dynamic repoStr = data['data']['repositoryData']; + return Repository.fromJson(json.decode(repoStr)); + }); + } + + @override + Future>> getIssues( + {int page = 1, int pageSize = 100}) async { + return unit.get>( + UnitApi.point.path, + queryParameters: { + "page": page, + "pageSize": pageSize, + }, + convertor: (data) => data['data'] + .map((e) => Issue.fromJson(json.decode(e['pointData']))) + .toList(), + ); + } + + @override + Future>> getIssuesComment(int pointId) async { + return unit.get>("${UnitApi.pointComment.path}$pointId", + convertor: (data) => data['data'] + .map((e) => + IssueComment.fromJson(json.decode(e['pointCommentData']))) + .toList()); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart new file mode 100644 index 00000000..fc6563e5 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -0,0 +1,154 @@ +import 'package:app/app.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../bloc/point_bloc.dart'; +import '../../bloc/bloc.dart'; +import '../../data/model/repository.dart'; +import '../../repository/api/point_api.dart'; +import '../issues_point/issues_point_page.dart'; +import 'github_repo_panel.dart'; +import 'package:fx_dio/fx_dio.dart'; + +class DeskPointPage extends StatefulWidget { + const DeskPointPage({Key? key}) : super(key: key); + + @override + State createState() => _DeskPointPageState(); +} + +class _DeskPointPageState extends State { + Repository _repository = Repository.fromJson({ + 'full_name': 'toly1994328/FlutterUnit', + 'license': {"spdx_id": 'GPL-3.0'}, + 'description': + '【Flutter 集录指南 App】The unity of flutter, The unity of coder.', + 'stargazers_count': 7958, + 'forks_count': 1039, + 'subscribers_count': 126, + 'open_issues_count': 40, + }); + + final PointApi _api = PointApiImpl(); + + @override + void initState() { + super.initState(); + _loadRepo(); + } + + void _loadRepo() async { + final ApiRet ret = await _api.getFlutterUnitRepo(); + if (ret.success) { + setState(() { + _repository = ret.data; + }); + } + } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => PointBloc(_api)..loadPoint(), + child: Scaffold( + body: Column( + children: [ + Expanded( + child: Row( + children: [ + Column( + children: [ + GithubRepoPanel( + repository: _repository, + ), + Expanded(child: SizedBox(width: 250, child: IssuesTip())) + ], + ), + VerticalDivider( + width: 1, + ), + Expanded(flex: 2, child: IssuesPointContent()), + ], + )) + ], + ), + ), + ); + } +} + +class IssuesTip extends StatelessWidget { + const IssuesTip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text.rich( + TextSpan(children: [ + TextSpan( + text: '* 注: ', + style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold)), + TextSpan( + text: + '要点集录中的 QA 数据收录在 FlutterUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'), + TextSpan( + text: '点击这里跳转', + mouseCursor: SystemMouseCursors.click, + recognizer: TapGestureRecognizer()..onTap = _toUrl, + style: TextStyle( + color: Colors.blue, + decoration: TextDecoration.underline, + fontWeight: FontWeight.bold)), + ]), + style: TextStyle(fontSize: 14), + ), + ); + } + + void _toUrl() async { + String url = + 'https://github.com/toly1994328/FlutterUnit/issues?q=label%3Apoint+'; + if (!await launchUrl(Uri.parse(url))) { + throw Exception('Could not launch $url'); + } + } +} + +class SimpleDeskTopBar extends StatelessWidget { + final Widget? leading; + final Widget? tail; + final double height; + + const SimpleDeskTopBar( + {super.key, this.leading, this.tail, this.height = 64}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Container( + height: height, + color: isDark ? Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + if (leading != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), + const Spacer(), + const SizedBox( + width: 20, + ), + if (tail != null) tail!, + const WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/lib/point_system/views/desk_ui/github_repo_panel.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart similarity index 96% rename from lib/point_system/views/desk_ui/github_repo_panel.dart rename to modules/knowledge_system/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart index d36e9a81..910586e1 100644 --- a/lib/point_system/views/desk_ui/github_repo_panel.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart @@ -1,8 +1,9 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/components.dart'; +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import '../../github_model/repository.dart'; +import '../../data/model/repository.dart'; + class GithubRepoPanel extends StatefulWidget { final Repository repository; @@ -29,7 +30,7 @@ class _GithubRepoPanelState extends State { boxShadow: [ BoxShadow(color: Colors.black.withOpacity(0.1), offset: Offset(0, .5), blurRadius: 3) ], - color: Colors.white, + color:Theme.of(context).listTileTheme.tileColor, borderRadius: BorderRadius.circular(8)), child: Column( mainAxisSize: MainAxisSize.min, @@ -80,6 +81,7 @@ class _GithubRepoPanelState extends State { ), ), const Divider(), + const SizedBox(height: 8,), DefaultTextStyle( style: TextStyle(fontSize: 12,color: Theme.of(context).primaryColor), child: Row( diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart new file mode 100644 index 00000000..de2aaded --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart @@ -0,0 +1,103 @@ +import 'dart:ui'; + +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:utils/utils.dart'; + +import '../../data/model/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +class IssueItem extends StatelessWidget { + final Issue issue; + final ValueChanged onTap; + + const IssueItem({ + super.key, + required this.issue, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () => onTap(issue), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerTheme.color ?? Colors.transparent, + width: 1 / window.devicePixelRatio)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTop(), + Padding( + padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), + child: Text( + '${issue.title}', + style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ + Shadow(color: isDark ? Colors.black : Colors.white, offset: Offset(1, .5)) + ]), + ), + ), + Row( + children: [ + const Spacer(), + WrapColor( + color: Colors.greenAccent, + child: Text( + issue.commentNum.toString(), + style: const TextStyle(color: Colors.white), + )), + const SizedBox( + width: 5, + ), + const Icon( + TolyIcon.icon_common, + size: 20, + ), + ], + ) + ], + ), + ), + ); + } + + Widget _buildTop() { + return Row( + children: [ + CircleImage( + image: NetworkImage(issue.user?.avatarUrl ?? ''), + size: 40, + borderSize: 2, + ), + const SizedBox( + width: 10, + ), + WrapColor( + child: Text( + "#${issue.number}", + style: const TextStyle(color: Colors.white), + )), + const SizedBox( + width: 10, + ), + Text( + '${issue.user?.login}', + style: const TextStyle(fontWeight: FontWeight.bold), + ), + const Spacer(), + Text(ConvertMan.time2string(issue.createdAt!)), + ], + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart new file mode 100644 index 00000000..0338d57e --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart @@ -0,0 +1,196 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:utils/utils.dart'; + +import '../../bloc/bloc.dart'; +import '../../data/model/github_model.dart'; +import '../../data/model/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +class IssuesDetailPage extends StatelessWidget { + const IssuesDetailPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: PreferredSize( + preferredSize: Size(0,kToolbarHeight), + child: DragToMoveWrapper( + child: AppBar( + centerTitle: false, + title: const Text('Flutter 要点集录'), + ), + ), + ), + body: BlocBuilder( + builder: _buildContent), + ); + } + + Widget _buildContent(BuildContext context, PointCommentState state) { + if (state is PointCommentLoading) { + return IssueTitle(issue: state.issue); + } + + if (state is PointCommentLoaded) { + return CustomScrollView( + slivers: [ + SliverToBoxAdapter(child: IssueTitle(issue: state.issue)), + SliverList( + delegate: SliverChildBuilderDelegate( + (ctx, int index) => IssueCommentWidget( + comment: state.comments[index], + ), + childCount: state.comments.length), + ) + ], + ); + } + + return Container(); + } +} + +class IssueTitle extends StatelessWidget { + final Issue issue; + + const IssueTitle({Key? key, required this.issue}) : super(key: key); + + String get issueDesHtml => issue.bodyHtml != null + ? issue.bodyHtml! + : (issue.body != null) + ? issue.body! + : ""; + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return SingleChildScrollView( + child: Column( + children: [ + Row( + children: [ + Flexible( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Panel( + color: isDark?Colors.transparent:null, + child: Text( + + '${issue.title}', + maxLines: 1, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold), + )), + ), + ), + WrapColor( + child: Text( + '#${issue.number}', + style: const TextStyle(color: Colors.white), + ), + ) + ], + ), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0,vertical: 8), + child: WrapColor( + color: Colors.blue.withAlpha(22), + child: ListTile( + dense: true, + leading: CircleImage( + size: 40, + borderSize: 1, + image: NetworkImage(issue.user!.avatarUrl!), + ), + title: Text(issue.user!.login!), + subtitle: Row( + children: [ + Text('创建于:${ConvertMan.time2string(issue.createdAt!)}'), + const Spacer(), + WrapColor( + color: Colors.green, + child: Text( + '更新于:${ConvertMan.time2string(issue.updatedAt!)}', + style: const TextStyle(color: Colors.white), + )), + ], + ), + ), + ), + ), + + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0,horizontal: 20), + child: MarkdownWidget( + markdownData: issueDesHtml, + style: isDark?MarkdownWidget.kDarkLight:MarkdownWidget.kWhite), + ), + const Divider( + thickness: 2, + ) + ], + ), + ); + } +} + +class IssueCommentWidget extends StatelessWidget { + final IssueComment comment; + + const IssueCommentWidget({Key? key, required this.comment}) : super(key: key); + + String get issueDesHtml => comment.bodyHtml != null + ? comment.bodyHtml! + : (comment.body != null) + ? comment.body! + : ""; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: WrapColor( + color: Colors.blue.withAlpha(22), + child: ListTile( + dense: true, + leading: CircleImage( + size: 40, + borderSize: 1, + image: NetworkImage(comment.user!.avatarUrl!), + ), + title: Text(comment.user!.login!), + subtitle: Row( + children: [ + Text('创建于:${ConvertMan.time2string(comment.createdAt!)}'), + const Spacer(), + WrapColor( + color: Colors.green, + child: Text( + '更新于:${ConvertMan.time2string(comment.updatedAt!)}', + style: const TextStyle(color: Colors.white), + )), + ], + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MarkdownWidget( + markdownData: issueDesHtml, style: MarkdownWidget.kWhite), + ), + const Divider(thickness: 2) + ], + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart new file mode 100644 index 00000000..99f19db1 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart @@ -0,0 +1,170 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; + +import '../../bloc/bloc.dart'; +import '../../data/model/issue.dart'; +import '../../data/model/repository.dart'; +import '../../repository/api/point_api.dart'; +import 'issue_item.dart'; +import 'issues_detail.dart'; +import 'repo_widget.dart'; + +/// create by 张风捷特烈 on 2020/6/17 +/// contact me by email 1981462002@qq.com +/// 说明: + +class IssuesPointScope extends StatelessWidget { + const IssuesPointScope({super.key}); + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (_) => PointBloc(PointApiImpl())..loadPoint()), + ], + child: const IssuesPointPage(), + ); + } +} + +class IssuesPointPage extends StatelessWidget { + const IssuesPointPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold(body: IssuesPointContent()); + } +} + +class IssuesPointContent extends StatefulWidget { + const IssuesPointContent({super.key}); + + @override + State createState() => _IssuesPointContentState(); +} + +class _IssuesPointContentState extends State { + Repository? _repository; + + @override + void initState() { + super.initState(); + _loadRepo(); + } + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (_, state) => RefreshIndicator( + onRefresh: _loadIssues, + child: CustomScrollView(slivers: [ + // _buildSliverAppBar(), + buildContentByState(state) + ]), + )); + } + + Widget buildContentByState(PointState state) { + if (state is PointLoading) { + return const SliverPadding( + padding: EdgeInsets.only(top: 150), + sliver: SliverToBoxAdapter( + child: Center( + child: SpinKitCircle( + color: Colors.blue, + ), + )), + ); + } + + if (state is PointLoaded) { + List issues = state.issues; + return SliverList( + delegate: SliverChildBuilderDelegate( + (ctx, int index) => + IssueItem(onTap: toDetailPage, issue: issues[index]), + childCount: issues.length, + ), + ); + } + + if (state is PointLoadFailure) { + return SliverPadding( + padding: const EdgeInsets.only(top: 40), + sliver: SliverToBoxAdapter( + child: Center( + child: Text(state.error), + )), + ); + } + + return const SliverPadding( + padding: EdgeInsets.zero, + ); + } + + void toDetailPage(Issue issue) { + Navigator.of(context).push( + SlidePageRoute( + child: BlocProvider( + create: (_) => PointCommentBloc()..loadPointComment(issue), + child: const IssuesDetailPage(), + ), + ), + ); + } + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 210.0, +// leading: _buildLeading(), + title: const Text('Flutter要点集录'), +// actions: _buildActions(), + elevation: 5, + pinned: true, + actions: [ + IconButton( + icon: const Icon( + Icons.help_outline, + color: Colors.white, + ), + onPressed: () { + // Navigator.of(context).pushNamed(UnitRouter.bug); + }) + ], + backgroundColor: Colors.blue, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: _repository == null + ? const Center( + child: SpinKitFadingCube( + color: Colors.white, + ), + ) + : RepoWidget( + repository: _repository!, + ), + ), + ); + } + + Future _loadIssues() async { + BlocProvider.of(context).loadPoint(); + await Future.delayed(const Duration(milliseconds: 200)); + } + + void _loadRepo() async { + PointApi api = context.read().api; + final ApiRet ret = await api.getFlutterUnitRepo(); + if (ret.success) { + setState(() { + _repository = ret.data; + }); + } + } +} diff --git a/lib/point_system/views/issues_point/repo_widget.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/repo_widget.dart similarity index 92% rename from lib/point_system/views/issues_point/repo_widget.dart rename to modules/knowledge_system/artifact/lib/src/points/view/issues_point/repo_widget.dart index 16c81151..36849e1b 100644 --- a/lib/point_system/views/issues_point/repo_widget.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/repo_widget.dart @@ -1,9 +1,9 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import 'package:utils/utils.dart'; +import '../../data/model/repository.dart'; /// create by 张风捷特烈 on 2020/9/3 /// contact me by email 1981462002@qq.com @@ -52,8 +52,7 @@ class RepoWidget extends StatelessWidget { ), const Spacer(), Text( - "创建:" + - ConvertMan.time2string(repository.createdAt!, just: true), + "创建:${ConvertMan.time2string(repository.createdAt!, just: true)}", style: const TextStyle(color: Colors.grey), ), ], diff --git a/modules/knowledge_system/artifact/pubspec.yaml b/modules/knowledge_system/artifact/pubspec.yaml new file mode 100644 index 00000000..96c3113b --- /dev/null +++ b/modules/knowledge_system/artifact/pubspec.yaml @@ -0,0 +1,50 @@ +name: artifact +description: artifact +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=2.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/knowledge_system/artifact/test/utils_test.dart b/modules/knowledge_system/artifact/test/utils_test.dart new file mode 100644 index 00000000..ba04b36e --- /dev/null +++ b/modules/knowledge_system/artifact/test/utils_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + +} diff --git a/modules/knowledge_system/awesome/.gitignore b/modules/knowledge_system/awesome/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/knowledge_system/awesome/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/knowledge_system/awesome/.metadata b/modules/knowledge_system/awesome/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/modules/knowledge_system/awesome/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/modules/knowledge_system/awesome/CHANGELOG.md b/modules/knowledge_system/awesome/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/knowledge_system/awesome/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/knowledge_system/awesome/LICENSE b/modules/knowledge_system/awesome/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/knowledge_system/awesome/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/knowledge_system/awesome/README.md b/modules/knowledge_system/awesome/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/knowledge_system/awesome/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/knowledge_system/awesome/analysis_options.yaml b/modules/knowledge_system/awesome/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/knowledge_system/awesome/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/knowledge_system/awesome/lib/awesome.dart b/modules/knowledge_system/awesome/lib/awesome.dart new file mode 100644 index 00000000..d19ac097 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/awesome.dart @@ -0,0 +1,7 @@ +library awesome; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/main.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/main.dart new file mode 100644 index 00000000..23c687f4 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/main.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +import 'page/home/home_page.dart'; + +void main(){ + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const ChangeNotifierHome01(), + ); + } +} + + + + + + + diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart new file mode 100644 index 00000000..97f90260 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +ProgressValueNotifier progress = ProgressValueNotifier(); + +class ProgressValueNotifier with ChangeNotifier{ + + double _value = 0; + + double get value =>_value; + + String get valueStr => '${(value*100).toStringAsFixed(1)}%'; + + set value(double value){ + _value = value.clamp(0, 1); + notifyListeners(); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart new file mode 100644 index 00000000..39cd9220 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart @@ -0,0 +1,49 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/progress_value_notifier.dart'; + +class DetailProgressView extends StatefulWidget { + + const DetailProgressView({super.key}); + + @override + State createState() => _DetailProgressViewState(); +} + +class _DetailProgressViewState extends State { + + @override + void initState() { + super.initState(); + progress.addListener(_update); + } + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 200, + height: 50, + child: LinearProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr,style: TextStyle(color: Colors.white),) + ], + ); + } + + void _update() { + setState(() {}); + } + + @override + void dispose() { + progress.removeListener(_update); + super.dispose(); + } +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart new file mode 100644 index 00000000..212edbc1 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +import 'detail_progress_view.dart'; + +class DownloadDetailPage extends StatelessWidget { + const DownloadDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('下载详情页'), + ), + body: Center(child: DetailProgressView()), + ); + } +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart new file mode 100644 index 00000000..e2fc4ab3 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import '../../notifier/progress_value_notifier.dart'; +import '../detail/download_detail.dart'; +import 'home_progress_view.dart'; + +class ChangeNotifierHome01 extends StatefulWidget { + const ChangeNotifierHome01({super.key}); + + @override + State createState() => _ChangeNotifierHome01State(); +} + +class _ChangeNotifierHome01State extends State { + + TextEditingController c = TextEditingController(); + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: FloatingActionButton( + onPressed: _startTimer, + child: const Icon(Icons.restart_alt), + ), + appBar: AppBar( + title: const Text('下载进度通知模拟'), + actions: [ + IconButton(onPressed: (){ + Navigator.of(context).push(MaterialPageRoute(builder: (_)=>const DownloadDetailPage())); + }, icon: const Icon(Icons.info_outline)) + ], + ), + body: const Center(child: HomeProgressView()), + ); + } + + Timer? _timer; + + void _startTimer(){ + if(_timer!=null) return; + if(progress.value==1.0){ + progress.value=0; + } + print("======${progress.value==1.0}======"); + _timer = Timer.periodic(const Duration(milliseconds: 200),_updateProgress); + } + + + void _updateProgress(Timer timer) { + if(progress.value>=1.0){ + timer.cancel(); + _timer = null; + return; + } + progress.value += 0.01; + } +} + diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart new file mode 100644 index 00000000..555ef740 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart @@ -0,0 +1,49 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/progress_value_notifier.dart'; + +class HomeProgressView extends StatefulWidget { + + const HomeProgressView({super.key}); + + @override + State createState() => _HomeProgressViewState(); +} + +class _HomeProgressViewState extends State { + + @override + void initState() { + super.initState(); + progress.addListener(_update); + } + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 100, + height: 100, + child: CircularProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr) + ], + ); + } + + void _update() { + setState(() {}); + } + + @override + void dispose() { + progress.removeListener(_update); + super.dispose(); + } +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/main.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/main.dart new file mode 100644 index 00000000..5b807aa8 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/main.dart @@ -0,0 +1,32 @@ + +import 'package:flutter/material.dart'; + +import 'notifier/download_data_scope.dart'; +import 'notifier/progress_value_notifier.dart'; +import 'page/home/home_page.dart'; + +class MyApp extends StatelessWidget{ + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return DownloadDataScope( + notifier: ProgressValueNotifier(), + child: MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const ChangeNotifierHome02(), + ), + ); + } +} + + + + + + + diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart new file mode 100644 index 00000000..770756cf --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; + +import 'progress_value_notifier.dart'; + +class DownloadDataScope extends InheritedNotifier{ + + const DownloadDataScope({super.key, required super.child,super.notifier}); + + static ProgressValueNotifier of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType()!.notifier!; + } + + static ProgressValueNotifier read(BuildContext context) { + return context.getInheritedWidgetOfExactType()!.notifier!; + } +} \ No newline at end of file diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart new file mode 100644 index 00000000..113b6894 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class ProgressValueNotifier with ChangeNotifier{ + + double _value = 0; + + double get value =>_value; + + String get valueStr => '${(value*100).toStringAsFixed(1)}%'; + + set value(double value){ + _value = value.clamp(0, 1); + notifyListeners(); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart new file mode 100644 index 00000000..6395b1ff --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart @@ -0,0 +1,28 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/download_data_scope.dart'; +import '../../notifier/progress_value_notifier.dart'; + +class DetailProgressView extends StatelessWidget{ + const DetailProgressView({super.key}); + + @override + Widget build(BuildContext context) { + ProgressValueNotifier progress = DownloadDataScope.of(context); + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 200, + height: 50, + child: LinearProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr,style: TextStyle(color: Colors.white),) + ], + ); + } +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart new file mode 100644 index 00000000..212edbc1 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +import 'detail_progress_view.dart'; + +class DownloadDetailPage extends StatelessWidget { + const DownloadDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('下载详情页'), + ), + body: Center(child: DetailProgressView()), + ); + } +} diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart new file mode 100644 index 00000000..dd17c937 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart @@ -0,0 +1,61 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import '../../notifier/download_data_scope.dart'; +import '../../notifier/progress_value_notifier.dart'; +import '../detail/download_detail.dart'; +import 'home_progress_view.dart'; + +class ChangeNotifierHome02 extends StatefulWidget { + const ChangeNotifierHome02({super.key}); + + @override + State createState() => _ChangeNotifierHome02State(); +} + +class _ChangeNotifierHome02State extends State { + + TextEditingController c = TextEditingController(); + @override + Widget build(BuildContext context) { + print("=========_ChangeNotifierHome02State#build==========="); + return Scaffold( + floatingActionButton: FloatingActionButton( + onPressed: _startTimer, + child: const Icon(Icons.restart_alt), + ), + appBar: AppBar( + title: const Text('下载进度通知模拟'), + actions: [ + IconButton(onPressed: (){ + Navigator.of(context).push(MaterialPageRoute(builder: (_)=>const DownloadDetailPage())); + }, icon: const Icon(Icons.info_outline)) + ], + ), + body: const Center(child: HomeProgressView()), + ); + } + + Timer? _timer; + + ProgressValueNotifier get progress => DownloadDataScope.read(context); + + void _startTimer(){ + if(_timer!=null) return; + if(progress.value==1.0){ + progress.value=0; + } + _timer = Timer.periodic(const Duration(milliseconds: 200),_updateProgress); + } + + + void _updateProgress(Timer timer) { + if(progress.value>=1.0){ + timer.cancel(); + _timer = null; + return; + } + progress.value += 0.01; + } +} + diff --git a/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart new file mode 100644 index 00000000..96d73da5 --- /dev/null +++ b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart @@ -0,0 +1,32 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/download_data_scope.dart'; +import '../../notifier/progress_value_notifier.dart'; + +class HomeProgressView extends StatelessWidget{ + const HomeProgressView({super.key}); + + + @override + Widget build(BuildContext context) { + ProgressValueNotifier progress = DownloadDataScope.of(context); + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 100, + height: 100, + child: CircularProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr) + ], + ); + } + + + +} diff --git a/modules/knowledge_system/awesome/pubspec.yaml b/modules/knowledge_system/awesome/pubspec.yaml new file mode 100644 index 00000000..2c13654f --- /dev/null +++ b/modules/knowledge_system/awesome/pubspec.yaml @@ -0,0 +1,50 @@ +name: awesome +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/knowledge_system/awesome/test/awesome_test.dart b/modules/knowledge_system/awesome/test/awesome_test.dart new file mode 100644 index 00000000..40896d37 --- /dev/null +++ b/modules/knowledge_system/awesome/test/awesome_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:awesome/awesome.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +} diff --git a/modules/knowledge_system/layout/.gitignore b/modules/knowledge_system/layout/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/knowledge_system/layout/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/knowledge_system/layout/.metadata b/modules/knowledge_system/layout/.metadata new file mode 100644 index 00000000..2b377030 --- /dev/null +++ b/modules/knowledge_system/layout/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "7482962148e8d758338d8a28f589f317e1e42ba4" + channel: "stable" + +project_type: package diff --git a/modules/knowledge_system/layout/CHANGELOG.md b/modules/knowledge_system/layout/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/knowledge_system/layout/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/knowledge_system/layout/LICENSE b/modules/knowledge_system/layout/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/knowledge_system/layout/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/knowledge_system/layout/README.md b/modules/knowledge_system/layout/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/knowledge_system/layout/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/knowledge_system/layout/analysis_options.yaml b/modules/knowledge_system/layout/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/knowledge_system/layout/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/knowledge_system/layout/lib/layout.dart b/modules/knowledge_system/layout/lib/layout.dart new file mode 100644 index 00000000..bc7cbf6d --- /dev/null +++ b/modules/knowledge_system/layout/lib/layout.dart @@ -0,0 +1,3 @@ +library layout; + +export 'src/views/layout_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/bloc/display_logic.dart b/modules/knowledge_system/layout/lib/src/bloc/display_logic.dart new file mode 100644 index 00000000..110c1da8 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/bloc/display_logic.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +import '../data/display_map/display_map.dart'; +import '../data/model/display_frame.dart'; +import 'display_state.dart'; + +class DisplayLogic with ChangeNotifier { + DisplayLogic(this._state); + + DisplayState _state; + + DisplayState get state => _state; + + bool get enableNext => _state.activeIndex < _state.total - 1; + + bool get enablePrev => _state.activeIndex > 0; + + void nextPage() { + if (enableNext) { + _state = _state.copyWith(activeIndex: _state.activeIndex + 1); + notifyListeners(); + } + } + + void active(String path) { + if (path != _state.router) { + int length = kDisplayMap[path]!.length; + _state = DisplayState( + router: path, + activeIndex: 0, + total: length, + ); + notifyListeners(); + } + } + + void prevPage() { + if (enablePrev) { + _state = _state.copyWith(activeIndex: _state.activeIndex - 1); + notifyListeners(); + } + } +} + +class DisplayScope extends InheritedNotifier { + const DisplayScope({ + required super.notifier, + required super.child, + super.key, + }); + + static DisplayLogic of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; +} diff --git a/modules/knowledge_system/layout/lib/src/bloc/display_state.dart b/modules/knowledge_system/layout/lib/src/bloc/display_state.dart new file mode 100644 index 00000000..dddb24d1 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/bloc/display_state.dart @@ -0,0 +1,30 @@ +import 'package:layout/src/data/model/display_frame.dart'; + +import '../data/display_map/display_map.dart'; + +class DisplayState { + final String router; + final int activeIndex; + final int total; + + DisplayState({ + required this.router, + required this.activeIndex, + required this.total, + }); + + DisplayFrame get frame { + return kDisplayMap[router]![activeIndex]; + } + + DisplayState copyWith({ + int? total, + int? activeIndex, + String? router, + }) => + DisplayState( + router: router ?? this.router, + activeIndex: activeIndex ?? this.activeIndex, + total: total ?? this.total, + ); +} diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/base.dart b/modules/knowledge_system/layout/lib/src/data/display_map/base.dart new file mode 100644 index 00000000..aed62764 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/data/display_map/base.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/positioned/positioned_show.dart'; + +import '../../views/base/align/align_show.dart'; +import '../../views/base/align/align_show2.dart'; +import '../../views/base/padding/inner_padding.dart'; +import '../../views/base/padding/outer_padding.dart'; +import '../../views/base/padding/sizedbox_padding.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../model/display_frame.dart'; + +List get baseSize => [ + DisplayFrame( + title: '父级中的紧约束', + desc: "当前虽然指定 SizeBox 宽高为 150*100。但由于父级的紧约束被强制固定尺寸。" + "下一步,将父级的紧约束改为宽松约束。", + src: '', + display: (BuildContext context) => const SizeTightConstraint( + info: "受到紧约束\n尺寸无法生效", + ), + ), + DisplayFrame( + title: '用布局组件放宽父级约束', + desc: + "通过嵌套 Align、Row、Column、Flex、Scaffold 等组件, 提供一个宽松的父级约束,让 SizeBox 指定的尺寸可以生效" + "就可以生效。", + src: '', + display: (BuildContext context) => const LossDisplay(), + ), + DisplayFrame( + title: '用 UnconstrainedBox 组件解除约束', + desc: "通过嵌套 UnconstrainedBox 组件,可以解除之前父级对当前区域的约束,从而使指定尺寸生效。", + src: '', + display: (BuildContext context) => const SizeUnconstrain(), + ), + ]; + +List get basePadding => [ + DisplayFrame( + title: 'Padding 实现内边距', + desc: "将色块区域视为边界,文字距离边界有一定的内边距。", + src: '', + display: (BuildContext context) => const InnerPadding(), + ), + DisplayFrame( + title: 'Padding 实现外边距', + desc: + "两个色块区域之间,右侧可以通过 Padding 嵌套,距离外部有边距。Container 的 margin 属性就是这个原理。", + src: '', + display: (BuildContext context) => const OuterPadding(), + ), + DisplayFrame( + title: 'SizedBox 实现边距', + desc: + "有时在行列布局中,可以通过空白的 SizedBox 组件进行站位,来简单地实现边距效果。", + src: '', + display: (BuildContext context) => const SizedBoxPadding(), + ), +]; + +List get baseAlign => [ + DisplayFrame( + title: 'Align 组件实现对齐', + desc: "Align 组件可以在自身区域内(示例中灰色),对子组件(蓝色)进行对齐定位。", + src: '', + display: (BuildContext context) => const AlignShow(), + ), + DisplayFrame( + title: 'Align 实现 sin 排布', + desc: "由于Alignment对象可指定在父容器中宽高的分率位置,可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置。", + src: '', + display: (BuildContext context) => const AlignShow2(), + ), +]; + +List get basePostioned => [ + DisplayFrame( + title: 'Positioned 组件实现定位', + desc: "Positioned 组件可以在 Stack 组件内,对子组件指定位置(左上右下)进行定位布局。", + src: '', + display: (BuildContext context) => const PositionedShow(), + ), +]; \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart new file mode 100644 index 00000000..7ed67338 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../../views/popable/autocomplete_demo.dart'; +import '../../views/popable/dropdown_button_demo.dart'; +import '../../views/popable/dropdown_menu_demo.dart'; +import '../model/display_frame.dart'; +import 'base.dart'; +import 'funny.dart'; +import 'multi.dart'; + +Map> get kDisplayMap => { + '/base/size': baseSize, + '/base/padding': basePadding, + '/base/align': baseAlign, + '/base/positioned': basePostioned, + + '/multi/flex': multiFlex, + '/multi/wrap': multiWrap, + '/multi/stack': multiStack, + + '/scroll/list': listView, + '/scroll/grid': gridView, + '/scroll/page': pageView, + + '/funny/elevator':funnyElevator, + + // '/popable/DropdownButton': [ + // DisplayFrame( + // title: '下拉按钮 DropdownButton', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const CustomDropDownButton(), + // ), + // ], + // '/popable/DropdownMenu': [ + // DisplayFrame( + // title: '下拉按钮 DropdownMenu', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const DropdownMenuNode1(), + // ), + // ], + // '/popable/Autocomplete': [ + // DisplayFrame( + // title: '自动填充 Autocomplete', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const AutocompleteDemo(), + // ), + // ], +}; \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/funny.dart b/modules/knowledge_system/layout/lib/src/data/display_map/funny.dart new file mode 100644 index 00000000..5df2be11 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/data/display_map/funny.dart @@ -0,0 +1,21 @@ +// Copyright 2014 The 星星 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-07-02 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +import '../../views/interest/elevator/elevator.dart'; +import '../model/display_frame.dart'; + +List get funnyElevator => [ + DisplayFrame( + title: '电梯布局', + desc: "模拟完成电梯的运行。", + src: '', + display: (BuildContext context) => ElevatorRoom(), + ), +]; diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart new file mode 100644 index 00000000..e16a2022 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/positioned/positioned_show.dart'; +import 'package:layout/src/views/playground/view/stack/stack_playground.dart'; + +import '../../views/base/align/align_show.dart'; +import '../../views/base/align/align_show2.dart'; +import '../../views/base/padding/inner_padding.dart'; +import '../../views/base/padding/outer_padding.dart'; +import '../../views/base/padding/sizedbox_padding.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../../views/multi/flex/column_show.dart'; +import '../../views/playground/view/flex/flex_playground.dart'; +import '../../views/multi/flex/row_show.dart'; +import '../../views/playground/view/wrap/wrap_playground.dart'; +import '../../views/scroll/grid_view/grid_view_demo01.dart'; +import '../../views/scroll/list_view/list_view_demo01.dart'; +import '../../views/scroll/page_view/page_view_demo01.dart'; +import '../model/display_frame.dart'; + +List get multiFlex => [ + DisplayFrame( + title: 'Flex PlayGround', + desc: "在 Flex PlayGround 中,你可以通过交互来直观体验 Flex 布局特性。灰色是 Flex 布局区域。", + src: '', + display: (BuildContext context) => const FlexPlayground(), + ), + DisplayFrame( + title: 'Row 组件横向排列', + desc: "可以将若干个组件横向排列,区域宽度无上限约束,子组件总宽超过时会越界异常。详细布局特性见第三页: Flex PlayGround", + src: '', + display: (BuildContext context) => const RowShow(), + ), + DisplayFrame( + title: 'Column 组件横向排列', + desc: "可以将若干个组件竖向排列,区域高度无上限约束,子组件总高超过时会越界异常。详细布局特性见第三页: Flex PlayGround", + src: '', + display: (BuildContext context) => const ColumnShow(), + ), + ]; + +List get multiWrap => [ + DisplayFrame( + title: 'Wrap PlayGround', + desc: "在 Wrap PlayGround 中,你可以通过交互来直观体验 Wrap 布局特性。", + src: '', + display: (BuildContext context) => WrapPlayground(), + ), + ]; + +List get multiStack => [ + DisplayFrame( + title: 'Stack PlayGround', + desc: "在 Stack PlayGround 中,你可以通过交互来直观体验 Stack 布局特性。", + src: '', + display: (BuildContext context) => StackPlayground(), + ), +]; + +List get listView => [ + DisplayFrame( + title: 'ListView 滑动列表', + desc: "通过 ListView.builder 构造,可以实现按需加载的滑动视图。", + src: '', + display: (BuildContext context) => ListViewDemo01(), + ), +]; + +List get gridView => [ + DisplayFrame( + title: 'GridView 滑动网格', + desc: "通过 GridView.builder 构造,可以实现按需加载的网格滑动视图。", + src: '', + display: (BuildContext context) => GridViewDemo01(), + ), +]; + +List get pageView => [ + DisplayFrame( + title: 'PageView 滑动界面', + desc: "通过 GridView.builder 构造,可以实现按需加载的网格滑动视图。", + src: '', + display: (BuildContext context) => PageViewDemo01(), + ), +]; diff --git a/modules/knowledge_system/layout/lib/src/data/model/display_frame.dart b/modules/knowledge_system/layout/lib/src/data/model/display_frame.dart new file mode 100644 index 00000000..b6741c8a --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/data/model/display_frame.dart @@ -0,0 +1,24 @@ +import 'package:flutter/cupertino.dart'; + +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../../views/popable/autocomplete_demo.dart'; +import '../../views/popable/dropdown_button_demo.dart'; +import '../../views/popable/dropdown_menu_demo.dart'; + +class DisplayFrame { + final String title; + final String desc; + final String src; + final WidgetBuilder display; + + DisplayFrame({ + required this.title, + required this.desc, + required this.src, + required this.display, + }); +} + + diff --git a/modules/knowledge_system/layout/lib/src/ext/go_router/listener.dart b/modules/knowledge_system/layout/lib/src/ext/go_router/listener.dart new file mode 100644 index 00000000..d0db8c4c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/ext/go_router/listener.dart @@ -0,0 +1,36 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +mixin RouterChangeListenerMixin on State { + late GoRouterDelegate _delegate; + + String get path => '/${_delegate.currentConfiguration.matches.last.matchedLocation}'; + + @override + void initState() { + super.initState(); + _delegate = GoRouter.of(context).routerDelegate; + _delegate.addListener(_onChange); + } + + @override + void dispose() { + _delegate.removeListener(_onChange); + super.dispose(); + } + + void _onChange() { + RouteMatchBase match = _delegate.currentConfiguration.matches.last; + onChangeRoute("/${match.matchedLocation}"); + } + + void onChangeRoute(String path); +} diff --git a/modules/knowledge_system/layout/lib/src/ext/go_router/path.dart b/modules/knowledge_system/layout/lib/src/ext/go_router/path.dart new file mode 100644 index 00000000..89442b5f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/ext/go_router/path.dart @@ -0,0 +1,14 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:go_router/go_router.dart'; + +extension GoRouterPath on GoRouter{ + String get path => '/${routerDelegate.currentConfiguration.matches.last.matchedLocation}'; +} + diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/base_layout.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/base_layout.dart new file mode 100644 index 00000000..df3f5da7 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/base_layout.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get baseMenus => { + 'path': '/base', + 'icon': Icons.layers_rounded, + 'label': '基本布局', + 'children': [ + { + 'path': '/size', + 'label': '布局尺寸', + }, + { + 'path': '/padding', + 'label': '布局边距', + }, + { + 'path': '/align', + 'label': '布局对齐', + }, + { + 'path': '/positioned', + 'label': '布局定位', + }, + ] + }; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/funny.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/funny.dart new file mode 100644 index 00000000..028a6cb7 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/funny.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +// import 'package:iroute/app/res/fx_icon.dart'; +// { +// 'path': '/expanded', +// 'label': '延展布局', +// // 'icon': Icons.text_fields, +// }, +// { +// 'path': '/holy', +// 'label': '圣杯布局', +// // 'icon': Icons.text_fields, +// }, +Map get funnyMenus => { + 'path': '/funny', + 'icon': Icons.multitrack_audio, + 'label': '趣味布局', + 'children': [ + { + 'path': '/elevator', + 'label': '电梯布局', + }, + + ] + }; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/layout.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/layout.dart new file mode 100644 index 00000000..501a56e6 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/layout.dart @@ -0,0 +1,23 @@ + +// import '../../../app/res/fx_icon.dart'; + +import 'package:flutter/material.dart'; + +Map home = { + 'path': '/home', + 'label': '布局总览', + 'icon': Icons.dashboard + + // 'children': [ + // { + // 'icon': Icons.home, + // 'path': '/home', + // 'label': '首页', + // }, + // { + // 'path': '/collect', + // 'label': '我的收藏', + // 'icon': Icons.collections_bookmark_outlined, + // }, + // ], +}; \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/menu_repository_impl.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/menu_repository_impl.dart new file mode 100644 index 00000000..3608b305 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -0,0 +1,15 @@ +import 'base_layout.dart'; +import 'funny.dart'; +import 'scroll.dart'; +import 'layout.dart'; +import 'multi.dart'; + +Map get layoutMenus => { + 'children': [ + home, + baseMenus, + multiMenus, + calcMenus, + funnyMenus, + ] + }; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/multi.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/multi.dart new file mode 100644 index 00000000..bccec3a3 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/multi.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +// import 'package:iroute/app/res/fx_icon.dart'; +// { +// 'path': '/expanded', +// 'label': '延展布局', +// // 'icon': Icons.text_fields, +// }, +// { +// 'path': '/holy', +// 'label': '圣杯布局', +// // 'icon': Icons.text_fields, +// }, +Map get multiMenus => { + 'path': '/multi', + 'icon': Icons.multitrack_audio, + 'label': '多子布局', + 'children': [ + { + 'path': '/flex', + 'label': 'Flex 适应布局', + }, + { + 'path': '/wrap', + 'label': 'Wrap 包裹布局', + }, + { + 'path': '/stack', + 'label': 'Stack 堆叠布局', + }, + ] + }; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/popable.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/popable.dart new file mode 100644 index 00000000..e969f68c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/popable.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get popableMenus => { + 'path': '/popable', + 'icon': Icons.layers_rounded, + 'label': '菜单浮层', + 'children': [ + { + 'path': '/DropdownButton', + 'label': '下拉按钮', + }, + { + 'path': '/DropdownMenu', + 'label': '下拉菜单', + // 'icon': Icons.calculate_outlined, + }, + { + 'path': '/Autocomplete', + 'label': '自动填充', + // 'icon': Icons.calculate_outlined, + }, + ] +}; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart new file mode 100644 index 00000000..cef50dea --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get calcMenus => { + 'path': '/scroll', + 'icon': Icons.touch_app_outlined, + 'label': '滑动布局', + 'children': [ + { + 'path': '/list', + 'label': '列表布局', + // 'icon': Icons.list_alt, + }, + { + 'path': '/grid', + 'label': '网格布局', + // 'icon': Icons.grid_on_sharp, + }, + { + 'path': '/page', + 'label': '滑页布局', + // 'icon': Icons.grid_on_sharp, + }, + ] +}; diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/app_router.dart b/modules/knowledge_system/layout/lib/src/navigation/router/app_router.dart new file mode 100644 index 00000000..ebdc49ad --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/app_router.dart @@ -0,0 +1,29 @@ + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + + +import '../../../layout.dart'; +import 'desk_router.dart'; + + + + RouteBase get layoutRoutes => GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + + + // GoRoute( + // path: 'start_error', + // builder: (BuildContext context, GoRouterState state) { + // return AppStartFixListener( + // child: ErrorPage( + // error: state.extra.toString(), + // ), + // ); + // }, + // ), + deskNavRoute + ], +); diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart b/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart new file mode 100644 index 00000000..a92d6202 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../layout.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_display.dart'; +import '../../views/test_show.dart'; +import '../menu/menu_repository_impl.dart'; +import '../view/app_desk_navigation.dart'; + +RouteBase get deskNavRoute => ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return AppDeskNavigation(content: child); + }, + routes: [ + GoRoute( + path: 'home', + builder: (BuildContext context, GoRouterState state) { + return const LayoutPage(); + }, + ), + GoRoute( + path: 'base/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), + GoRoute( + path: 'scroll/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), + GoRoute( + path: 'popable/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), + GoRoute( + path: 'multi/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), + GoRoute( + path: 'funny/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + // builder: (_,__)=>Text("暂未实现"), + // routes: [ + // GoRoute( + // path: 'row', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'row', + // ); + // }, + // ), + // GoRoute( + // path: 'column', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'column', + // ); + // }, + // ), GoRoute( + // path: 'expanded', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'expanded', + // ); + // }, + // ), + // GoRoute( + // path: 'holy', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'holy', + // ); + // }, + // ), + // ] + ), + // GoRoute( + // path: 'text/gen/secret', + // builder: (BuildContext context, GoRouterState state) { + // return SecretGenPage(); + // }, + // ), + // GoRoute( + // path: 'text/:name', + // pageBuilder: (BuildContext context, GoRouterState state) { + // return CustomTransitionPage( + // key: ValueKey(state.uri.path), + // // transitionDuration: const Duration(milliseconds: 500), + // // reverseTransitionDuration: const Duration(milliseconds: 500), + // child: ToolListPanel( + // key: ValueKey(state.fullPath??''), + // name: state.pathParameters['name'] ?? ''), + // transitionsBuilder: (BuildContext context, + // Animation animation, + // Animation secondaryAnimation, + // Widget child) { + // return FadeTransition( + // opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + // child: child, + // ); + // }); + // }, + // ), + ]); diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart new file mode 100644 index 00000000..d0e9e3f0 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FadePageTransitionsBuilder extends PageTransitionsBuilder { + const FadePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return FadeTransition( + opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + child: child, + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart new file mode 100644 index 00000000..01b5015f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart @@ -0,0 +1,56 @@ +//渐变透明路由动画 +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class FadePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + final Curve? curve; + + FadePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + + if (curve != null) { + animation = CurvedAnimation( + parent: animation, + curve: curve!, + ); + } + + return FadeTransition( + opacity: Tween(begin: 0.1, end: 1.0).animate(animation), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart new file mode 100644 index 00000000..2cb92871 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart @@ -0,0 +1,50 @@ +//右--->左 +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + + +class SlidePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + + SlidePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child); + } + final bool linearTransition = isPopGestureInProgress(this); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart new file mode 100644 index 00000000..a6c0ca8b --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart @@ -0,0 +1,36 @@ + +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class ZeroPageRoute extends MaterialPageRoute { + final Widget child; + + + ZeroPageRoute({ + required this.child, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + return child; + } + + @override + Duration get transitionDuration => Duration.zero; +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/size_clip_transition.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/size_clip_transition.dart new file mode 100644 index 00000000..f3fa0f5c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/size_clip_transition.dart @@ -0,0 +1,105 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SizeClipTransition extends StatelessWidget { + final Animation animation; + final Animation secondaryAnimation; + final Widget child; + + const SizeClipTransition({ + super.key, + required this.animation, + required this.secondaryAnimation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), + child: child, + ); + } +} + +class SizePathClipper extends CustomClipper { + final double progress; + + SizePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height, + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant SizePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class ScalePathClipper extends CustomClipper { + final double progress; + + ScalePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height* (1 - progress), + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant ScalePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class CirclePathClipper extends CustomClipper { + final double progress; + + CirclePathClipper(this.progress); + + @override + Path getClip(Size size) { + print('progress:$progress'); + if(progress==0){ + return Path(); + } + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCircle( + center: Offset(size.width , 0), + radius: sqrt(size.width*size.width+size.height*size.height) * (progress), + ); + + Path zone = Path()..addRect(box); + Path cliper = Path()..addOval(center); + + return Path.combine(PathOperation.intersect, zone, cliper ); + } + + @override + bool shouldReclip(covariant CirclePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart new file mode 100644 index 00000000..53bec7e3 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart @@ -0,0 +1,277 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +// The maximum time for a page to get reset to it's original position if the +// user releases a page mid swipe. +const int _kMaxPageBackAnimationTime = 300; // Milliseconds. +const double _kBackGestureWidth = 20.0; +const double _kMinFlingVelocity = 1.0; // Screen widths per second. + +// An eyeballed value for the maximum time it takes for a page to animate forward +// if the user releases a page mid swipe. +const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. + +/// This is the widget side of [CupertinoBackGestureController]. +/// +/// This widget provides a gesture recognizer which, when it determines the +/// route can be closed with a back gesture, creates the controller and +/// feeds it the input from the gesture recognizer. +/// +/// The gesture data is converted from absolute coordinates to logical +/// coordinates by this widget. +/// +/// The type `T` specifies the return type of the route with which this gesture +/// detector is associated. +class CupertinoBackGestureDetector extends StatefulWidget { + const CupertinoBackGestureDetector({ + super.key, + required this.enabledCallback, + required this.onStartPopGesture, + required this.child, + }); + + final Widget child; + + final ValueGetter enabledCallback; + + final ValueGetter> onStartPopGesture; + + @override + _CupertinoBackGestureDetectorState createState() => _CupertinoBackGestureDetectorState(); +} + +class _CupertinoBackGestureDetectorState extends State> { + CupertinoBackGestureController? _backGestureController; + + late HorizontalDragGestureRecognizer _recognizer; + + @override + void initState() { + super.initState(); + _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) + ..onStart = _handleDragStart + ..onUpdate = _handleDragUpdate + ..onEnd = _handleDragEnd + ..onCancel = _handleDragCancel; + } + + @override + void dispose() { + _recognizer.dispose(); + super.dispose(); + } + + void _handleDragStart(DragStartDetails details) { + assert(mounted); + assert(_backGestureController == null); + _backGestureController = widget.onStartPopGesture(); + } + + void _handleDragUpdate(DragUpdateDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragUpdate(_convertToLogical(details.primaryDelta! / context.size!.width)); + } + + void _handleDragEnd(DragEndDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragEnd(_convertToLogical(details.velocity.pixelsPerSecond.dx / context.size!.width)); + _backGestureController = null; + } + + void _handleDragCancel() { + assert(mounted); + // This can be called even if start is not called, paired with the "down" event + // that we don't consider here. + _backGestureController?.dragEnd(0.0); + _backGestureController = null; + } + + void _handlePointerDown(PointerDownEvent event) { + if (widget.enabledCallback()) { + _recognizer.addPointer(event); + } + } + + double _convertToLogical(double value) { + switch (Directionality.of(context)) { + case TextDirection.rtl: + return -value; + case TextDirection.ltr: + return value; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasDirectionality(context)); + // For devices with notches, the drag area needs to be larger on the side + // that has the notch. + double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? + MediaQuery.paddingOf(context).left : + MediaQuery.paddingOf(context).right; + dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); + return Stack( + fit: StackFit.passthrough, + children: [ + widget.child, + PositionedDirectional( + start: 0.0, + width: dragAreaWidth, + top: 0.0, + bottom: 0.0, + child: Listener( + onPointerDown: _handlePointerDown, + behavior: HitTestBehavior.translucent, + ), + ), + ], + ); + } +} + + +class CupertinoBackGestureController { + /// Creates a controller for an iOS-style back gesture. + /// + /// The [navigator] and [controller] arguments must not be null. + CupertinoBackGestureController({ + required this.navigator, + required this.controller, + }) { + navigator.didStartUserGesture(); + } + + final AnimationController controller; + final NavigatorState navigator; + + /// The drag gesture has changed by [fractionalDelta]. The total range of the + /// drag should be 0.0 to 1.0. + void dragUpdate(double delta) { + controller.value -= delta; + } + + /// The drag gesture has ended with a horizontal motion of + /// [fractionalVelocity] as a fraction of screen width per second. + void dragEnd(double velocity) { + // Fling in the appropriate direction. + // AnimationController.fling is guaranteed to + // take at least one frame. + // + // This curve has been determined through rigorously eyeballing native iOS + // animations. + const Curve animationCurve = Curves.fastLinearToSlowEaseIn; + final bool animateForward; + + // If the user releases the page before mid screen with sufficient velocity, + // or after mid screen, we should animate the page out. Otherwise, the page + // should be animated back in. + if (velocity.abs() >= _kMinFlingVelocity) { + animateForward = velocity <= 0; + } else { + animateForward = controller.value > 0.5; + } + + if (animateForward) { + // The closer the panel is to dismissing, the shorter the animation is. + // We want to cap the animation time, but we want to use a linear curve + // to determine it. + final int droppedPageForwardAnimationTime = min( + lerpDouble(_kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!.floor(), + _kMaxPageBackAnimationTime, + ); + controller.animateTo(1.0, duration: Duration(milliseconds: droppedPageForwardAnimationTime), curve: animationCurve); + } else { + // This route is destined to pop at this point. Reuse navigator's pop. + navigator.pop(); + + // The popping may have finished inline if already at the target destination. + if (controller.isAnimating) { + // Otherwise, use a custom popping animation duration and curve. + final int droppedPageBackAnimationTime = lerpDouble(0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!.floor(); + controller.animateBack(0.0, duration: Duration(milliseconds: droppedPageBackAnimationTime), curve: animationCurve); + } + } + + if (controller.isAnimating) { + // Keep the userGestureInProgress in true state so we don't change the + // curve of the page transition mid-flight since CupertinoPageTransition + // depends on userGestureInProgress. + late AnimationStatusListener animationStatusCallback; + animationStatusCallback = (AnimationStatus status) { + navigator.didStopUserGesture(); + controller.removeStatusListener(animationStatusCallback); + }; + controller.addStatusListener(animationStatusCallback); + } else { + navigator.didStopUserGesture(); + } + } +} + +// Called by _CupertinoBackGestureDetector when a pop ("back") drag start +// gesture is detected. The returned controller handles all of the subsequent +// drag events. +CupertinoBackGestureController startPopGesture(PageRoute route) { + return CupertinoBackGestureController( + navigator: route.navigator!, + controller: route.controller!, // protected access + ); +} + +bool isPopGestureEnabled(PageRoute route) { + print( + "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); +// If there's nothing to go back to, then obviously we don't support +// the back gesture. + if (route.isFirst) { + return false; + } +// If the route wouldn't actually pop if we popped it, then the gesture +// would be really confusing (or would skip internal routes), so disallow it. + if (route.willHandlePopInternally) { + return false; + } +// If attempts to dismiss this route might be vetoed such as in a page +// with forms, then do not allow the user to dismiss the route with a swipe. + if (route.hasScopedWillPopCallback) { + return false; + } +// Fullscreen dialogs aren't dismissible by back swipe. + if (route.fullscreenDialog) { + return false; + } +// If we're in an animation already, we cannot be manually swiped. + if (route.animation!.status != AnimationStatus.completed) { + return false; + } +// If we're being popped into, we also cannot be swiped until the pop above +// it completes. This translates to our secondary animation being +// dismissed. + if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { + return false; + } +// If we're in a gesture already, we cannot start another. + if (isPopGestureInProgress(route)) { + return false; + } + +// Looks like a back gesture would be welcome! + return true; +} + +/// True if an iOS-style back swipe pop gesture is currently underway for [route]. +/// +/// This just check the route's [NavigatorState.userGestureInProgress]. +/// +/// See also: +/// +/// * [popGestureEnabled], which returns true if a user-triggered pop gesture +/// would be allowed. +bool isPopGestureInProgress(PageRoute route) { + return route.navigator!.userGestureInProgress; +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart new file mode 100644 index 00000000..fd027cd4 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart @@ -0,0 +1,33 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + +class SlidePageTransitionsBuilder extends PageTransitionsBuilder { + const SlidePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(route!), + onStartPopGesture: () => startPopGesture(route!), + child: child); + } + final bool linearTransition = isPopGestureInProgress(route!); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/navigation/view/app_desk_navigation.dart b/modules/knowledge_system/layout/lib/src/navigation/view/app_desk_navigation.dart new file mode 100644 index 00000000..7ea382dd --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../views/display/layout_playground.dart'; +import 'app_menu_tree.dart'; + +class AppDeskNavigation extends StatelessWidget { + final Widget content; + + const AppDeskNavigation({super.key, required this.content}); + + @override + Widget build(BuildContext context) { + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return Scaffold( + backgroundColor: backgroundColor, + body: Row( + children: [ + const AppMenuTree(), + Expanded(child: LayoutPlayGround(content: content)), + ], + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/navigation/view/app_menu_tree.dart b/modules/knowledge_system/layout/lib/src/navigation/view/app_menu_tree.dart new file mode 100644 index 00000000..3242d3d7 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/navigation/view/app_menu_tree.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../bloc/display_logic.dart'; +import '../../ext/go_router/listener.dart'; +import '../menu/menu_repository_impl.dart'; + +class AppMenuTree extends StatefulWidget { + const AppMenuTree({super.key}); + + @override + State createState() => _AppMenuTreeState(); +} + +class _AppMenuTreeState extends State with RouterChangeListenerMixin { + late MenuTreeMeta _menuMeta; + + @override + void initState() { + super.initState(); + _initTreeMeta(); + } + + void _initTreeMeta() { + MenuNode root = MenuNode.fromMap(layoutMenus); + List parts = Uri.parse(path).pathSegments; + String parentPath = parts.sublist(0, parts.length - 1).join('/'); + _menuMeta = MenuTreeMeta( + expandMenus: ['/$parentPath'], + activeMenu: root.find(path), + root: root, + ); + } + + @override + Widget build(BuildContext context) { + Color expandBackgroundColor = context.isDark ? Colors.black : Colors.transparent; + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return TolyRailMenuTree( + leading: const SizedBox( + height: 18, + ), + enableWidthChange: true, + maxWidth: 360, + width: 190, + meta: _menuMeta, + backgroundColor: backgroundColor, + expandBackgroundColor: expandBackgroundColor, + onSelect: _onSelect, + ); + } + + void _onMenuRouterChange(BuildContext context, String? path) { + if (path != null) { + context.go(path); + DisplayScope.of(context).active(path); + } + } + + void _onSelect(MenuNode menu) { + if (menu.isLeaf) { + context.go(menu.id); + print(path); + } else { + _menuMeta = _menuMeta.select(menu, singleExpand: true); + setState(() {}); + } + } + + @override + void reassemble() { + MenuNode root = MenuNode.fromMap(layoutMenus); + _menuMeta = _menuMeta.copyWith(root: root); + super.reassemble(); + } + + @override + void onChangeRoute(String path) { + _menuMeta = _menuMeta.selectPath(path, singleExpand: true); + DisplayScope.of(context).active(path); + setState(() {}); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/align/align_show.dart b/modules/knowledge_system/layout/lib/src/views/base/align/align_show.dart new file mode 100644 index 00000000..af3eae26 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/align/align_show.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class AlignShow extends StatelessWidget { + const AlignShow({super.key}); + + final List alignments = const [ + Alignment.topLeft, + Alignment.topCenter, + Alignment.topRight, + Alignment.centerLeft, + Alignment.center, + Alignment.centerRight, + Alignment.bottomLeft, + Alignment.bottomCenter, + Alignment.bottomRight, + ]; + + final List alignmentsInfo = const [ + "topLeft", + "topCenter", + "topRight", + "centerLeft", + "center", + "centerRight", + "bottomLeft", + "bottomCenter", + "bottomRight", + ]; + + @override + Widget build(BuildContext context) { + TextStyle style = TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 12 + ); + return Center( + child: Wrap( + children: alignments + .toList() + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 150, + height: 100, + color: Colors.grey.withAlpha(88), + child: Align( + child: Container( + width: 30, + height: 30, + color: Colors.cyanAccent, + ), + alignment: mode)), + Text( + alignmentsInfo[alignments.indexOf(mode)], + style: style, + ) + ])) + .toList()), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/align/align_show2.dart b/modules/knowledge_system/layout/lib/src/views/base/align/align_show2.dart new file mode 100644 index 00000000..508c768c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/align/align_show2.dart @@ -0,0 +1,75 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +class Ball extends StatelessWidget { + const Ball({ + super.key, + this.radius = 15, + this.color = Colors.blue, + }); + final double radius; //半径 + final Color color; //颜色 + + @override + Widget build(BuildContext context) { + return Container( + width: radius * 2, + height: radius * 2, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + ), + ); + } +} + +class AlignShow2 extends StatefulWidget { + const AlignShow2({ + super.key, + }); + + @override + _AlignShow2State createState() => _AlignShow2State(); +} + +class _AlignShow2State extends State { + double _x = 0.0; //Alignment坐标系上的x坐标 + + @override + Widget build(BuildContext context) { + var item = Container( + width: 300, + height: 120, + color: Colors.black.withAlpha(10), + child: Align( + child: const Ball( + color: Colors.orangeAccent, + ), + alignment: Alignment(_x, f(_x * pi)), + ), + ); + + var slider = SizedBox( + width: 320, + child: Slider( + + max: 180, + min: -180, + divisions: 360, + label: "${_x.toStringAsFixed(2)}π", + value: _x * 180, + onChanged: (v) => setState(() => _x = v / 180)), + ); + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [slider, item], + ), + ); + } + + double f(x) { + //映射函数 -- 可随意指定 + double y = sin(x); + return y; + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/padding/inner_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/inner_padding.dart new file mode 100644 index 00000000..789511ba --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/padding/inner_padding.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class InnerPadding extends StatelessWidget { + const InnerPadding({super.key}); + + @override + Widget build(BuildContext context) { + Color? color = Theme.of(context).primaryColor; + TextStyle? style = const TextStyle(color: Colors.white); + return Center( + child: ColoredBox( + color: color, + child: SizedBox( + width: 200, + height: 80, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0,vertical: 8), + child: Text("张风捷特烈 " * 10, style: style), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/views/base/padding/outer_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/outer_padding.dart new file mode 100644 index 00000000..9bf10ed6 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/padding/outer_padding.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +import 'inner_padding.dart'; + +class OuterPadding extends StatelessWidget { + const OuterPadding({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InnerPadding(), + Padding( + padding: const EdgeInsets.only(left: 24.0), + child: InnerPadding(), + ), + ], + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/padding/sizedbox_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/sizedbox_padding.dart new file mode 100644 index 00000000..4e3fd5cd --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/padding/sizedbox_padding.dart @@ -0,0 +1,20 @@ + +import 'package:flutter/material.dart'; + +import 'inner_padding.dart'; + +class SizedBoxPadding extends StatelessWidget { + const SizedBoxPadding({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InnerPadding(), + SizedBox(width: 24), + InnerPadding(), + ], + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/positioned/positioned_show.dart b/modules/knowledge_system/layout/lib/src/views/base/positioned/positioned_show.dart new file mode 100644 index 00000000..05b7674f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/positioned/positioned_show.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +class PositionedShow extends StatefulWidget { + const PositionedShow({super.key}); + + @override + State createState() => _PositionedShowState(); +} + +class _PositionedShowState extends State { + @override + Widget build(BuildContext context) { + Widget yellowBox = Container( + color: Colors.yellow, + height: 100, + width: 100, + ); + + Widget redBox = Container( + color: Colors.red, + height: 90, + width: 90, + ); + + Widget greenBox = DraggedBox( + onPanUpdate: _onPanUpdate, + ); + + Widget cyanBox = Container( + color: Colors.cyanAccent, + height: 70, + width: 70, + ); + + return Container( + color: Colors.grey.withAlpha(33), + child: Stack( + children: [ + yellowBox, + redBox, + Positioned(top: _top, left: _left, child: greenBox), + Positioned(bottom: 20, right: 20, child: cyanBox) + ], + )); + } + + double _top = 20; + double _left = 20; + void _onPanUpdate(DragUpdateDetails details) { + setState(() { + _top += details.delta.dy; + _left += details.delta.dx; + }); + } +} + +class DraggedBox extends StatelessWidget { + final GestureDragUpdateCallback? onPanUpdate; + + const DraggedBox({super.key, this.onPanUpdate}); + + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onPanUpdate: onPanUpdate, + child: Container( + color: Colors.green, + height: 80, + width: 80, + ), + ), + ); + } + + +} + diff --git a/modules/knowledge_system/layout/lib/src/views/base/size/size_display.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_display.dart new file mode 100644 index 00000000..e6a38977 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/size/size_display.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +import '../../../bloc/display_logic.dart'; +import '../../../data/model/display_frame.dart'; + + +class FrameDisplayPanel extends StatelessWidget { + const FrameDisplayPanel({super.key}); + + @override + Widget build(BuildContext context) { + DisplayFrame frame = DisplayScope.of(context).state.frame; + + return Material( + color: Colors.transparent, + elevation: 0, + child: frame.display(context), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/size/size_loss_by_align.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_loss_by_align.dart new file mode 100644 index 00000000..3d018ca7 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/size/size_loss_by_align.dart @@ -0,0 +1,76 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:layout/src/views/components/grid_xy_layout.dart'; + +import 'size_tight_constraint.dart'; + +class LossDisplay extends StatelessWidget { + const LossDisplay({super.key}); + + @override + Widget build(BuildContext context) { + return GridXYLayout( + capacity: (2, 2), + xyBuilder: ((int, int) pos) => switch (pos) { + (0, 0) => const Align(child: SizeTightConstraint(info: 'Align 放宽约束')), + (0, 1) => const Row(children: [SizeTightConstraint(info: 'Row 放宽约束')]), + (1, 0) => const Scaffold( + backgroundColor: Colors.transparent, + body: SizeTightConstraint(info: 'Scaffold 放宽约束'), + ), + (1, 1) => const Column( + children: [SizeTightConstraint(info: 'Column 放宽约束')], + ), + _ => const SizedBox() + }, + ); + } +} + +class SizeLossByAlign extends StatelessWidget { + const SizeLossByAlign({super.key}); + + @override + Widget build(BuildContext context) { + return const Align( + alignment: Alignment.topCenter, + child: ColoredBox( + color: Colors.redAccent, + child: SizedBox( + width: 120, + height: 80, + child: Center( + child: Text( + 'Align 放宽约束', + style: TextStyle(color: Colors.white), + )), + ), + ), + ); + } +} + +class SizeLossByRow extends StatelessWidget { + const SizeLossByRow({super.key}); + + @override + Widget build(BuildContext context) { + return const Row( + children: [ + ColoredBox( + color: Colors.redAccent, + child: SizedBox( + width: 150, + height: 100, + child: Center( + child: Text( + 'Row 放宽约束', + style: TextStyle(color: Colors.white), + )), + ), + ), + ], + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/size/size_tight_constraint.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_tight_constraint.dart new file mode 100644 index 00000000..e129a0d2 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/size/size_tight_constraint.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class SizeTightConstraint extends StatelessWidget { + final String info; + + const SizeTightConstraint({super.key, required this.info}); + + @override + Widget build(BuildContext context) { + Color color = Theme.of(context).primaryColor; + return LayoutBuilder( + builder: (ctx,cts)=>ColoredBox( + color: color, + child: SizedBox( + width: 150, + height: 100, + child: Center( + child: Text( + '$info\n当前约束:\n${cts.toString().replaceAll('BoxConstraints', '')}', + style: const TextStyle(color: Colors.white), + textAlign: TextAlign.center, + )), + ), + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/base/size/size_unconstraint.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_unconstraint.dart new file mode 100644 index 00000000..893b102c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/base/size/size_unconstraint.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/size/size_tight_constraint.dart'; + +class SizeUnconstrain extends StatelessWidget { + const SizeUnconstrain({super.key}); + + @override + Widget build(BuildContext context) { + return UnconstrainedBox( + child: SizeTightConstraint(info: "通过 UnconstrainedBox 解除约束",), + ); + } +} + diff --git a/modules/knowledge_system/layout/lib/src/views/components/grid_xy_layout.dart b/modules/knowledge_system/layout/lib/src/views/components/grid_xy_layout.dart new file mode 100644 index 00000000..b1a44435 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/components/grid_xy_layout.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +typedef XYBuilder = Function((int x, int y)); + +class GridXYLayout extends StatelessWidget { + final (int, int) capacity; + final XYBuilder xyBuilder; + final bool hasLine; + + const GridXYLayout({ + super.key, + this.capacity = (2, 2), + required this.xyBuilder, + this.hasLine = true, + }); + + @override + Widget build(BuildContext context) { + List children = []; + for (int i = 0; i < capacity.$1; i++) { + List columnChildren = []; + for (int j = 0; j < capacity.$2; j++) { + columnChildren.add(Expanded(child: xyBuilder((i, j)))); + if (hasLine && j != capacity.$2 - 1) { + columnChildren.add(const Divider()); + } + } + children.add(Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ))); + if (hasLine && i != capacity.$1 - 1) { + children.add(const VerticalDivider()); + } + } + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: children, + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/display/layout_playground.dart b/modules/knowledge_system/layout/lib/src/views/display/layout_playground.dart new file mode 100644 index 00000000..72e43078 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/display/layout_playground.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +import 'playground_bottom_bar.dart'; +import 'playground_top_bar.dart'; + +class LayoutPlayGround extends StatelessWidget { + final Widget content; + + const LayoutPlayGround({ + super.key, + required this.content, + }); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const PlaygroundTopBar(), + const Divider(), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 24), + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4)), + ), + child: content, + ), + )), + const Divider(), + const PlaygroundBottomBar() + ], + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/display/playground_bottom_bar.dart b/modules/knowledge_system/layout/lib/src/views/display/playground_bottom_bar.dart new file mode 100644 index 00000000..0b96227c --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/display/playground_bottom_bar.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/bloc/display_logic.dart'; + +import '../../data/model/display_frame.dart'; + +class PlaygroundBottomBar extends StatelessWidget { + const PlaygroundBottomBar({super.key}); + + @override + Widget build(BuildContext context) { + DisplayFrame frame = DisplayScope.of(context).state.frame; + return Container( + width: double.maxFinite, + color: Color(0xfff2f2f2), + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 4), + // height: 24, + child: Text( + frame.desc, + style: TextStyle(fontSize: 12, fontFamily: '宋体'), + ), + // child: NavigationToolbar( + // centerMiddle: true, + // middle: Text("${menu??'布局测试'}"), + // trailing: IconButton(onPressed: (){ + // + // }, icon: Icon(Icons.code)), + // ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/display/playground_top_bar.dart b/modules/knowledge_system/layout/lib/src/views/display/playground_top_bar.dart new file mode 100644 index 00000000..5a893447 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/display/playground_top_bar.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; + +import '../../bloc/display_logic.dart'; +import '../../bloc/display_state.dart'; +import '../../data/model/display_frame.dart'; + +class PlaygroundTopBar extends StatelessWidget { + const PlaygroundTopBar({super.key}); + + @override + Widget build(BuildContext context) { + DisplayState state = DisplayScope.of(context).state; + DisplayFrame frame = state.frame; + const ActionStyle style = ActionStyle.light(backgroundColor: Color(0xffd5d5d5)); + return Container( + color: const Color(0xfff2f2f2), + padding: const EdgeInsets.symmetric(horizontal: 12), + height: 46, + child: NavigationToolbar( + centerMiddle: true, + leading: UnconstrainedBox( + child: Align( + alignment: Alignment.centerLeft, + child: Text( + '当前: ${state.activeIndex + 1}/${state.total}', + style: const TextStyle(color: Colors.grey, fontWeight: FontWeight.bold), + )), + ), + middle: Text( + frame.title, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + trailing: Wrap( + children: [ + TolyAction( + style: style, + child: const Icon(Icons.skip_previous, size: 20), + onTap: () { + DisplayScope.of(context).prevPage(); + }), + TolyAction( + style: style, + child: const Icon(Icons.skip_next, size: 20), + onTap: () { + DisplayScope.of(context).nextPage(); + }), + TolyAction(style: style, child: const Icon(Icons.code, size: 20), onTap: () {}), + ], + ), + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/interest/elevator/elevator.dart b/modules/knowledge_system/layout/lib/src/views/interest/elevator/elevator.dart new file mode 100644 index 00000000..1b3818cf --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/interest/elevator/elevator.dart @@ -0,0 +1,85 @@ +// Copyright 2014 The 星星. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-07-02 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; + +class ElevatorRoom extends StatefulWidget { + const ElevatorRoom({super.key}); + + @override + State createState() => _ElevatorRoomState(); +} + +class _ElevatorRoomState extends State { + int lv = 1 ; + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + double roomHeight = constraints.maxHeight/20; + + return Row( + children: [ + SizedBox( + width: 10, + ), + Stack( + children: [ + Column( + children: List.generate( + 20, + (index) => Container( + decoration: + BoxDecoration(border: Border.all(width: 1, color: Colors.grey)), + width: constraints.minWidth / 10, + height: roomHeight, + )), + ), + Positioned( + bottom: roomHeight * ( lv - 1 ), + child: elevator( width: constraints.minWidth / 10, + height: constraints.maxHeight / 20,), + ), + ], + ), + Column( + children: [ + TolyAction(child: Icon(Icons.arrow_upward_outlined), onTap:upRoom), + TolyAction(child: Icon(Icons.arrow_downward_outlined), onTap:downRoom), + + ], + ), + ], + ); + }, + ); + } + + void upRoom() { + lv+=1; + setState(() { + + }); + } + + void downRoom() { + + lv-=1; + setState(() { + + }); + } + Widget elevator({required double height, required double width}) { + return Container( + height: height, + width: width, + color: Colors.blue, + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/layout_page.dart b/modules/knowledge_system/layout/lib/src/views/layout_page.dart new file mode 100644 index 00000000..1b953d3f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/layout_page.dart @@ -0,0 +1,62 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:go_router/go_router.dart'; +import 'package:layout/src/navigation/router/app_router.dart'; + +import '../bloc/display_logic.dart'; +import '../bloc/display_state.dart'; +import '../data/display_map/display_map.dart'; + +class LayoutRouterPage extends StatefulWidget { + LayoutRouterPage({super.key}); + + @override + State createState() => _LayoutRouterPageState(); +} + +class _LayoutRouterPageState extends State { + final GoRouter _router = GoRouter( + initialLocation: '/base/size', + routes: [layoutRoutes], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go('/404', extra: state.uri.toString()); + }, + ); + + late final DisplayLogic logic; + + @override + void initState() { + logic = DisplayLogic(DisplayState( + router: '/base/size', + activeIndex: 0, + total: kDisplayMap['/base/size']!.length, + )); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return DisplayScope( + notifier: logic, + child: Column( + children: [ + const Divider(), + Expanded( + child: Router.withConfig(config: _router), + ), + ], + ), + ); + } +} + +class LayoutPage extends StatelessWidget { + const LayoutPage({super.key}); + + @override + Widget build(BuildContext context) { + return Material(color: Colors.white, child: const Center(child: Text("TODO"))); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/multi/flex/column_show.dart b/modules/knowledge_system/layout/lib/src/views/multi/flex/column_show.dart new file mode 100644 index 00000000..ee4659a6 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/multi/flex/column_show.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class ColumnShow extends StatelessWidget { + const ColumnShow({super.key}); + + @override + Widget build(BuildContext context) { + List colors = [ + const Color(0xffe64032), + const Color(0xff307dee), + const Color(0xfff9c01f), + const Color(0xff309949), + ]; + return Column( + children: [ + Container(width: 20, height: 20, color: colors[0]), + Container(width: 10, height: 80, color: colors[1]), + Container(width: 40, height: 30, color: colors[2]), + Container(width: 60, height: 20, color: colors[3]), + ], + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/multi/flex/row_show.dart b/modules/knowledge_system/layout/lib/src/views/multi/flex/row_show.dart new file mode 100644 index 00000000..4a15ef26 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/multi/flex/row_show.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class RowShow extends StatelessWidget { + const RowShow({super.key}); + + @override + Widget build(BuildContext context) { + List colors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), + ]; + return Row( + children: [ + Container(width: 20, height: 20, color: colors[0]), + Container(width: 10, height: 80, color: colors[1]), + Container(width: 40, height: 30, color: colors[2]), + Container(width: 60, height: 20, color: colors[3]), + ], + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/cons.dart b/modules/knowledge_system/layout/lib/src/views/playground/cons.dart new file mode 100644 index 00000000..f97ab2d1 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/cons.dart @@ -0,0 +1,16 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'dart:ui'; + +const List kColors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), +]; diff --git a/modules/knowledge_system/layout/lib/src/views/playground/data/flex_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/flex_attr.dart new file mode 100644 index 00000000..9d608d06 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/data/flex_attr.dart @@ -0,0 +1,48 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class FlexAttr { + final Axis direction; + final MainAxisAlignment mainAxisAlignment; + final CrossAxisAlignment crossAxisAlignment; + final MainAxisSize mainAxisSize; + final TextDirection textDirection; + final VerticalDirection verticalDirection; + final TextBaseline textBaseline; + + FlexAttr({ + required this.direction, + this.mainAxisAlignment = MainAxisAlignment.start, + this.crossAxisAlignment = CrossAxisAlignment.center, + this.mainAxisSize = MainAxisSize.max, + this.textDirection = TextDirection.ltr, + this.textBaseline = TextBaseline.alphabetic, + this.verticalDirection = VerticalDirection.down, + }); + + FlexAttr copyWith({ + Axis? direction, + MainAxisAlignment? mainAxisAlignment, + CrossAxisAlignment? crossAxisAlignment, + MainAxisSize? mainAxisSize, + TextDirection? textDirection, + VerticalDirection? verticalDirection, + TextBaseline? textBaseline, + }) => + FlexAttr( + direction: direction ?? this.direction, + mainAxisAlignment: mainAxisAlignment ?? this.mainAxisAlignment, + crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, + mainAxisSize: mainAxisSize ?? this.mainAxisSize, + textDirection: textDirection ?? this.textDirection, + verticalDirection: verticalDirection ?? this.verticalDirection, + textBaseline: textBaseline ?? this.textBaseline, + ); +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/data/stack_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/stack_attr.dart new file mode 100644 index 00000000..c307bb23 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/data/stack_attr.dart @@ -0,0 +1,50 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + + + +class StackAttr { + final AttrAlignment alignment; + final StackFit fit; + final TextDirection textDirection; + + StackAttr({ + this.alignment = AttrAlignment.topStart, + this.fit = StackFit.loose, + this.textDirection = TextDirection.ltr, + + }); + + StackAttr copyWith({ + AttrAlignment? alignment, + StackFit? fit, + TextDirection? textDirection, + }) => + StackAttr( + alignment: alignment ?? this.alignment, + fit: fit ?? this.fit, + textDirection: textDirection ?? this.textDirection, + ); +} + +enum AttrAlignment{ + topStart(Alignment.topLeft), + topCenter(Alignment.topCenter), + topRight(Alignment.topRight), + bottomCenter(Alignment.bottomCenter), + bottomLeft(Alignment.bottomLeft), + bottomRight(Alignment.bottomRight), + center(Alignment.center), + centerLeft(Alignment.centerLeft), + centerRight(Alignment.centerRight), + ; + final Alignment value; + const AttrAlignment(this.value); +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/data/wrap_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/wrap_attr.dart new file mode 100644 index 00000000..e2acc5f2 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/data/wrap_attr.dart @@ -0,0 +1,55 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + + +class WrapAttr { + final Axis direction; + final WrapAlignment mainAlignment; + final WrapCrossAlignment crossAxisAlignment; + final double spacing; + final TextDirection textDirection; + final VerticalDirection verticalDirection; + final WrapAlignment runAlignment; + final double runSpacing; + + const WrapAttr({ + this.direction = Axis.horizontal, + this.mainAlignment = WrapAlignment.start, + this.crossAxisAlignment = WrapCrossAlignment.center, + this.spacing = 0.0, + this.textDirection = TextDirection.ltr, + this.verticalDirection = VerticalDirection.down, + this.runAlignment = WrapAlignment.start, + this.runSpacing =0.0, + }); + + WrapAttr copyWith({ + Axis? direction, + WrapAlignment? mainAlignment, + WrapCrossAlignment? crossAxisAlignment, + double? spacing, + TextDirection?textDirection, + VerticalDirection? verticalDirection, + WrapAlignment?runAlignment, + Clip? clipBehavior, + double ?runSpacing, + + }) => + WrapAttr( + direction: direction ?? this.direction, + mainAlignment: mainAlignment ?? this.mainAlignment, + crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, + spacing: spacing ?? this.spacing, + textDirection: textDirection ?? this.textDirection, + verticalDirection: verticalDirection ?? this.verticalDirection, + runAlignment: runAlignment ?? this.runAlignment, + runSpacing: runSpacing??this.runSpacing, + ); +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/display_item.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/display_item.dart new file mode 100644 index 00000000..0438b225 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/display_item.dart @@ -0,0 +1,49 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class DisplayItem { + final double width; + final double height; + final Color color; + + DisplayItem({ + required this.width, + required this.height, + required this.color, + }); +} + + +class DisplayPlayItem extends StatefulWidget { + final DisplayItem item; + final bool selected; + const DisplayPlayItem({ + super.key, + required this.item, + required this.selected, + }); + + @override + State createState() => _DisplayPlayItemState(); +} + +class _DisplayPlayItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.item.width, + height: widget.item.height, + decoration: BoxDecoration( + border: widget.selected ? Border.all() : null, + color: widget.item.color, + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_op_panel.dart new file mode 100644 index 00000000..592cce69 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_op_panel.dart @@ -0,0 +1,170 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/flex_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + + +class FlexOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final VoidCallback onReset; + final FlexAttr attr; + final ValueChanged onAttrChange; + + const FlexOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _FlexOpToolState(); +} + +class _FlexOpToolState extends State { + final TextEditingController _widthCtrl = TextEditingController(text: '24'); + final TextEditingController _heightCtrl = TextEditingController(text: '64'); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Flex 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(onTap: _handleAdd, child: const Icon(CupertinoIcons.add, size: 18)), + TolyAction(onTap: widget.onDelete, child: const Icon(CupertinoIcons.delete, size: 16)), + ], + ), + ), + ItemSizeInput(widthCtrl: _widthCtrl, heightCtrl: _heightCtrl), + const SizedBox(height: 12), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(onTap: widget.onReset, child: const Icon(CupertinoIcons.refresh, size: 16)), + + ], + ), + ), + ItemSelector( + label: '排列方向:', + subTitle: 'direction', + selectIndex: widget.attr.direction.index, + data: Axis.values, + calcFun: (Axis data) => data.name, + onSelect: (Axis value) { + widget.onAttrChange(widget.attr.copyWith(direction: value)); + }, + ), + ItemSelector( + label: '主轴对齐:', + subTitle: 'mainAxisAlignment', + selectIndex: widget.attr.mainAxisAlignment.index, + data: MainAxisAlignment.values, + calcFun: (MainAxisAlignment data) => data.name, + onSelect: (MainAxisAlignment value) { + widget.onAttrChange(widget.attr.copyWith(mainAxisAlignment: value)); + }, + ), + ItemSelector( + label: '主轴尺寸:', + subTitle: 'mainAxisSize', + selectIndex: widget.attr.mainAxisSize.index, + data: MainAxisSize.values, + calcFun: (MainAxisSize data) => data.name, + onSelect: (MainAxisSize value) { + widget.onAttrChange(widget.attr.copyWith(mainAxisSize: value)); + }, + ), + ItemSelector( + label: '叉轴对齐:', + subTitle: 'crossAxisAlignment', + selectIndex: widget.attr.crossAxisAlignment.index, + data: CrossAxisAlignment.values, + calcFun: (CrossAxisAlignment data) => data.name, + onSelect: (CrossAxisAlignment value) { + widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); + }, + ), + ItemSelector( + label: '垂直方向:', + subTitle: 'verticalDirection', + selectIndex: widget.attr.verticalDirection.index, + data: VerticalDirection.values, + calcFun: (VerticalDirection data) => data.name, + onSelect: (VerticalDirection value) { + widget.onAttrChange(widget.attr.copyWith(verticalDirection: value)); + }, + ), + ItemSelector( + label: '文字方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ItemSelector( + label: '文字基线:', + subTitle: 'textBaseline', + selectIndex: widget.attr.textBaseline.index, + data: TextBaseline.values, + calcFun: (TextBaseline data) => data.name, + onSelect: (TextBaseline value) { + widget.onAttrChange(widget.attr.copyWith(textBaseline: value)); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(_widthCtrl.text); + final double? height = double.tryParse(_heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } + + @override + void dispose() { + _widthCtrl.dispose(); + _heightCtrl.dispose(); + super.dispose(); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart new file mode 100644 index 00000000..07e2db43 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart @@ -0,0 +1,144 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../cons.dart'; +import '../../data/flex_attr.dart'; +import '../display_item.dart'; +import 'flex_op_panel.dart'; + +class FlexPlayground extends StatefulWidget { + const FlexPlayground({super.key}); + + @override + State createState() => _FlexPlaygroundState(); +} + +class _FlexPlaygroundState extends State { + List _data = []; + late FlexAttr _attr; + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _reset(init: true); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: FlexDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )), + )), + const VerticalDivider(), + SizedBox( + width: 210, + child: FlexOpTool( + attr: _attr, + onReset: _reset, + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + )), + ], + ); + } + + void _reset({bool init=false}){ + _attr = FlexAttr(direction: Axis.horizontal); + _data = [ + DisplayItem(width: 20, height: 20, color: kColors[0]), + DisplayItem(width: 10, height: 80, color: kColors[1]), + DisplayItem(width: 40, height: 30, color: kColors[2]), + DisplayItem(width: 60, height: 20, color: kColors[3]), + ]; + if(init) return; + setState(() {}); + } + + void _onAttrChange(FlexAttr attr) { + setState(() { + _attr = attr; + }); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + +} + +class FlexDisplay extends StatelessWidget { + final List items; + final FlexAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const FlexDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Flex( + direction: attr.direction, + mainAxisAlignment: attr.mainAxisAlignment, + crossAxisAlignment: attr.crossAxisAlignment, + mainAxisSize: attr.mainAxisSize, + textDirection: attr.textDirection, + verticalDirection: attr.verticalDirection, + textBaseline: TextBaseline.alphabetic, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_selector.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_selector.dart new file mode 100644 index 00000000..57432213 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_selector.dart @@ -0,0 +1,74 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-30 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +typedef NameCalc = String Function(T data); + +class ItemSelector extends StatelessWidget { + final int selectIndex; + final List data; + final NameCalc calcFun; + final ValueChanged onSelect; + final String label; + final String subTitle; + + const ItemSelector({ + super.key, + required this.selectIndex, + required this.data, + required this.calcFun, + required this.onSelect, + required this.subTitle, + required this.label, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + DropMenuCellStyle lightStyle = const DropMenuCellStyle( + padding: EdgeInsets.symmetric(horizontal: 4,vertical: 1), + borderRadius: BorderRadius.all(Radius.circular(6)), + foregroundColor: Color(0xff1f1f1f), + backgroundColor: Colors.transparent, + disableColor: Color(0xffbfbfbf), + hoverBackgroundColor: Color(0xfff5f5f5), + hoverForegroundColor: Color(0xff1f1f1f), + textStyle: TextStyle(fontSize: 11) + ); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: labelStyle), + Text(subTitle, style: labelStyle.copyWith(fontSize: 8)), + ], + ), + const Spacer(), + TolySelect( + fontSize: 11, + cellStyle: lightStyle, + data: data.map((e) => calcFun(e)).toList(), + selectIndex: selectIndex, + iconSize: 16, + height: 25, + width: 110, + maxHeight: 200, + shrinkWrapWidthOverlay: false, + minWidth: 0, + onSelected: (int index) => onSelect(data[index]), + ) + ], + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_size_input.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_size_input.dart new file mode 100644 index 00000000..1ccb27ae --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_size_input.dart @@ -0,0 +1,54 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +class ItemSizeInput extends StatelessWidget { + final TextEditingController widthCtrl; + final TextEditingController heightCtrl; + + const ItemSizeInput({ + super.key, + required this.widthCtrl, + required this.heightCtrl, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + children: [ + Text('宽高: ', style: labelStyle), + const SizedBox(width: 20), + Expanded( + child: CupertinoTextField( + controller: widthCtrl, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 4.0), + child: Text( + "x", + style: TextStyle(fontSize: 12), + ), + ), + Expanded( + child: CupertinoTextField( + controller: heightCtrl, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )) + ], + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/value_input.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/value_input.dart new file mode 100644 index 00000000..67a300a9 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/value_input.dart @@ -0,0 +1,52 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-30 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +class ValueInput extends StatelessWidget { + final String label; + final String subtitle; + final ValueChanged onChange; + + const ValueInput({ + super.key, + required this.onChange, + required this.label, + required this.subtitle, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: labelStyle), + Text(subtitle, style: labelStyle.copyWith(fontSize: 8)), + ], + ), + const Spacer(), + SizedBox( + width: 110, + child: CupertinoTextField( + keyboardType: TextInputType.number, + onChanged: onChange, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + ), + ) + ], + ), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart new file mode 100644 index 00000000..18c1fae9 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart @@ -0,0 +1,130 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/stack_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + + +class StackOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final VoidCallback onReset; + final StackAttr attr; + final ValueChanged onAttrChange; + + const StackOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _StackOpToolState(); +} + +class _StackOpToolState extends State { + final TextEditingController _widthCtrl = TextEditingController(text: '24'); + final TextEditingController _heightCtrl = TextEditingController(text: '64'); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Flex 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(child: const Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), + TolyAction(child: const Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), + ], + ), + ), + ItemSizeInput(widthCtrl: _widthCtrl, heightCtrl: _heightCtrl), + const SizedBox(height: 12), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction(child: const Icon(CupertinoIcons.refresh, size: 16), onTap: widget.onReset), + + ], + ), + ), + ItemSelector( + label: '对齐方式:', + subTitle: 'direction', + selectIndex: widget.attr.alignment.index, + data: AttrAlignment.values, + calcFun: (AttrAlignment data) => data.name, + onSelect: (AttrAlignment value) { + widget.onAttrChange(widget.attr.copyWith(alignment: value)); + }, + ), + ItemSelector( + label: '适应模式:', + subTitle: 'fit', + selectIndex: widget.attr.fit.index, + data: StackFit.values, + calcFun: (StackFit data) => data.name, + onSelect: (StackFit value) { + widget.onAttrChange(widget.attr.copyWith(fit: value)); + }, + ), + ItemSelector( + label: '文字方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(_widthCtrl.text); + final double? height = double.tryParse(_heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } + + @override + void dispose() { + _widthCtrl.dispose(); + _heightCtrl.dispose(); + super.dispose(); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_playground.dart new file mode 100644 index 00000000..3a22f8f2 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_playground.dart @@ -0,0 +1,137 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../cons.dart'; +import '../../data/flex_attr.dart'; +import '../../data/stack_attr.dart'; +import '../display_item.dart'; +import 'stack_op_panel.dart'; + +class StackPlayground extends StatefulWidget { + const StackPlayground({super.key}); + + @override + State createState() => _StackPlaygroundState(); +} + +class _StackPlaygroundState extends State { + List _data = []; + StackAttr _attr = StackAttr(); + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _data = [ + DisplayItem(width: 80, height: 80, color: kColors[3]), + DisplayItem(width: 60, height: 60, color: kColors[2]), + DisplayItem(width: 40, height: 40, color: kColors[1]), + DisplayItem(width: 20, height: 20, color: kColors[0]), + ]; + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: SizedBox( + width: 200, + height: 200, + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: StackDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )), + ), + )), + const VerticalDivider(), + SizedBox( + width: 200, + child: StackOpTool( + attr: _attr, + onReset: ()=>_onAttrChange(StackAttr()), + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + )), + ], + ); + } + + void _onAttrChange(StackAttr attr) { + setState(() { + _attr = attr; + }); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + print(size); + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } +} + +class StackDisplay extends StatelessWidget { + final List items; + final StackAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const StackDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Stack( + fit: attr.fit, + alignment: attr.alignment.value, + textDirection: attr.textDirection, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart new file mode 100644 index 00000000..61f65d56 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart @@ -0,0 +1,172 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:layout/src/views/playground/view/form_item/value_input.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/wrap_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + +class WrapOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final WrapAttr attr; + final ValueChanged onAttrChange; + final VoidCallback onReset; + + const WrapOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _WrapOpToolState(); +} + +class _WrapOpToolState extends State { + final TextEditingController widthCtrl = TextEditingController(text: '24'); + final TextEditingController heightCtrl = TextEditingController(text: '64'); + final TextEditingController spacingCtrl = TextEditingController(text: "0"); + final TextEditingController rubSpacingCtrl = TextEditingController(text: "0"); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Wrap 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction(child: Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), + TolyAction(child: Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), + ], + ), + ), + ItemSizeInput( + widthCtrl: widthCtrl, + heightCtrl: heightCtrl, + ), + const SizedBox(height: 12), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction( + child: const Icon(CupertinoIcons.refresh, size: 16), onTap: widget.onReset), + ], + ), + ), + ItemSelector( + label: '排列方向:', + subTitle: 'direction', + selectIndex: widget.attr.direction.index, + data: Axis.values, + calcFun: (Axis data) => data.name, + onSelect: (Axis value) { + widget.onAttrChange(widget.attr.copyWith(direction: value)); + }, + ), + ItemSelector( + label: '主轴对齐:', + subTitle: 'mainAlignment', + selectIndex: widget.attr.mainAlignment.index, + data: WrapAlignment.values, + calcFun: (WrapAlignment data) => data.name, + onSelect: (WrapAlignment value) { + widget.onAttrChange(widget.attr.copyWith(mainAlignment: value)); + }, + ), + ItemSelector( + label: '交叉轴对齐:', + subTitle: 'crossAxisAlignment', + selectIndex: widget.attr.crossAxisAlignment.index, + data: WrapCrossAlignment.values, + calcFun: (WrapCrossAlignment data) => data.name, + onSelect: (WrapCrossAlignment value) { + widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); + }, + ), + ItemSelector( + label: '叉轴对齐:', + subTitle: 'runAlignment', + selectIndex: widget.attr.runAlignment.index, + data: WrapAlignment.values, + calcFun: (WrapAlignment data) => data.name, + onSelect: (WrapAlignment value) { + widget.onAttrChange(widget.attr.copyWith(runAlignment: value)); + }, + ), + ItemSelector( + label: '垂直方向:', + subTitle: 'verticalDirection', + selectIndex: widget.attr.verticalDirection.index, + data: VerticalDirection.values, + calcFun: (VerticalDirection data) => data.name, + onSelect: (VerticalDirection value) { + widget.onAttrChange(widget.attr.copyWith(verticalDirection: value)); + }, + ), + ItemSelector( + label: '文字方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ValueInput( + label: '主轴间距:', + subtitle: 'spacing', + onChange: (String v) { + widget.onAttrChange(widget.attr.copyWith(spacing: double.tryParse(v))); + }, + ), + ValueInput( + label: '叉轴间距:', + subtitle: 'runSpacing', + onChange: (String v) { + widget.onAttrChange(widget.attr.copyWith(runSpacing: double.parse(v))); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(widthCtrl.text); + final double? height = double.tryParse(heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart new file mode 100644 index 00000000..5c7d94e8 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart @@ -0,0 +1,158 @@ +// Copyright 2014 The 星星 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-06-25 +// Contact Me: 1981462002@qq.com + +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/wrap_attr.dart'; +import '../display_item.dart'; +import '../form_item/item_size_input.dart'; +import 'wrap_op_panel.dart'; + +const List kColors = [ + Color(0xffd23eb9), + Color(0xff2164c7), + Color(0xffd5a213), + Color(0xff16e848), +]; + +class WrapPlayground extends StatefulWidget { + const WrapPlayground({super.key}); + + @override + State createState() => _WrapPlaygroundState(); +} + +class _WrapPlaygroundState extends State { + List _data = []; + late WrapAttr _attr; + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _reset(); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: WrapDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )))), + const VerticalDivider(), + SizedBox( + width: 210, + child: WrapOpTool( + attr: _attr, + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + onReset: _reset, + )), + ], + ); + } + + void _reset() { + _attr = const WrapAttr(); + _data = [ + DisplayItem(width: 20, height: 20, color: kColors[0]), + DisplayItem(width: 10, height: 80, color: kColors[1]), + DisplayItem(width: 40, height: 30, color: kColors[2]), + DisplayItem(width: 60, height: 20, color: kColors[3]), + ]; + setState(() {}); + } + + void _onAttrChange(WrapAttr attr) { + _attr = attr; + setState(() {}); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + print(size); + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } +} + +class WrapDisplay extends StatelessWidget { + final List items; + final WrapAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const WrapDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + direction: attr.direction, + alignment: attr.mainAlignment, + crossAxisAlignment: attr.crossAxisAlignment, + spacing: attr.spacing, + textDirection: attr.textDirection, + verticalDirection: attr.verticalDirection, + runAlignment: attr.runAlignment, + runSpacing: attr.runSpacing, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} + diff --git a/modules/knowledge_system/layout/lib/src/views/popable/autocomplete_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/autocomplete_demo.dart new file mode 100644 index 00000000..ac64c76d --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/popable/autocomplete_demo.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class AutocompleteDemo extends StatelessWidget { + const AutocompleteDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Center( + child: Autocomplete( + optionsBuilder: buildOptions, + onSelected: onSelected, + ), + ), + ); + } + + void onSelected(String selection) { + debugPrint('当前选择了 $selection'); + } + + Future> buildOptions( + TextEditingValue textEditingValue, + ) async { + if (textEditingValue.text == '') { + return const Iterable.empty(); + } + return searchByArgs(textEditingValue.text); + } + + Future> searchByArgs(String args) async{ + // 模拟网络请求 + await Future.delayed(const Duration(milliseconds: 200)); + const List data = [ + 'toly', 'toly49', 'toly42', 'toly56', + 'card', 'ls', 'alex', 'fan sha', + ]; + return data.where((String name) => name.contains(args)); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/popable/dropdown_button_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_button_demo.dart new file mode 100644 index 00000000..66755554 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_button_demo.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 55, +// "name": 'DropdownButton基本用法', +// "priority": 1, +// "subtitle": +// "【value】 : 当前值 【T】\n" +// "【items】 : 下拉选框 【List>】\n" +// "【icon】 : 图标 【Widget】\n" +// "【elevation】 : 影深 【double】\n" +// "【onChanged】 : 选择条目事件 【Function(T)】\n" +// "【backgroundColor】 : 背景色 【Color】", +// } +class CustomDropDownButton extends StatefulWidget { + const CustomDropDownButton({Key? key}) : super(key: key); + + @override + _CustomDropDownButtonState createState() => _CustomDropDownButtonState(); +} + +class _CustomDropDownButtonState extends State { + Color _color = Colors.red; + final List _colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + DropdownButton( + value: _color, + elevation: 1, + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (v) => setState(() => _color = v??Colors.blue)), + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} \ No newline at end of file diff --git a/modules/knowledge_system/layout/lib/src/views/popable/dropdown_menu_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_menu_demo.dart new file mode 100644 index 00000000..f1d839e9 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_menu_demo.dart @@ -0,0 +1,63 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 370 DropdownMenu 表单菜单 +/// 下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。 +/// link: 55 +// { +// "widgetId": 370, +// "name": '下拉菜单的简单使用', +// "priority": 1, +// "subtitle": +// "【dropdownMenuEntries】 : 菜单条目列表 【List>】\n" +// "【initialSelection】 : 表单验证回调 【T?】\n" +// "【onSelected】 : 表单保存回调 【ValueChanged?】\n" +// "【menuHeight】 : 菜单高度 【double】\n" +// "【width】 : 输入框宽度 【double】", +// } +class DropdownMenuNode1 extends StatefulWidget { + const DropdownMenuNode1({super.key}); + + @override + State createState() => _DropdownMenuNode1State(); +} + +class _DropdownMenuNode1State extends State { + final List data = ['语文', '数学', '英语', '物理', '化学', '生物', '地理']; + late String _dropdownValue = data.first; + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField(), + // DropdownMenu( + // requestFocusOnTap: false, + // menuHeight: 200, + // initialSelection: data.first, + // onSelected: _onSelect, + // dropdownMenuEntries: _buildMenuList(data), + // ), + const SizedBox(height: 8,), + Text('你选择的学科是: $_dropdownValue') + ], + ), + ); + } + + void _onSelect(String? value) { + // setState(() { + // _dropdownValue = value!; + // }); + } + + List> _buildMenuList(List data) { + return data.map((String value) { + return DropdownMenuEntry(value: value, label: value); + }).toList(); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart new file mode 100644 index 00000000..f69c8248 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class GridViewDemo01 extends StatelessWidget { + GridViewDemo01({super.key}); + + final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: GridView.count( + crossAxisCount: 4, + mainAxisSpacing: 2, + crossAxisSpacing: 2, + childAspectRatio: 1 / 0.618, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Container _buildItem(Color color) => Container( + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ), + ), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + +} diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart new file mode 100644 index 00000000..d9dd06d2 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class ListViewDemo01 extends StatelessWidget { + const ListViewDemo01({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.builder( + itemCount: 100, + itemBuilder: (_, index) { + return Card( + child: ListTile( + tileColor: Colors.transparent, + title: Text('Test index:$index'), + )); + }), + ); + } +} diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart new file mode 100644 index 00000000..f1f7053f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +const List kColors3 = [Colors.blue,Colors.red, Colors.green, Colors.orange]; + +class PageViewDemo01 extends StatelessWidget { + PageViewDemo01({super.key}); + + final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: PageView.builder( + itemCount: 8, + itemBuilder: (_, index) { + Color color = kColors3[index % kColors3.length]; + return Container( + color: color, + alignment: Alignment.center, + child: Text( + 'Page ${index + 1}\n${colorString(color)}', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 18, color: Colors.white), + ), + ); + }), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/knowledge_system/layout/lib/src/views/test_show.dart b/modules/knowledge_system/layout/lib/src/views/test_show.dart new file mode 100644 index 00000000..34b46ae9 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/test_show.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class TextShow extends StatelessWidget { + final String info; + + const TextShow({super.key, required this.info}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.white, + child: Center(child: Text(info)), + ); + } +} diff --git a/modules/knowledge_system/layout/pubspec.yaml b/modules/knowledge_system/layout/pubspec.yaml new file mode 100644 index 00000000..a1d73812 --- /dev/null +++ b/modules/knowledge_system/layout/pubspec.yaml @@ -0,0 +1,52 @@ +name: layout +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/knowledge_system/layout/test/layout_test.dart b/modules/knowledge_system/layout/test/layout_test.dart new file mode 100644 index 00000000..8a6cc84f --- /dev/null +++ b/modules/knowledge_system/layout/test/layout_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:layout/layout.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/modules/knowledge_system/note/.gitignore b/modules/knowledge_system/note/.gitignore new file mode 100644 index 00000000..eb6c05cd --- /dev/null +++ b/modules/knowledge_system/note/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/modules/knowledge_system/note/.metadata b/modules/knowledge_system/note/.metadata new file mode 100644 index 00000000..ab15d7af --- /dev/null +++ b/modules/knowledge_system/note/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "c519ee916eaeb88923e67befb89c0f1dabfa83e6" + channel: "stable" + +project_type: package diff --git a/modules/knowledge_system/note/CHANGELOG.md b/modules/knowledge_system/note/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/knowledge_system/note/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/knowledge_system/note/LICENSE b/modules/knowledge_system/note/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/knowledge_system/note/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/knowledge_system/note/README.md b/modules/knowledge_system/note/README.md new file mode 100644 index 00000000..e316598f --- /dev/null +++ b/modules/knowledge_system/note/README.md @@ -0,0 +1,2 @@ +#### 匠心巧记 模块 +打造便捷使用的 [全端同步] 笔记 \ No newline at end of file diff --git a/modules/knowledge_system/note/analysis_options.yaml b/modules/knowledge_system/note/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/knowledge_system/note/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/knowledge_system/note/lib/note.dart b/modules/knowledge_system/note/lib/note.dart new file mode 100644 index 00000000..4e8b4746 --- /dev/null +++ b/modules/knowledge_system/note/lib/note.dart @@ -0,0 +1,7 @@ +export 'src/view/view.dart'; +export 'src/bloc/bloc.dart'; +export 'src/bloc/news_bloc.dart'; +export 'src/repository/repository.dart'; +export 'src/env/env.dart'; +export 'package:flutter_quill/flutter_quill.dart' + show FlutterQuillLocalizations; diff --git a/modules/knowledge_system/note/lib/src/bloc/bloc.dart b/modules/knowledge_system/note/lib/src/bloc/bloc.dart new file mode 100644 index 00000000..cb588085 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/bloc/bloc.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/src/repository/article_repository.dart'; +import 'package:note/src/repository/model/article.dart'; + +import '../repository/model/model.dart'; + +class ArtSysBloc extends Cubit { + ArtSysBloc() : super(ArtSysState(articles: [])); + + final ArticleRepository _repository = HttpArticleRepository(); + + TextEditingController titleCtrl = TextEditingController(); + TextEditingController ctrl = TextEditingController(); + + Future loadFirstFrame() async { + if (state.articles.isEmpty) { + emit(state.copyWith(status: const LoadingStatus())); + } + ApiRet> ret = await _repository.list(SizeFilter()); + if (ret.success) { + ArtSysState newState = state.copyWith( + articles: ret.data, + status: SuccessStatus(ret.paginate?.total ?? 0), + ); + emit(newState); + _openCurrent(); + return; + } + print(ret.trace?.toString()); + ArtSysState newState = state.copyWith( + status: FailedStatus(ret.trace?.error, ret.trace?.stack), + ); + emit(newState); + } + + void _openCurrent() { + int? id = state.active?.id; + if (id != null) { + open(id); + } + } + + Future newArticle() async { + await _repository.create( + ArticleCreatePayload( + subtitle: '', + title: '新建文档', + url: '', + cover: '', + type: 1, + createAt: DateTime.timestamp().toIso8601String(), + ), + ); + await loadFirstFrame(); + } + + void select(ArticlePo article) { + if (article.type == 1) { + open(article.id); + } else {} + titleCtrl.text = article.title; + emit(state.copyWith(active: article)); + } + + void open(int id) async { + ApiRet ret = await _repository.open(id); + if (ret.success) { + ctrl.text = ret.data; + } + } + + void write(String content) async { + int? id = state.active?.id; + if (id != null) { + ApiRet ret = await _repository.write(id, content); + } + } + + void updateTitleV2() { + ArticlePo? article = state.active; + String title = titleCtrl.text; + if (article != null) { + updateTitle(article, title); + } + } + + void updateTitle(ArticlePo article, String title) async { + if (title == article.title) return; + ApiRet ret = await _repository.update( + article.id, ArticleUpdatePayload(title: title)); + if (ret.success) { + open(article.id); + loadFirstFrame(); + titleCtrl.text = ret.data.title; + } else { + print(ret.trace?.error); + } + } + + Future delete() async { + int? id = state.active?.id; + if (id != null) { + ApiRet ret = await _repository.delete(id); + await loadFirstFrame(); + } + } +} + +sealed class ListStatus { + const ListStatus(); +} + +class LoadingStatus extends ListStatus { + const LoadingStatus(); +} + +class SuccessStatus extends ListStatus { + final int total; + + const SuccessStatus(this.total); +} + +class FailedStatus extends ListStatus { + final Object? error; + final StackTrace? trace; + + const FailedStatus(this.error, [this.trace]); +} + +class ArtSysState { + final List articles; + final ArticlePo? active; + final ListStatus status; + + ArtSysState({ + required this.articles, + this.active, + this.status = const LoadingStatus(), + }); + + ArtSysState copyWith({ + List? articles, + ArticlePo? active, + ListStatus? status, + }) { + return ArtSysState( + articles: articles ?? this.articles, + active: active ?? this.active, + status: status ?? this.status, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart new file mode 100644 index 00000000..74623de1 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart @@ -0,0 +1,60 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dao/src/table/dao.dart'; +import 'package:note/note.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +class NewsBloc extends Cubit + with Cacheable>, TimeoutCache> { + NewsBloc() : super(NewsState(headerNews: [])); + + final ArticleRepository _repository = HttpArticleRepository(); + + void initByCache() async { + List? retCache = await find(shouldRemove: false); + if (retCache != null) { + emit(NewsState(headerNews: retCache)); + return; + } + } + + @override + String get cacheKey => 'flutter.unit.news'; + + void load() async { + List? retCache = await find(); + if (retCache != null) { + print("=====load in cache========="); + emit(NewsState(headerNews: retCache)); + return; + } + refreshFromNet(); + } + + Future refreshFromNet() async { + SizeFilter filter = const SizeFilter( + page: 1, + pageSize: 8, + ); + ApiRet> ret = + await _repository.getArticlesByTag(1, filter: filter); + print("=====load in net========="); + if (ret.success) { + save(ret.data); + emit(NewsState(headerNews: ret.data)); + } + } + + @override + ConvertorList> get convertor => (e) { + return e.map(ArticlePo.fromCache).toList(); + }; +} + +class NewsState { + final List headerNews; + + NewsState({ + required this.headerNews, + }); +} diff --git a/modules/knowledge_system/note/lib/src/env/env.dart b/modules/knowledge_system/note/lib/src/env/env.dart new file mode 100644 index 00000000..40fd925f --- /dev/null +++ b/modules/knowledge_system/note/lib/src/env/env.dart @@ -0,0 +1,25 @@ +import 'package:fx_dio/fx_dio.dart'; + +class NoteEnv with NoteModuleBridge { + static NoteEnv? _instance; + + NoteEnv._(); + + factory NoteEnv() { + _instance ??= NoteEnv._(); + return _instance!; + } + + NoteModuleBridge? _bridge; + + void attachBridge(NoteModuleBridge bridge) { + _bridge = bridge; + } + + @override + Host get host => _bridge!.host; +} + +mixin NoteModuleBridge { + Host get host; +} diff --git a/modules/knowledge_system/note/lib/src/repository/article_repository.dart b/modules/knowledge_system/note/lib/src/repository/article_repository.dart new file mode 100644 index 00000000..df436f7f --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/article_repository.dart @@ -0,0 +1,125 @@ +import 'dart:convert'; + +import 'package:fx_dio/fx_dio.dart'; + +import '../env/env.dart'; +import 'model/model.dart'; + +typedef PaginateList = ({List list, int total}); + +abstract class ArticleRepository { + Future> create(ArticleCreatePayload payload); + + Future> open(int id); + + Future> write(int id, String content); + + Future>> list(SizeFilter filter); + + /// 根据标签查询文章列表 + /// [tagId] 标签 id + /// [filter] 分页信息 + Future>> getArticlesByTag( + int tagId, { + SizeFilter? filter, + }); + + Future> delete(int id); + + Future> update(int id, ArticleUpdatePayload payload); + + Future> loadArticleTree(); +} + +class HttpArticleRepository implements ArticleRepository { + Host get host => NoteEnv().host; + + @override + Future> create(ArticleCreatePayload payload) { + return host.post( + '/article', + data: payload.apiData, + convertor: (rep) => rep['status'] == true, + ); + } + + @override + Future> delete(int id) { + return host.delete( + '/article/$id', + convertor: (rep) => rep['status'] == true, + ); + } + + @override + Future>> list(SizeFilter filter) { + return host.get>( + '/article', + queryParameters: { + 'page': filter.page, + 'page_size': filter.pageSize, + }, + convertor: (data) { + return data.map(ArticlePo.fromApi).toList(); + }, + ); + } + + @override + Future> open(int id) { + return host.get( + '/article/open/$id', + convertor: (rep) => rep, + ); + } + + @override + Future> write(int id, String content) { + return host.post( + '/article/write', + data: { + 'article_id': id, + 'content': content, + }, + convertor: (rep) { + return rep; + }, + ); + } + + @override + Future> update(int id, ArticleUpdatePayload payload) { + return host.put( + '/article/$id', + data: payload.apiData, + convertor: (rep) { + return ArticlePo.fromApi(rep); + }, + ); + } + + @override + Future> loadArticleTree() { + return host.get( + '/category', + convertor: (rep) { + return Hierarchy.fromJson(rep['data']); + }, + ); + } + + @override + Future>> getArticlesByTag(int tagId, + {SizeFilter? filter}) { + SizeFilter size = filter ?? const SizeFilter(); + return host.get>( + '/article/tag', + queryParameters: { + 'tag_id': tagId, + 'page': size.page, + 'page_size': size.pageSize, + }, + convertor: (data) => data.map(ArticlePo.fromApi).toList(), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/article.dart b/modules/knowledge_system/note/lib/src/repository/model/article.dart new file mode 100644 index 00000000..5b278bbb --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/article.dart @@ -0,0 +1,143 @@ +import 'package:fx_dao/fx_dao.dart'; +import 'package:intl/intl.dart'; + +DateFormat _noteTimeShort = DateFormat('yyyy/M/d'); +DateFormat _noteTimeLong = DateFormat('yyyy/M/d HH:mm:ss'); +Duration offset = DateTime.now().timeZoneOffset; + +enum ArticleType { + net, + custom, +} + +class ArticlePo implements Po { + final String title; + final String? subtitle; + final String url; + final String? cover; + final int create; + final int update; + final int id; + final int status; + final int type; + + ArticlePo({ + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + this.status = 0, + this.type = 0, + this.id = -1, + }); + + String get updateDate { + return _noteTimeLong + .format(DateTime.fromMillisecondsSinceEpoch(update).add(offset)); + } + + String get createDate => _noteTimeShort + .format(DateTime.fromMillisecondsSinceEpoch(create).add(offset)); + + factory ArticlePo.fromApi(dynamic map) => ArticlePo( + id: map['article_id'] ?? 0, + title: map['title'] ?? '', + type: map['type'] ?? '', + status: map['status'] ?? '', + create: DateTime.parse(map['create_at']).millisecondsSinceEpoch, + update: DateTime.parse(map['update_at']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', + ); + + factory ArticlePo.fromCache(dynamic map) => ArticlePo( + id: map['article_id'] ?? 0, + title: map['title'] ?? '', + type: map['type'] ?? '', + status: map['status'] ?? '', + create: map['create_at'], + update: map['update'], + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', + ); + + @override + Map toJson() { + return { + 'article_id': id, + 'title': title, + 'type': type, + 'status': status, + 'create_at': create, + 'update': update, + 'url': url, + 'cover': cover, + }; + } +} + +class ArticleCreatePayload { + final String subtitle; + final String title; + final String url; + final int type; + final String cover; + final String createAt; + + ArticleCreatePayload({ + required this.subtitle, + required this.title, + required this.url, + required this.type, + required this.cover, + required this.createAt, + }); + + Map get apiData => { + "title": title, + "create_at": createAt, + "subtitle": subtitle, + "url": url, + "type": type, + "cover": cover, + }; + + Map toJson() => apiData; +} + +class ArticleUpdatePayload { + final String? subtitle; + final String? title; + final String? url; + final String? cover; + + ArticleUpdatePayload({ + this.subtitle, + this.title, + this.url, + this.cover, + }); + + Map get apiData { + Map ret = {}; + if (title != null) { + ret['title'] = title; + } + if (url != null) { + ret['url'] = title; + } + if (subtitle != null) { + ret['subtitle'] = title; + } + if (cover != null) { + ret['cover'] = title; + } + return ret; + } + + Map toJson() => apiData; +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/category.dart b/modules/knowledge_system/note/lib/src/repository/model/category.dart new file mode 100644 index 00000000..f175d011 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/category.dart @@ -0,0 +1,28 @@ +class Hierarchy { + final int cateId; + final String name; + final int cateType; + final int priority; + final List children; + + Hierarchy({ + required this.cateId, + required this.name, + this.cateType = 0, + this.priority = 0, + this.children = const [], + }); + + factory Hierarchy.fromJson(Map json) { + return Hierarchy( + cateId: json['cate_id'] as int, + name: json['name'] as String, + cateType: json['cate_type'] as int? ?? 0, + priority: json['priority'] as int? ?? 0, + children: (json['children'] as List?) + ?.map((child) => Hierarchy.fromJson(child)) + .toList() ?? + [], + ); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/repository/model/model.dart b/modules/knowledge_system/note/lib/src/repository/model/model.dart new file mode 100644 index 00000000..2afcd687 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/model.dart @@ -0,0 +1,4 @@ +export 'status.dart'; +export 'article.dart'; +export 'category.dart'; +export 'query.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/repository/model/query.dart b/modules/knowledge_system/note/lib/src/repository/model/query.dart new file mode 100644 index 00000000..b2d7c236 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/query.dart @@ -0,0 +1,9 @@ +class SizeFilter { + final int pageSize; + final int page; + + const SizeFilter({ + this.pageSize = 20, + this.page = 1, + }); +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/status.dart b/modules/knowledge_system/note/lib/src/repository/model/status.dart new file mode 100644 index 00000000..fe57eceb --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/status.dart @@ -0,0 +1,21 @@ +sealed class TaskStatus { + const TaskStatus(); +} + +class TaskNone extends TaskStatus { + const TaskNone(); +} + +class TaskLoading extends TaskStatus { + const TaskLoading(); +} + +class TaskSuccess extends TaskStatus { + const TaskSuccess(); +} + +class TaskFailed extends TaskStatus { + final Object? error; + final StackTrace? trace; + const TaskFailed(this.error, [this.trace]); +} diff --git a/modules/knowledge_system/note/lib/src/repository/repository.dart b/modules/knowledge_system/note/lib/src/repository/repository.dart new file mode 100644 index 00000000..7c731af3 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/repository.dart @@ -0,0 +1,2 @@ +export 'article_repository.dart'; +export 'model/model.dart'; diff --git a/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart b/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart new file mode 100644 index 00000000..c2ae1fad --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; + +class ArtSysScope extends StatelessWidget { + final Widget child; + + const ArtSysScope({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => ArtSysBloc()..loadFirstFrame(), + child: child, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_admin.dart b/modules/knowledge_system/note/lib/src/view/article_admin.dart new file mode 100644 index 00000000..8038828f --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_admin.dart @@ -0,0 +1,259 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:note/note.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:app/app.dart'; +import 'article_editor.dart'; +import 'article_list.dart'; +import 'desktop/article_display.dart'; + +class ArticleAdmin extends StatefulWidget { + const ArticleAdmin({super.key}); + + @override + State createState() => _ArticleAdminState(); +} + +class _ArticleAdminState extends State { + @override + Widget build(BuildContext context) { + ArtSysBloc bloc = context.watch(); + ListStatus status = bloc.state.status; + bool hasActive = bloc.state.active != null; + + Widget table = switch (status) { + LoadingStatus() => const CupertinoActivityIndicator(), + SuccessStatus() => ArticleList( + articles: bloc.state.articles, + activeId: bloc.state.active?.id ?? -1, + onTap: bloc.select, + onUpdateTitle: bloc.updateTitle, + ), + FailedStatus() => Text("Error:${status.error}"), + }; + return Scaffold( + backgroundColor: Colors.white, + body: Row( + children: [ + Container( + width: 240, + decoration: BoxDecoration(color: Color(0xfffafbfc) + // gradient: LinearGradient(colors: [ + // Color(0xffe9f1f8), + // Color(0xffebf2f8), + // ]) + ), + child: Column( + children: [ + DragToMoveWrapper( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12), + height: 46, + child: Row( + spacing: 6, + children: [ + Icon( + Icons.note_alt_outlined, + color: Theme.of(context).primaryColor, + ), + Text( + '匠心巧记', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Color(0xff242a39)), + ), + Spacer(), + TolyAction( + child: Icon( + Icons.sync, + size: 20, + color: Color(0xff242a39), + ), + onTap: () async { + bloc.loadFirstFrame(); + }, + ), + ], + ), + ), + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: bloc.newArticle, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.add, + color: Colors.white, + ), + Text( + "新建", + style: TextStyle(fontSize: 12), + ), + ], + ), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ), + ), + ], + ), + const SizedBox(height: 16), + Expanded(child: table) + ], + ), + ), + VerticalDivider(), + Expanded( + child: Column( + children: [ + Container( + height: 46, + child: Row( + children: [ + if (hasActive) + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 12.0), + child: TextField( + onTapOutside: (_) => bloc.updateTitleV2(), + onSubmitted: (_) => bloc.updateTitleV2(), + controller: bloc.titleCtrl, + decoration: + InputDecoration(border: InputBorder.none), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + if (!hasActive) Spacer(), + WindowButtons() + ], + ), + ), + Divider(), + // Expanded(child: RichEditor()), + Expanded(child: ArticleDisplay()), + ], + )) + // Expanded( + // child: Column( + // children: [ + // Container( + // height: 52, + // child: Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12.0), + // child: Row( + // children: [ + // Spacer(), + // Button(onPressed: () => showAddDialog(context)), + // ], + // ), + // ), + // ), + // Expanded(child: table), + // Padding( + // padding: const EdgeInsets.all(8.0), + // child: TolyPagination( + // pageSize: 20, + // total: (total*1.0), + // initIndex: currentIndex, + // onPageChanged: _onPageChanged, + // ), + // ) + // ], + // ), + // ), + ], + ), + ); + } + + // void _onPageChanged(int value) { + // queryArticle(value); + // } + + // Future queryArticle(int page) async { + // setState(() { + // status = const TaskLoading(); + // }); + // ApiRet> ret = + // await _repository.list(SizeFilter(page: page)); + // if (ret.success) { + // articles = ret.data.list; + // total = ret.data.total; + // setState(() { + // status = const TaskSuccess(); + // }); + // } else { + // status = TaskFailed(ret.trace); + // setState(() {}); + // } + // } + + void showAddDialog(BuildContext context) { + showDialog( + context: context, + builder: (context) { + return EditArticleDialog( + onCreate: (payload) async { + // 在这里处理更新后的文章 + // ApiRet ret = await _repository.create(payload); + // if (ret.success) { + // currentIndex = 1; + // queryArticle(currentIndex); + // } + }, + ); + }, + ); + } +} + +class RichEditor extends StatefulWidget { + const RichEditor({super.key}); + + @override + State createState() => _RichEditorState(); +} + +class _RichEditorState extends State { + QuillController _controller = QuillController.basic(); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + QuillSimpleToolbar( + controller: _controller, + config: const QuillSimpleToolbarConfig(), + ), + Expanded( + child: QuillEditor.basic( + controller: _controller, + config: const QuillEditorConfig(), + ), + ) + ], + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_editor.dart b/modules/knowledge_system/note/lib/src/view/article_editor.dart new file mode 100644 index 00000000..a1f5bddb --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_editor.dart @@ -0,0 +1,200 @@ + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../repository/model/model.dart'; + + +class EditArticleDialog extends StatefulWidget { + final ArticlePo? article; + final Function(ArticlePo po)? onSave; + final Function(ArticleCreatePayload payload)? onCreate; + + const EditArticleDialog({ + this.article, + this.onSave, + this.onCreate, + }); + + @override + _EditArticleDialogState createState() => _EditArticleDialogState(); +} + +class _EditArticleDialogState extends State { + late TextEditingController _titleController; + late TextEditingController _subtitleController; + late TextEditingController _urlController; + late TextEditingController _coverController; + late TextEditingController _columnController; + + @override + void initState() { + super.initState(); + if (widget.article != null) { + _titleController = TextEditingController(text: widget.article!.title); + _subtitleController = + TextEditingController(text: widget.article!.subtitle); + _urlController = TextEditingController(text: widget.article!.url); + _coverController = TextEditingController(text: widget.article!.cover); + _columnController = TextEditingController(); + } else { + _titleController = TextEditingController(); + _subtitleController = TextEditingController(); + _urlController = TextEditingController(); + _coverController = TextEditingController(); + _columnController = TextEditingController(); + } + } + + @override + void dispose() { + _titleController.dispose(); + _subtitleController.dispose(); + _urlController.dispose(); + _coverController.dispose(); + super.dispose(); + } + + bool get editModel => widget.article != null; + + @override + Widget build(BuildContext context) { + Palette foreground = const Palette( + normal: Color(0xff606266), + hover: Color(0xff096dd9), + pressed: Color(0xff096dd9)); + Palette border = const Palette( + normal: Color(0xffd9d9d9), + hover: Color(0x44409eff), + pressed: Color(0xff096dd9)); + Palette bg = const Palette( + normal: Color(0xff1890ff), + hover: Color(0xffecf5ff), + pressed: Color(0xffecf5ff)); + return AlertDialog( + title: Text( + editModel ? '编辑文章' : '新增文章', + style: TextStyle(fontSize: 16), + ), + content: SizedBox( + width: 420, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + Row( + children: [ + Text('文章标题: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _titleController, + ), + ), + ], + ), + // TextField( + // controller: _titleController, + // decoration: InputDecoration(labelText: 'Title'), + // ), + Row( + children: [ + Text('文章摘要: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _subtitleController, + ), + ), + ], + ), + Row( + children: [ + Text('文章链接: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _urlController, + ), + ), + ], + ), + Row( + children: [ + Text('专栏收录: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _columnController, + ), + ), + ], + ), + if (_coverController.text.isNotEmpty) + Image.network(_coverController.text), + if (_coverController.text.isEmpty) + Row( + children: [ + Text('文章封面: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _coverController, + ), + ), + ], + ), + ], + ), + ), + ), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text("取消"), + style: OutlineButtonPalette( + foregroundPalette: foreground, + borderPalette: border, + backgroundPalette: bg, + ).style, + ), + ElevatedButton( + onPressed: () { + ArticleCreatePayload payload = ArticleCreatePayload( + subtitle: _subtitleController.text, + title: _titleController.text, + url: _urlController.text, + cover: _coverController.text, + type: 1, + createAt: DateTime.now().toIso8601String(), + ); + widget.onCreate?.call(payload); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + "保存", + style: TextStyle(fontSize: 14), + ), + ], + ), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ) + ], + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_item.dart b/modules/knowledge_system/note/lib/src/view/article_item.dart new file mode 100644 index 00000000..a8879bd6 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_item.dart @@ -0,0 +1,45 @@ +// import 'package:flutter/material.dart'; +// import 'package:tolyui/tolyui.dart'; +// +// import '../repository/model/model.dart'; +// import 'article_editor.dart'; +// +// class ArticleItem extends StatelessWidget { +// final ArticlePo article; +// final int index; +// const ArticleItem({super.key, required this.article, required this.index}); +// +// @override +// Widget build(BuildContext context) { +// return Container( +// color: index % 2 == 0 ? const Color(0xfff7f9f9) : Colors.white, +// padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 12), +// child: Row( +// children: [ +// Text( +// article.title, +// style: const TextStyle(fontWeight: FontWeight.bold), +// ), +// const Spacer(), +// TolyAction( +// child: const Icon(Icons.edit, size: 20), +// onTap: () { +// showDialog( +// context: context, +// builder: (context) { +// return EditArticleDialog( +// article: article, +// onSave: (updatedArticle) { +// // 在这里处理更新后的文章 +// // print('Updated Article: ${updatedArticle.}'); +// }, +// ); +// }, +// ); +// }) +// ], +// ), +// ); +// } +// } +// diff --git a/modules/knowledge_system/note/lib/src/view/article_list.dart b/modules/knowledge_system/note/lib/src/view/article_list.dart new file mode 100644 index 00000000..55dffa5f --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_list.dart @@ -0,0 +1,173 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/gestures/events.dart'; +import 'package:note/src/repository/model/model.dart'; +import 'package:tolyui/tolyui.dart'; + +class ArticleList extends StatelessWidget { + final List articles; + final ValueChanged onTap; + final int activeId; + final OnUpdateTitle onUpdateTitle; + + const ArticleList( + {super.key, + required this.articles, + required this.activeId, + required this.onTap, + required this.onUpdateTitle}); + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: articles.length, + itemBuilder: (_, index) => ArticleItem( + onTap: onTap, + active: articles[index].id == activeId, + article: articles[index], + onUpdateTitle: onUpdateTitle, + ), + ); + } +} + +typedef OnUpdateTitle = Function(ArticlePo article, String title); + +class ArticleItem extends StatefulWidget { + final bool active; + final ArticlePo article; + final ValueChanged onTap; + final OnUpdateTitle onUpdateTitle; + + const ArticleItem({ + super.key, + required this.active, + required this.article, + required this.onTap, + required this.onUpdateTitle, + }); + + @override + State createState() => _ArticleItemState(); +} + +class _ArticleItemState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + child: GestureDetector( + onTap: () => widget.onTap(widget.article), + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: 8), + margin: EdgeInsets.symmetric(horizontal: 6), + width: 240, + decoration: BoxDecoration( + color: widget.active + ? Color(0xffd7e2ff) + : _hovered + ? Color(0xffe1e6ed) + : null, + borderRadius: BorderRadius.circular(4)), + height: 32, + child: Row( + spacing: 6, + children: [ + Icon( + widget.article.type == 1 ? Icons.event_note : Icons.wordpress, + size: 20, + color: widget.active ? Color(0xff5b89fe) : Color(0xffa6aebd), + ), + Expanded( + child: _editMode + ? TextField( + focusNode: _focusNode, + decoration: InputDecoration( + isCollapsed: true, border: InputBorder.none), + style: TextStyle( + fontSize: 14, + fontWeight: widget.active ? FontWeight.bold : null, + color: widget.active ? Color(0xff5b89fe) : null), + onTapOutside: (_) { + _updateTitle(); + setState(() { + _editMode = false; + }); + }, + onSubmitted: (v) { + _updateTitle(); + setState(() { + _editMode = false; + }); + }, + controller: _ctrl, + ) + : Text( + widget.article.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: widget.active ? FontWeight.bold : null, + color: widget.active ? Color(0xff5b89fe) : null), + ), + ), + if (_hovered) + TolyAction( + child: Icon( + _editMode ? Icons.check : Icons.edit, + size: 16, + color: Color(0xff4e5a70), + ), + onTap: () { + if (_editMode) { + _updateTitle(); + setState(() { + _editMode = false; + }); + return; + } + + widget.onTap(widget.article); + _ctrl = TextEditingController(text: widget.article.title); + _focusNode = FocusNode(); + Future.delayed(Duration(milliseconds: 20)).then((_) { + _focusNode!.requestFocus(); + _ctrl!.value = _ctrl!.value.copyWith( + selection: TextSelection( + baseOffset: 0, + extentOffset: _ctrl!.text.length)); + }); + setState(() { + _editMode = true; + }); + }), + ], + ), + ), + ), + ); + } + + void _updateTitle() { + String value = _ctrl?.text ?? ''; + if (value.isEmpty) return; + widget.onUpdateTitle(widget.article, _ctrl?.text ?? ''); + } + + bool _hovered = false; + bool _editMode = false; + TextEditingController? _ctrl; + FocusNode? _focusNode; + void _onEnter(PointerEnterEvent event) { + setState(() { + _hovered = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hovered = false; + }); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/components/button/button.dart b/modules/knowledge_system/note/lib/src/view/components/button/button.dart new file mode 100644 index 00000000..e9f6103e --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/components/button/button.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +class Button extends StatelessWidget { + final VoidCallback onPressed; + + const Button({super.key, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: onPressed, + child: const Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.add, + size: 20, + color: Colors.white, + ), + Text( + "新增", + style: TextStyle(fontSize: 14), + ), + ], + ), + style: FillButtonPalette( + foregroundPalette: const Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart b/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart new file mode 100644 index 00000000..1d653e41 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; +import 'package:tolyui/tolyui.dart'; +import '../../repository/model/article.dart'; + +class ArticleDisplay extends StatelessWidget { + const ArticleDisplay({super.key}); + + @override + Widget build(BuildContext context) { + ArticlePo? selected = + context.select((ArtSysBloc bloc) => bloc.state.active); + if (selected == null) { + return SizedBox(); + } + if (selected.type == ArticleType.net.index) { + return NetworkArticleDisplay( + article: selected, + ); + } + return TextField( + style: TextStyle(fontSize: 14), + onChanged: (text) => context.read().write(text), + maxLines: null, + minLines: null, + controller: context.read().ctrl, + expands: true, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 8, + )), + ); + return const Placeholder(); + } +} + +class NetworkArticleDisplay extends StatelessWidget { + final ArticlePo article; + + const NetworkArticleDisplay({super.key, required this.article}); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + width: 300, + decoration: BoxDecoration( + border: Border.all(), borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 12, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + article.title, + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + if (article.subtitle != null) + Text( + article.subtitle!, + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + Image.network(article.cover ?? ''), + ElevatedButton( + onPressed: () {}, + child: Text('前往查看'), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 24), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ], + ), + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart new file mode 100644 index 00000000..60becfac --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/gestures/events.dart'; +import 'package:note/src/repository/model/model.dart'; +import 'package:tolyui/tolyui.dart'; +class MobileArticleList extends StatelessWidget { + final List articles; + final ValueChanged onTap; + final int activeId; + final OnUpdateTitle onUpdateTitle; + + const MobileArticleList( + {super.key, + required this.articles, + required this.activeId, + required this.onTap, + required this.onUpdateTitle}); + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.symmetric(vertical: 8), + separatorBuilder: (_, __) => SizedBox( + height: 6, + ), + itemCount: articles.length, + itemBuilder: (_, index) => MobileArticleItem( + onTap: onTap, + active: articles[index].id == activeId, + article: articles[index], + onUpdateTitle: onUpdateTitle, + ), + ); + } +} + +typedef OnUpdateTitle = Function(int id, String title); + +class MobileArticleItem extends StatefulWidget { + final bool active; + final ArticlePo article; + final ValueChanged onTap; + final OnUpdateTitle onUpdateTitle; + + const MobileArticleItem({ + super.key, + required this.active, + required this.article, + required this.onTap, + required this.onUpdateTitle, + }); + + @override + State createState() => _MobileArticleItemState(); +} + +class _MobileArticleItemState extends State { + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => widget.onTap(widget.article), + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(4)), + child: Column( + spacing: 4, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + spacing: 6, + children: [ + Icon( + widget.article.type == 1 ? Icons.event_note : Icons.wordpress, + size: 20, + color: Color(0xffa6aebd), + ), + Expanded( + child: Text( + widget.article.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.bold,), + ), + ), + ], + ), + Row( + children: [ + Text( + style: TextStyle(fontSize: 12), + widget.article.createDate, + ), + Text(" → "), + Text( + style: TextStyle(fontSize: 12), + widget.article.updateDate, + ) + ], + ) + ], + ), + ), + ); + } + + void _updateTitle() { + String value = _ctrl?.text ?? ''; + if (value.isEmpty) return; + widget.onUpdateTitle(widget.article.id, _ctrl?.text ?? ''); + } + + TextEditingController? _ctrl; + FocusNode? _focusNode; +} + +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第一篇',style: TextStyle(fontWeight: FontWeight.bold,color: Color(0xff5b89fe)),), +// ), +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// // color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第二篇',style: TextStyle(color: Colors.black),), +// ), diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart new file mode 100644 index 00000000..817d43ed --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart @@ -0,0 +1,104 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_dio/fx_dio.dart'; + +import '../../repository/article_repository.dart'; +import '../../repository/model/model.dart'; +import '../article_list.dart'; +import 'mobile_article_list.dart'; +import 'mobile_editor.dart'; +import 'note.dart'; + +class MobileArticlePage extends StatefulWidget { + const MobileArticlePage({super.key}); + + @override + State createState() => _MobileArticlePageState(); +} + +class _MobileArticlePageState extends State { + ArticleRepository _repository = HttpArticleRepository(); + + @override + void initState() { + super.initState(); + _queryScienceArticle(); + } + + List articles = []; + int total = 0; + int currentIndex = 1; + ArticlePo? active; + TaskStatus status = const TaskNone(); + + TextEditingController ctrl = TextEditingController(); + TextEditingController titleCtrl = TextEditingController(); + + Future _queryScienceArticle() async { + setState(() { + status = const TaskLoading(); + }); + ApiRet> ret = await _repository.list(SizeFilter()); + if (ret.success) { + articles = ret.data; + total = ret.paginate?.total ?? 0; + setState(() { + status = TaskSuccess(); + }); + } else { + status = TaskFailed(ret.trace); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + return PinnedHeaderSliverNode2(); + Widget body = switch (status) { + TaskNone() => SizedBox(), + TaskLoading() => const CupertinoActivityIndicator(), + TaskSuccess() => MobileArticleList( + articles: articles, + activeId: active?.id ?? -1, + onTap: (ArticlePo article) { + if (article.type == 1) { + Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return MobileEditor( + article: article, + ); + })); + // _loadArticleContent(article.id); + } else {} + titleCtrl.text = article.title; + + setState(() { + active = article; + }); + }, + onUpdateTitle: updateTitle, + ), + TaskFailed() => Scaffold(), + }; + return Scaffold( + backgroundColor: Color(0xfff5f5f5), + bottomNavigationBar: Container( + height: 56, + ), + floatingActionButton: FloatingActionButton( + shape: StadiumBorder(), + mini: true, + elevation: 4, + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + onPressed: () {}, + child: Icon(Icons.add), + ), + appBar: AppBar( + title: Text('匠心巧记'), + ), + body: body, + ); + } + + updateTitle(int id, String title) {} +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart new file mode 100644 index 00000000..0326c9f1 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart @@ -0,0 +1,226 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/note.dart'; + +import '../../repository/article_repository.dart'; +import '../../repository/model/model.dart'; + +class MobileEditor extends StatefulWidget { + final ArticlePo article; + + const MobileEditor({super.key, required this.article}); + + @override + State createState() => _MobileEditorState(); +} + +class _MobileEditorState extends State { + TextEditingController ctrl = TextEditingController(); + ArticleRepository _repository = HttpArticleRepository(); + FocusNode titleFocusNode = FocusNode(); + + @override + void initState() { + super.initState(); + // _loadArticleContent(widget.article.id); + titleFocusNode.addListener(_titleFocusNode); + } + + // void _loadArticleContent(int id) async { + // ApiRet ret = await _repository.open(id); + // if (ret.success) { + // ctrl.text = ret.data; + // } + // } + + @override + Widget build(BuildContext context) { + ArtSysBloc bloc = context.watch(); + + return Scaffold( + backgroundColor: Color(0xfffafafa), + appBar: AppBar( + surfaceTintColor: Colors.transparent, + backgroundColor: Color(0xfffafafa), + // title: Text(widget.article.title), + actions: [IconButton(onPressed: () { + showBottomTip(context); + }, icon: Icon(Icons.more_vert))], + bottom: PreferredSize( + preferredSize: Size.fromHeight(32), + child: Padding( + padding: const EdgeInsets.only(bottom: 4.0, left: 18), + child: Row( + spacing: 8, + children: [ + Text( + '${bloc.state.active?.updateDate}', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + SizedBox(height: 14, child: VerticalDivider()), + Text( + '${bloc.ctrl.text.length} 字', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + SizedBox(height: 14, child: VerticalDivider()), + Text( + '全部文件', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + ], + ), + )), + ), + body: Column( + children: [ + Divider(), + TextField( + controller: bloc.titleCtrl, + focusNode: titleFocusNode, + maxLines: 4, + minLines: 1, + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + decoration: InputDecoration( + border: InputBorder.none, + isCollapsed: true, + contentPadding: EdgeInsets.only(left: 16, right: 16, top: 8)), + ), + Expanded( + child: TextField( + style: TextStyle(fontSize: 14), + onChanged: (String value) async { + if (widget.article.id != null) { + ApiRet ret = + await _repository.write(widget.article.id, value); + } + }, + maxLines: null, + minLines: null, + controller: bloc.ctrl, + expands: true, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: + EdgeInsets.symmetric(horizontal: 16, vertical: 8)), + ), + ), + ], + ), + ); + } + + void _titleFocusNode() { + print("=====_titleFocusNode============"); + if(!titleFocusNode.hasFocus){ + ArtSysBloc bloc = context.read(); + bloc.updateTitleV2(); + } + } + + void showBottomTip(BuildContext context) { + showCupertinoModalPopup( + context: context, + builder: (_) => PopBottomTip( + onDelete: () async{ + await context.read().delete(); + Navigator.of(context).pop(); + }, + message: '当前文当更多操作', + deleteText: '删除文档', + ), + ); + } +} + + +class PopBottomTip extends StatelessWidget { + final VoidCallback onDelete; + final String message; + final String deleteText; + + const PopBottomTip({ + super.key, + required this.onDelete, + required this.message, + required this.deleteText, + }); + + @override + Widget build(BuildContext context) { + return SafeArea( + bottom: true, + child: Material( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), + topRight: Radius.circular(6), + )), + color: Colors.white, + child: SizedBox( + width: MediaQuery.sizeOf(context).width, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 52, + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 0.5, + color: Colors.grey.withOpacity(0.2)))), + child: Text( + message, + style: TextStyle(color: Color(0xff8f8f8f)), + )), + + InkWell( + splashColor: Colors.white, + onTap: () { + Navigator.of(context).pop(); + onDelete(); + }, + child: Container( + height: 56, + alignment: Alignment.center, + child: Text( + deleteText, + style: TextStyle(color: Color(0xfff14835), fontSize: 16), + )), + ), + Container( + color: Color(0xfff2f3f5), + height: 8, + ), + InkWell( + splashColor: Colors.white, + onTap: () => Navigator.of(context).pop(), + child: Container( + height: 56, + alignment: Alignment.center, + child: Text( + '取消', + style: TextStyle(fontSize: 16), + )), + ), + ], + ), + ), + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/note.dart b/modules/knowledge_system/note/lib/src/view/mobile/note.dart new file mode 100644 index 00000000..a8dc13a6 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/note.dart @@ -0,0 +1,177 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; + +import '../../repository/model/model.dart'; +import 'mobile_article_list.dart'; +import 'mobile_editor.dart'; + +class PinnedHeaderSliverNode2 extends StatefulWidget { + const PinnedHeaderSliverNode2({super.key}); + + @override + State createState() => + _PinnedHeaderSliverNode2State(); +} + +class _PinnedHeaderSliverNode2State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + ArtSysBloc bloc = context.watch(); + ListStatus status = bloc.state.status; + List articles = bloc.state.articles; + bool hasActive = bloc.state.active != null; + return Scaffold( + bottomNavigationBar: Container( + height: 52, + ), + floatingActionButton: FloatingActionButton( + shape: StadiumBorder(), + mini: true, + elevation: 4, + + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + onPressed: () async{ + ArtSysBloc bloc = context.read(); + await bloc.newArticle(); + ArticlePo article = bloc.state.articles.first; + bloc.select(article); + await Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return BlocProvider.value( + value: bloc, + child: MobileEditor( + article: article, + ), + ); + })); + }, + child: Icon(Icons.add), + ), + backgroundColor: Color(0xfff5f5f5), + body: CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + const PinnedHeaderSliver(child: Divider()), + ...ListView.separated( + padding: EdgeInsets.symmetric(vertical: 8), + separatorBuilder: (_, __) => SizedBox( + height: 6, + ), + itemCount: articles.length, + itemBuilder: (_, index) => MobileArticleItem( + onTap: _onTap, + active: false, + article: articles[index], + onUpdateTitle: onUpdateTitle, + ), + ).buildSlivers(context), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(Icons.more_vert); + const TextStyle style = + TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('匠心巧记', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Color(0xfff5f5f5), + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = + TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('匠心巧记', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } + + void _onTap(ArticlePo article) async { + if (article.type == 1) { + ArtSysBloc bloc = context.read(); + bloc.select(article); + await Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return BlocProvider.value( + value: context.read(), + child: MobileEditor( + article: article, + ), + ); + })); + // _loadArticleContent(article.id); + } else {} + } + + onUpdateTitle(int id, String title) {} +} + +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/news/news_page.dart b/modules/knowledge_system/note/lib/src/view/news/news_page.dart new file mode 100644 index 00000000..5e6d84ca --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/news/news_page.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/note.dart'; + +class NewsPage extends StatefulWidget { + final String title; + const NewsPage({super.key, required this.title}); + + @override + State createState() => _NewsPageState(); +} + +class _NewsPageState extends State { + List data = []; + final ArticleRepository _repository = HttpArticleRepository(); + + @override + void initState() { + super.initState(); + _loadData(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 4), + itemExtent: 76, + itemCount: data.length, + itemBuilder: (_, index) => MouseRegion( + cursor: SystemMouseCursors.click, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 4), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: Image.network( + data[index].cover ?? '', + width: 68, + height: 68, + fit: BoxFit.cover, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data[index].title, + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + data[index].subtitle ?? '', + maxLines: 2, + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ), + ], + ), + ), + ), + )); + } + + void _loadData() async { + ApiRet> ret = await _repository.getArticlesByTag(1, + filter: const SizeFilter( + page: 1, + pageSize: 40, + )); + if (ret.success) { + data = ret.data; + setState(() {}); + } + } +} diff --git a/modules/knowledge_system/note/lib/src/view/view.dart b/modules/knowledge_system/note/lib/src/view/view.dart new file mode 100644 index 00000000..d5a50f18 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/view.dart @@ -0,0 +1,4 @@ +export 'article_admin.dart'; +export 'art_sys_scope.dart'; +export 'mobile/mobile_article_page.dart'; +export 'news/news_page.dart'; diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml new file mode 100644 index 00000000..04cb81d8 --- /dev/null +++ b/modules/knowledge_system/note/pubspec.yaml @@ -0,0 +1,61 @@ +name: note +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.6.1 + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + fx_dio: 0.0.4+3 + fx_dao: 0.0.3+4 + flutter_bloc: ^8.1.6 # 状态管理 + two_dimensional_scrollables: ^0.3.3 + flutter_quill: ^11.0.0-dev.21 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^4.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/modules/knowledge_system/note/test/note_test.dart b/modules/knowledge_system/note/test/note_test.dart new file mode 100644 index 00000000..cbe75440 --- /dev/null +++ b/modules/knowledge_system/note/test/note_test.dart @@ -0,0 +1,3 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:note/note.dart'; diff --git a/modules/knowledge_system/note/test/parser.dart b/modules/knowledge_system/note/test/parser.dart new file mode 100644 index 00000000..863dce2f --- /dev/null +++ b/modules/knowledge_system/note/test/parser.dart @@ -0,0 +1,68 @@ +import 'dart:convert'; + +main(){ + // 示例 JSON 字符串 + final jsonString = ''' + { + "status": true, + "msg": "请求成功!", + "data": { + "cate_id": 1, + "name": "匠心空间", + "cate_type": 0, + "priority": 0, + "children": [ + { + "cate_id": 2, + "name": "全部笔记", + "children": [ + {"cate_id":4, "name":"我的随笔"}, + {"cate_id":5, "name":"编程技术"} + ] + }, + { + "cate_id": 3, + "name": "网络博文", + "children": [ + {"cate_id":6, "name":"掘金文章"}, + {"cate_id":7, "name":"微信公众号"} + ] + } + ] + } + } + '''; + // 解析过程 + final Map parsedJson = jsonDecode(jsonString); + final Category category = Category.fromJson(parsedJson['data']); + print(category); +} + +class Category { + final int cateId; + final String name; + final int cateType; + final int priority; + final List children; + + Category({ + required this.cateId, + required this.name, + this.cateType = 0, + this.priority = 0, + this.children = const [], + }); + + factory Category.fromJson(Map json) { + return Category( + cateId: json['cate_id'] as int, + name: json['name'] as String, + cateType: json['cate_type'] as int? ?? 0, + priority: json['priority'] as int? ?? 0, + children: (json['children'] as List?) + ?.map((child) => Category.fromJson(child)) + .toList() ?? + [], + ); + } +} \ No newline at end of file diff --git a/modules/painting_system/draw_system/.gitignore b/modules/painting_system/draw_system/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/painting_system/draw_system/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/painting_system/draw_system/.metadata b/modules/painting_system/draw_system/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/modules/painting_system/draw_system/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/modules/painting_system/draw_system/CHANGELOG.md b/modules/painting_system/draw_system/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/painting_system/draw_system/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/painting_system/draw_system/LICENSE b/modules/painting_system/draw_system/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/painting_system/draw_system/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/painting_system/draw_system/README.md b/modules/painting_system/draw_system/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/painting_system/draw_system/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/painting_system/draw_system/analysis_options.yaml b/modules/painting_system/draw_system/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/painting_system/draw_system/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/painting_system/draw_system/lib/draw_system.dart b/modules/painting_system/draw_system/lib/draw_system.dart new file mode 100644 index 00000000..ca066748 --- /dev/null +++ b/modules/painting_system/draw_system/lib/draw_system.dart @@ -0,0 +1,6 @@ +library draw_system; + + +export 'src/gallery_detail_page.dart'; +export 'src/gallery_unit.dart'; +export 'src/bloc/gallery_unit/bloc.dart'; \ No newline at end of file diff --git a/lib/painter_system/anim/bezier3_player/bezier3_palyer.dart b/modules/painting_system/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart similarity index 100% rename from lib/painter_system/anim/bezier3_player/bezier3_palyer.dart rename to modules/painting_system/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart diff --git a/lib/painter_system/anim/bezier3_player/touch_info.dart b/modules/painting_system/draw_system/lib/src/anim/bezier3_player/touch_info.dart similarity index 100% rename from lib/painter_system/anim/bezier3_player/touch_info.dart rename to modules/painting_system/draw_system/lib/src/anim/bezier3_player/touch_info.dart diff --git a/lib/painter_system/anim/circle_halo.dart b/modules/painting_system/draw_system/lib/src/anim/circle_halo.dart similarity index 100% rename from lib/painter_system/anim/circle_halo.dart rename to modules/painting_system/draw_system/lib/src/anim/circle_halo.dart diff --git a/lib/painter_system/anim/curve_shower/anim_painter.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/anim_painter.dart similarity index 100% rename from lib/painter_system/anim/curve_shower/anim_painter.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/anim_painter.dart diff --git a/lib/painter_system/anim/curve_shower/curve_anim_shower.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart similarity index 98% rename from lib/painter_system/anim/curve_shower/curve_anim_shower.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart index bf37e495..b45b72b9 100644 --- a/lib/painter_system/anim/curve_shower/curve_anim_shower.dart +++ b/modules/painting_system/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'anim_painter.dart'; diff --git a/lib/painter_system/anim/curve_shower/point_data.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/point_data.dart similarity index 100% rename from lib/painter_system/anim/curve_shower/point_data.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/point_data.dart diff --git a/lib/painter_system/anim/draw_path.dart b/modules/painting_system/draw_system/lib/src/anim/draw_path.dart similarity index 100% rename from lib/painter_system/anim/draw_path.dart rename to modules/painting_system/draw_system/lib/src/anim/draw_path.dart diff --git a/lib/painter_system/anim/dundun_path.dart b/modules/painting_system/draw_system/lib/src/anim/dundun_path.dart similarity index 100% rename from lib/painter_system/anim/dundun_path.dart rename to modules/painting_system/draw_system/lib/src/anim/dundun_path.dart diff --git a/lib/painter_system/anim/rotate_by_point/angle_panter.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/angle_panter.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart diff --git a/lib/painter_system/anim/rotate_by_point/line.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/line.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/line.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/line.dart diff --git a/lib/painter_system/anim/rotate_by_point/rotate_by_point.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/rotate_by_point.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart diff --git a/lib/painter_system/anim/spring_widget.dart b/modules/painting_system/draw_system/lib/src/anim/spring_widget.dart similarity index 100% rename from lib/painter_system/anim/spring_widget.dart rename to modules/painting_system/draw_system/lib/src/anim/spring_widget.dart diff --git a/lib/painter_system/art/circle_packing.dart b/modules/painting_system/draw_system/lib/src/art/circle_packing.dart similarity index 100% rename from lib/painter_system/art/circle_packing.dart rename to modules/painting_system/draw_system/lib/src/art/circle_packing.dart diff --git a/lib/painter_system/art/cubic_disarray.dart b/modules/painting_system/draw_system/lib/src/art/cubic_disarray.dart similarity index 100% rename from lib/painter_system/art/cubic_disarray.dart rename to modules/painting_system/draw_system/lib/src/art/cubic_disarray.dart diff --git a/lib/painter_system/art/hypnotic_squares.dart b/modules/painting_system/draw_system/lib/src/art/hypnotic_squares.dart similarity index 100% rename from lib/painter_system/art/hypnotic_squares.dart rename to modules/painting_system/draw_system/lib/src/art/hypnotic_squares.dart diff --git a/lib/painter_system/art/joy_division.dart b/modules/painting_system/draw_system/lib/src/art/joy_division.dart similarity index 100% rename from lib/painter_system/art/joy_division.dart rename to modules/painting_system/draw_system/lib/src/art/joy_division.dart diff --git a/lib/painter_system/art/piet_mondrian.dart b/modules/painting_system/draw_system/lib/src/art/piet_mondrian.dart similarity index 100% rename from lib/painter_system/art/piet_mondrian.dart rename to modules/painting_system/draw_system/lib/src/art/piet_mondrian.dart diff --git a/lib/painter_system/art/tiled_lines.dart b/modules/painting_system/draw_system/lib/src/art/tiled_lines.dart similarity index 100% rename from lib/painter_system/art/tiled_lines.dart rename to modules/painting_system/draw_system/lib/src/art/tiled_lines.dart diff --git a/lib/painter_system/art/triangular_mesh.dart b/modules/painting_system/draw_system/lib/src/art/triangular_mesh.dart similarity index 100% rename from lib/painter_system/art/triangular_mesh.dart rename to modules/painting_system/draw_system/lib/src/art/triangular_mesh.dart diff --git a/lib/painter_system/art/un_deux_trois.dart b/modules/painting_system/draw_system/lib/src/art/un_deux_trois.dart similarity index 100% rename from lib/painter_system/art/un_deux_trois.dart rename to modules/painting_system/draw_system/lib/src/art/un_deux_trois.dart diff --git a/lib/painter_system/base/clock_widget.dart b/modules/painting_system/draw_system/lib/src/base/clock_widget.dart similarity index 100% rename from lib/painter_system/base/clock_widget.dart rename to modules/painting_system/draw_system/lib/src/base/clock_widget.dart diff --git a/lib/painter_system/base/digital/digital_painter.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_painter.dart similarity index 100% rename from lib/painter_system/base/digital/digital_painter.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_painter.dart diff --git a/lib/painter_system/base/digital/digital_path.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_path.dart similarity index 100% rename from lib/painter_system/base/digital/digital_path.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_path.dart diff --git a/lib/painter_system/base/digital/digital_shower.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_shower.dart similarity index 100% rename from lib/painter_system/base/digital/digital_shower.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_shower.dart diff --git a/lib/painter_system/base/digital/digital_widget.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_widget.dart similarity index 100% rename from lib/painter_system/base/digital/digital_widget.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_widget.dart diff --git a/lib/painter_system/base/draw_grid_axis.dart b/modules/painting_system/draw_system/lib/src/base/draw_grid_axis.dart similarity index 100% rename from lib/painter_system/base/draw_grid_axis.dart rename to modules/painting_system/draw_system/lib/src/base/draw_grid_axis.dart diff --git a/lib/painter_system/base/draw_path_fun.dart b/modules/painting_system/draw_system/lib/src/base/draw_path_fun.dart similarity index 100% rename from lib/painter_system/base/draw_path_fun.dart rename to modules/painting_system/draw_system/lib/src/base/draw_path_fun.dart diff --git a/lib/painter_system/base/draw_picture.dart b/modules/painting_system/draw_system/lib/src/base/draw_picture.dart similarity index 100% rename from lib/painter_system/base/draw_picture.dart rename to modules/painting_system/draw_system/lib/src/base/draw_picture.dart diff --git a/lib/painter_system/base/n_side/n_side_page.dart b/modules/painting_system/draw_system/lib/src/base/n_side/n_side_page.dart similarity index 100% rename from lib/painter_system/base/n_side/n_side_page.dart rename to modules/painting_system/draw_system/lib/src/base/n_side/n_side_page.dart diff --git a/lib/painter_system/base/n_side/shape_painter.dart b/modules/painting_system/draw_system/lib/src/base/n_side/shape_painter.dart similarity index 100% rename from lib/painter_system/base/n_side/shape_painter.dart rename to modules/painting_system/draw_system/lib/src/base/n_side/shape_painter.dart diff --git a/lib/painter_system/base/polar/angle_painter.dart b/modules/painting_system/draw_system/lib/src/base/polar/angle_painter.dart similarity index 100% rename from lib/painter_system/base/polar/angle_painter.dart rename to modules/painting_system/draw_system/lib/src/base/polar/angle_painter.dart diff --git a/lib/painter_system/base/polar/polar.dart b/modules/painting_system/draw_system/lib/src/base/polar/polar.dart similarity index 100% rename from lib/painter_system/base/polar/polar.dart rename to modules/painting_system/draw_system/lib/src/base/polar/polar.dart diff --git a/lib/painter_system/base/polar/polar_painter_widget.dart b/modules/painting_system/draw_system/lib/src/base/polar/polar_painter_widget.dart similarity index 100% rename from lib/painter_system/base/polar/polar_painter_widget.dart rename to modules/painting_system/draw_system/lib/src/base/polar/polar_painter_widget.dart diff --git a/lib/painter_system/base/windmill.dart b/modules/painting_system/draw_system/lib/src/base/windmill.dart similarity index 96% rename from lib/painter_system/base/windmill.dart rename to modules/painting_system/draw_system/lib/src/base/windmill.dart index 0bbd456b..75de225f 100644 --- a/lib/painter_system/base/windmill.dart +++ b/modules/painting_system/draw_system/lib/src/base/windmill.dart @@ -25,6 +25,12 @@ class _WindmillWidgetState extends State super.initState(); } + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return GestureDetector( diff --git a/lib/painter_system/bloc/gallery_unit/bloc.dart b/modules/painting_system/draw_system/lib/src/bloc/gallery_unit/bloc.dart similarity index 100% rename from lib/painter_system/bloc/gallery_unit/bloc.dart rename to modules/painting_system/draw_system/lib/src/bloc/gallery_unit/bloc.dart diff --git a/lib/painter_system/desk_ui/desk_frame.dart b/modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart similarity index 90% rename from lib/painter_system/desk_ui/desk_frame.dart rename to modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart index 6edbc0c9..143c8dbf 100644 --- a/lib/painter_system/desk_ui/desk_frame.dart +++ b/modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -import 'package:flutter_unit/painter_system/picture_frame.dart'; +import '../picture_frame.dart'; +import 'package:l10n/l10n.dart'; /// create by 张风捷特烈 on 2020/12/4 /// contact me by email 1981462002@qq.com @@ -44,9 +43,9 @@ class DeskFrameShower extends StatelessWidget { "作者: $author ", style: const TextStyle(fontSize: 12, fontWeight: FontWeight.bold), ), - const Text( - "源码地址 ", - style: TextStyle( + Text( + "${context.l10n.srcPath} ", + style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.blueAccent), diff --git a/modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart b/modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart new file mode 100644 index 00000000..fef1eb29 --- /dev/null +++ b/modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart @@ -0,0 +1,102 @@ +import 'dart:convert'; + +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; + +import 'package:toly_ui/toly_ui.dart'; + +import '../gallery_card_item.dart'; +import '../gallery_detail_page.dart'; +import '../gallery_factory.dart'; + +/// create by 张风捷特烈 on 2020/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: + +class DeskGalleryUnit extends StatefulWidget { + const DeskGalleryUnit({Key? key}) : super(key: key); + + @override + _DeskGalleryUnitState createState() => _DeskGalleryUnitState(); +} + +class _DeskGalleryUnitState extends State { + final ValueNotifier factor = ValueNotifier(0); + + @override + void dispose() { + factor.dispose(); + super.dispose(); + } + + final ScrollController controller = ScrollController(); + + Color get color => Colors.blue; + + Color get nextColor =>Colors.orangeAccent; + + BoxDecoration get boxDecoration => const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + SimpleDeskTopBar( + leading: Text( + 'Flutter ${context.l10n.paintCollection}', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + Expanded(child: _buildContent()), + ], + ), + ); + } + + Widget _buildContent() { + final List widgets = + (json.decode(StrUnit.galleryDesc(context)) as List).map((e) { + GalleryInfo info = GalleryInfo.fromJson(e); + List children = GalleryFactory.getGalleryByName(info.type,context); + + return FeedbackWidget( + a: 0.95, + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (ctx) => GalleryDetailPage( + galleryInfo: info, + children: children, + ))); + }, + child: GalleryCardItem( + galleryInfo: info, + count: children.length, + ), + ); + }).toList(); + + SliverGridDelegate gridDelegate = + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 320, + mainAxisSpacing: 8, + mainAxisExtent: 340, + crossAxisSpacing: 8, + ); + + return GridView.builder( + controller: controller, + gridDelegate: gridDelegate, + padding: const EdgeInsets.all(12), + itemCount: widgets.length, + itemBuilder: (ctx, index) => widgets[index]); + } +} diff --git a/lib/painter_system/fun/bufeng/bufeng_panel.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart similarity index 97% rename from lib/painter_system/fun/bufeng/bufeng_panel.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart index 2366d017..3a534158 100644 --- a/lib/painter_system/fun/bufeng/bufeng_panel.dart +++ b/modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart @@ -27,7 +27,7 @@ class _BufengPanelState extends State { alignment: Alignment.topCenter, children: [ Padding( - padding: EdgeInsets.only(top: 10), + padding: const EdgeInsets.only(top: 10), child: CustomPaint( painter: PiPainter(config), size: config.size, diff --git a/lib/painter_system/fun/bufeng/config.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/config.dart similarity index 100% rename from lib/painter_system/fun/bufeng/config.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/config.dart diff --git a/lib/painter_system/fun/bufeng/painter.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart similarity index 97% rename from lib/painter_system/fun/bufeng/painter.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart index e15cf9eb..3abe7fba 100644 --- a/lib/painter_system/fun/bufeng/painter.dart +++ b/modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'config.dart'; diff --git a/lib/painter_system/fun/dundun_view.dart b/modules/painting_system/draw_system/lib/src/fun/dundun_view.dart similarity index 100% rename from lib/painter_system/fun/dundun_view.dart rename to modules/painting_system/draw_system/lib/src/fun/dundun_view.dart diff --git a/lib/painter_system/fun/random_portrait.dart b/modules/painting_system/draw_system/lib/src/fun/random_portrait.dart similarity index 100% rename from lib/painter_system/fun/random_portrait.dart rename to modules/painting_system/draw_system/lib/src/fun/random_portrait.dart diff --git a/lib/painter_system/fun/stemp/stamp_data.dart b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_data.dart similarity index 100% rename from lib/painter_system/fun/stemp/stamp_data.dart rename to modules/painting_system/draw_system/lib/src/fun/stemp/stamp_data.dart diff --git a/lib/painter_system/fun/stemp/stamp_paper.dart b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart similarity index 98% rename from lib/painter_system/fun/stemp/stamp_paper.dart rename to modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart index a9f1ebbd..1be90b4a 100644 --- a/lib/painter_system/fun/stemp/stamp_paper.dart +++ b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart @@ -42,7 +42,7 @@ class _StampPaperState extends State @override Widget build(BuildContext context) { - width = MediaQuery.of(context).size.shortestSide * 0.8; + width = MediaQuery.of(context).size.shortestSide * 0.5; return GestureDetector( onTapDown: _onTapDown, diff --git a/lib/painter_system/gallery_card_item.dart b/modules/painting_system/draw_system/lib/src/gallery_card_item.dart similarity index 82% rename from lib/painter_system/gallery_card_item.dart rename to modules/painting_system/draw_system/lib/src/gallery_card_item.dart index f87d13ca..9bded395 100644 --- a/lib/painter_system/gallery_card_item.dart +++ b/modules/painting_system/draw_system/lib/src/gallery_card_item.dart @@ -1,7 +1,9 @@ -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:l10n/l10n.dart'; +import 'gallery_factory.dart'; + /// create by 张风捷特烈 on 2020/11/28 @@ -34,7 +36,7 @@ class GalleryCardItem extends StatelessWidget { Hero( tag: galleryInfo.name, child: Container( - height: 160, + height: 150, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.cover, @@ -49,13 +51,13 @@ class GalleryCardItem extends StatelessWidget { ), Padding( padding: const EdgeInsets.only( - top: 20, left: 15, right: 15, bottom: 10), + top: 8, left: 15, right: 15, bottom: 8), child: Row( children: [ Text( galleryInfo.name, style: TextStyle( - fontSize: 24, + fontSize: 18, fontWeight: FontWeight.bold, shadows: [ Shadow( @@ -70,7 +72,7 @@ class GalleryCardItem extends StatelessWidget { padding: const EdgeInsets.only(left: 6, right: 6, top: 2, bottom: 3), child: Text( - "$count 幅", + "$count ${context.l10n.picture}", style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.white, @@ -81,10 +83,14 @@ class GalleryCardItem extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(left: 15, right: 15, top: 10), + padding: const EdgeInsets.only(left: 15, right: 15, top: 6), child: Text( galleryInfo.info, - style: TextStyle(color: isDark?Colors.white:Colors.grey, shadows: [ + maxLines: 7, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + color: isDark?Colors.white:Colors.grey, shadows: [ Shadow( color: Theme.of(context).primaryColor, offset: const Offset(.2, .2), @@ -103,6 +109,14 @@ class GalleryCardItem extends StatelessWidget { } } +const Map galleryTypeMap = { + GalleryType.base: "基础绘制", + GalleryType.fun: "趣味绘制", + GalleryType.particle: "粒子绘制", + GalleryType.anim: "动画手势", + GalleryType.art: "艺术画廊", +}; + class GalleryInfo { final int count; final String name; @@ -112,7 +126,7 @@ class GalleryInfo { GalleryType get type { GalleryType galleryType = GalleryType.base; - Convert.galleryTypeMap.forEach((key, value) { + galleryTypeMap.forEach((key, value) { if (value == name) { galleryType = key; } diff --git a/lib/painter_system/gallery_detail_page.dart b/modules/painting_system/draw_system/lib/src/gallery_detail_page.dart similarity index 96% rename from lib/painter_system/gallery_detail_page.dart rename to modules/painting_system/draw_system/lib/src/gallery_detail_page.dart index 72fcfe07..9bf82808 100644 --- a/lib/painter_system/gallery_detail_page.dart +++ b/modules/painting_system/draw_system/lib/src/gallery_detail_page.dart @@ -1,10 +1,12 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; /// create by 张风捷特烈 on 2020/12/4 @@ -181,15 +183,15 @@ class _GalleryDetailPageState extends State { } } - bool isDesk = Platform.isMacOS || Platform.isWindows || Platform.isLinux; + bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; Widget buildTitle(BuildContext context) { return Container( - padding: EdgeInsets.only(top: isDesk?26:46, bottom: 10, left: 20, right: 10), + padding: EdgeInsets.only(top: isDesk?26:46, bottom: 10, left: isDesk?20:0, right: 10), child: Row( children: [ - if(isDesk) + // if(isDesk) const BackButton(color: Colors.white,), Text( diff --git a/modules/painting_system/draw_system/lib/src/gallery_factory.dart b/modules/painting_system/draw_system/lib/src/gallery_factory.dart new file mode 100644 index 00000000..84e84328 --- /dev/null +++ b/modules/painting_system/draw_system/lib/src/gallery_factory.dart @@ -0,0 +1,254 @@ +import 'package:flutter/material.dart'; + +import 'anim/bezier3_player/bezier3_palyer.dart'; +import 'anim/circle_halo.dart'; +import 'anim/curve_shower/curve_anim_shower.dart'; +import 'anim/draw_path.dart'; +import 'anim/dundun_path.dart'; +import 'anim/rotate_by_point/rotate_by_point.dart'; +import 'anim/spring_widget.dart'; +import 'art/circle_packing.dart'; +import 'art/cubic_disarray.dart'; +import 'art/hypnotic_squares.dart'; +import 'art/joy_division.dart'; +import 'art/piet_mondrian.dart'; +import 'art/tiled_lines.dart'; +import 'art/triangular_mesh.dart'; +import 'art/un_deux_trois.dart'; +import 'base/clock_widget.dart'; +import 'base/digital/digital_shower.dart'; +import 'base/draw_grid_axis.dart'; +import 'base/draw_path_fun.dart'; +import 'base/draw_picture.dart'; + +import 'base/n_side/n_side_page.dart'; +import 'base/polar/polar_painter_widget.dart'; +import 'base/windmill.dart'; +import 'fun/bufeng/bufeng_panel.dart'; +import 'fun/dundun_view.dart'; +import 'fun/random_portrait.dart'; +import 'fun/stemp/stamp_paper.dart'; +import 'particle/random/random_particle.dart'; +import 'particle/split/particle_split.dart'; +import 'particle/split_img/split_image.dart'; +import 'picture_frame.dart'; +import 'package:l10n/l10n.dart'; +/// create by 张风捷特烈 on 2020/12/5 +/// contact me by email 1981462002@qq.com +/// 说明: +/// + +enum GalleryType { base, anim, particle, fun, art } + +class GalleryFactory { + static List getGalleryByName(GalleryType type,BuildContext context) { + switch (type) { + case GalleryType.base: + return [ + FrameShower( + title: "The Chaos", + author: "张风捷特烈", + srcUrl: "/base/draw_picture.dart", + info: context.l10n.drawingOfImages, + content: DrawPicture()), + FrameShower( + title: "数字显示管", + author: "张风捷特烈", + srcUrl: "/base/digital", + info: context.l10n.digitalDisplayTube, + content: DigitalShower()), + FrameShower( + title: "旋转风车", + author: "张风捷特烈", + srcUrl: "/base/windmill.dart", + info: context.l10n.pathDrawing, + content: WindmillWidget()), + FrameShower( + title: "平面直角坐标系", + author: "张风捷特烈", + srcUrl: "/base/draw_grid_axis.dart", + info: context.l10n.gridCoordinateSystem, + content: DrawGridAxis()), + FrameShower( + title: "平面极坐标系", + author: "张风捷特烈", + srcUrl: "/base/polar", + info: context.l10n.polarCoordinateSystemOfFaces, + content: PolarPainterWidget()), + FrameShower( + title: "曲线拟合", + author: "张风捷特烈", + srcUrl: "/base/draw_path_fun.dart", + info: context.l10n.drawFunctionCurvesForPathPairs, + content: DrawPathFun()), + FrameShower( + title: "圆中取形", + author: "张风捷特烈", + srcUrl: "/base/n_side", + info: context.l10n.drawRegularPolygons, + content: NSidePage()), + FrameShower( + title: "随机对称图", + author: "张风捷特烈", + srcUrl: '/fun/random_portrait.dart', + info: context.l10n.randomNumberProcessing, + content: RandomPortrait()), + FrameShower( + title: "简单时钟", + author: "张风捷特烈", + srcUrl: '/base/clock_widget.dart', + info: context.l10n.clockDrawing, + content: ClockWidget()), + ]; + case GalleryType.anim: + return [ + FrameShower( + title: "手势弹簧", + author: "张风捷特烈", + srcUrl: '/anim/spring_widget.dart', + info: context.l10n.drawSprings, + content: SpringWidget()), + FrameShower( + title: "绕定点旋转", + author: "张风捷特烈", + srcUrl: '/anim/rotate_by_point', + info: context.l10n.theApplicationOfAnglesInDrawing, + content: RotateByPointWidget()), + FrameShower( + title: "流光", + author: "张风捷特烈", + srcUrl: '/anim/circle_halo.dart', + info: context.l10n.usingShadersAndFilters, + content: CircleHalo()), + FrameShower( + title: "曲线路径动画", + author: "张风捷特烈", + srcUrl: '/anim/draw_path.dart', + info: context.l10n.pathDrawingFunctionCurve, + content: DrawPath()), + FrameShower( + title: "冰墩墩线条动画", + author: "张风捷特烈", + srcUrl: '/anim/dundun_path.dart', + info: context.l10n.thePathOfBingDwenDwen, + content: DunDunPathPage()), + FrameShower( + title: "Bezier3 演示", + author: "张风捷特烈", + srcUrl: '/anim/bezier3_player', + info: context.l10n.drawCubicBesselCurve, + content: Bezier3Player()), + FrameShower( + title: "动画曲线散点图", + author: "张风捷特烈", + srcUrl: '/anim/curve_shower', + info: context.l10n.theEffectOfAnimationCurve, + content: CurveAnimShower()), + + ]; + case GalleryType.particle: + return [ + FrameShower( + title: "随机粒子生成器", + author: "张风捷特烈", + srcUrl: '/particle/random', + info: context.l10n.randomParticlesAndBoundaryBouncing, + content: RandomParticle()), + FrameShower( + title: "粒子分裂", + author: "张风捷特烈", + srcUrl: '/particle/split', + info: context.l10n.particleCollision, + content: ParticleSplit()), + FrameShower( + title: "图片粒子分裂", + author: "张风捷特烈", + srcUrl: '/particle/split_img', + info: context.l10n.particle, + content: SplitImage()), + ]; + case GalleryType.fun: + return [ + FrameShower( + title: "Random Portrait", + author: "张风捷特烈", + srcUrl: '/fun/random_portrait.dart', + info: context.l10n.rectangleAndRandomNumbers, + content: RandomPortrait()), + FrameShower( + title: "冰墩墩", + author: "张风捷特烈", + srcUrl: '/fun/dundun_view.dart', + info: context.l10n.bingDwenDwen, + content: DunDunView()), + FrameShower( + title: "蒲丰投针试验", + author: "张风捷特烈", + srcUrl: '/fun/bufeng', + info: context.l10n.pufengInjectionTest, + content: BufengPanel()), + FrameShower( + title: "井字棋", + author: "张风捷特烈", + srcUrl: '/fun/stemp', + info: context.l10n.ticTacToe, + content: StampPaper()), + ]; + case GalleryType.art: + return [ + FrameShower( + title: "Tiled Line", + author: "generativeartistry.com", + srcUrl: '/art/tiled_lines.dart', + info: context.l10n.tiledLines, + content: TiledLines(), + ), + FrameShower( + title: "Joy Division", + author: "generativeartistry.com", + srcUrl: '/art/joy_division.dart', + info: context.l10n.joyDivision, + content: JoyDivision(), + ), + FrameShower( + title: "Cubic Disarray", + author: "generativeartistry.com", + srcUrl: '/art/cubic_disarray.dart', + info: context.l10n.cubicDisarray, content: CubicDisarray(), + ), + FrameShower( + title: "Triangular Mesh", + author: "generativeartistry.com", + srcUrl: '/art/triangular_mesh.dart', + info: context.l10n.triangularMesh, content: TriangularMesh(), + ), + FrameShower( + title: "Un Deux Trois", + srcUrl: '/art/un_deux_trois.dart', + author: "generativeartistry.com", + info: context.l10n.unDeuxTrois, content: UnDeuxTrois(), + ), + FrameShower( + title: "Circle Packing", + author: "generativeartistry.com", + srcUrl: '/art/circle_packing.dart', + info: context.l10n.circlePacking, content: CirclePacking(), + ), + FrameShower( + title: "Hypnotic Squares", + author: "generativeartistry.com", + srcUrl: '/art/hypnotic_squares.dart', + info: context.l10n.hypnoticSquares, content: HypnoticSquares(), + ), + FrameShower( + title: "Piet Mondrian", + author: "generativeartistry.com", + srcUrl: '/art/piet_mondrian.dart', + info: context.l10n.pietMondrian, content: PietMondrian(), + ) + ]; + default: + return []; + } + } +} diff --git a/lib/painter_system/gallery_unit.dart b/modules/painting_system/draw_system/lib/src/gallery_unit.dart similarity index 89% rename from lib/painter_system/gallery_unit.dart rename to modules/painting_system/draw_system/lib/src/gallery_unit.dart index b57c62aa..156e91a9 100644 --- a/lib/painter_system/gallery_unit.dart +++ b/modules/painting_system/draw_system/lib/src/gallery_unit.dart @@ -1,18 +1,16 @@ import 'dart:convert'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/bloc/gallery_unit/bloc.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:l10n/l10n.dart'; import 'desk_ui/desk_gallery_unit.dart'; +import 'gallery_card_item.dart'; import 'gallery_detail_page.dart'; +import 'gallery_factory.dart'; /// create by 张风捷特烈 on 2020/11/28 /// contact me by email 1981462002@qq.com @@ -72,9 +70,10 @@ class _PhoneGalleryUnitState extends State { super.dispose(); } - Color get color => BlocProvider.of(context).state.tabColor; - Color get nextColor => BlocProvider.of(context).state.nextTabColor; + Color get color => Colors.blue; + + Color get nextColor =>Colors.orangeAccent; bool get isDark => Theme.of(context).brightness == Brightness.dark; BoxDecoration get boxDecoration => BoxDecoration( @@ -97,9 +96,7 @@ class _PhoneGalleryUnitState extends State { Expanded( child: Container( margin: const EdgeInsets.only(left: 8, right: 8), - child: BlocBuilder( - builder: _buildContentByState, - ), + child: _buildContent(StrUnit.galleryDesc(context)), decoration: boxDecoration, )) ], @@ -124,7 +121,7 @@ class _PhoneGalleryUnitState extends State { height: MediaQuery.of(context).size.height * 0.2, child: Row( mainAxisSize: MainAxisSize.min, - children: const [ + children: [ FlutterLogo( size: 40, ), @@ -132,7 +129,7 @@ class _PhoneGalleryUnitState extends State { width: 10, ), Text( - "绘制集录", + context.l10n.paintCollection, style: TextStyle(fontSize: 26, color: Colors.white), ), ], @@ -144,13 +141,14 @@ class _PhoneGalleryUnitState extends State { if(state.isEmpty){ return const LoadingShower(); } - return _buildContent(state); + return _buildContent(StrUnit.galleryDesc(context)); } Widget _buildContent(String galleryInfo) { + final List widgets = (json.decode(galleryInfo) as List).map((e) { GalleryInfo info = GalleryInfo.fromJson(e); - List children = GalleryFactory.getGalleryByName(info.type); + List children = GalleryFactory.getGalleryByName(info.type,context); return FeedbackWidget( a: 0.95, diff --git a/lib/painter_system/particle/out/clock_fx.dart b/modules/painting_system/draw_system/lib/src/particle/out/clock_fx.dart similarity index 100% rename from lib/painter_system/particle/out/clock_fx.dart rename to modules/painting_system/draw_system/lib/src/particle/out/clock_fx.dart diff --git a/lib/painter_system/particle/out/clock_widget.dart b/modules/painting_system/draw_system/lib/src/particle/out/clock_widget.dart similarity index 100% rename from lib/painter_system/particle/out/clock_widget.dart rename to modules/painting_system/draw_system/lib/src/particle/out/clock_widget.dart diff --git a/lib/painter_system/particle/out/particle.dart b/modules/painting_system/draw_system/lib/src/particle/out/particle.dart similarity index 100% rename from lib/painter_system/particle/out/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/out/particle.dart diff --git a/lib/painter_system/particle/out/rnd.dart b/modules/painting_system/draw_system/lib/src/particle/out/rnd.dart similarity index 100% rename from lib/painter_system/particle/out/rnd.dart rename to modules/painting_system/draw_system/lib/src/particle/out/rnd.dart diff --git a/lib/painter_system/particle/random/particle.dart b/modules/painting_system/draw_system/lib/src/particle/random/particle.dart similarity index 100% rename from lib/painter_system/particle/random/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/random/particle.dart diff --git a/lib/painter_system/particle/random/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/random/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/random/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/random/particle_manage.dart diff --git a/lib/painter_system/particle/random/random_particle.dart b/modules/painting_system/draw_system/lib/src/particle/random/random_particle.dart similarity index 100% rename from lib/painter_system/particle/random/random_particle.dart rename to modules/painting_system/draw_system/lib/src/particle/random/random_particle.dart diff --git a/lib/painter_system/particle/random/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/random/world_render.dart similarity index 100% rename from lib/painter_system/particle/random/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/random/world_render.dart diff --git a/lib/painter_system/particle/split/particle.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle.dart similarity index 100% rename from lib/painter_system/particle/split/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle.dart diff --git a/lib/painter_system/particle/split/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/split/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle_manage.dart diff --git a/lib/painter_system/particle/split/particle_split.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle_split.dart similarity index 100% rename from lib/painter_system/particle/split/particle_split.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle_split.dart diff --git a/lib/painter_system/particle/split/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/split/world_render.dart similarity index 100% rename from lib/painter_system/particle/split/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/split/world_render.dart diff --git a/lib/painter_system/particle/split_img/particle.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/particle.dart similarity index 100% rename from lib/painter_system/particle/split_img/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/particle.dart diff --git a/lib/painter_system/particle/split_img/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/split_img/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/particle_manage.dart diff --git a/lib/painter_system/particle/split_img/split_image.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/split_image.dart similarity index 97% rename from lib/painter_system/particle/split_img/split_image.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/split_image.dart index ca9f1219..efd4fefb 100644 --- a/lib/painter_system/particle/split_img/split_image.dart +++ b/modules/painting_system/draw_system/lib/src/particle/split_img/split_image.dart @@ -75,7 +75,7 @@ class _SplitImageState extends State with SingleTickerProviderStateM pm.particles.clear(); ByteData data = await rootBundle.load("assets/images/flutter.png"); List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - image.Image? imageSrc = image.decodeImage(bytes); + image.Image? imageSrc = image.decodeImage(Uint8List.fromList(bytes)); if(imageSrc==null) return; diff --git a/lib/painter_system/particle/split_img/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/world_render.dart similarity index 100% rename from lib/painter_system/particle/split_img/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/world_render.dart diff --git a/lib/painter_system/picture_frame.dart b/modules/painting_system/draw_system/lib/src/picture_frame.dart similarity index 94% rename from lib/painter_system/picture_frame.dart rename to modules/painting_system/draw_system/lib/src/picture_frame.dart index 2b25ec30..591c2e00 100644 --- a/lib/painter_system/picture_frame.dart +++ b/modules/painting_system/draw_system/lib/src/picture_frame.dart @@ -1,11 +1,12 @@ import 'dart:io'; import 'dart:ui'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'desk_ui/desk_frame.dart'; - +import 'package:l10n/l10n.dart'; class PictureFrame extends StatelessWidget { final Widget? child; final double? width; @@ -124,7 +125,7 @@ class FrameShower extends StatelessWidget { @override Widget build(BuildContext context) { - bool isDesk = Platform.isMacOS || Platform.isWindows || Platform.isLinux; + bool isDesk = kIsWeb||Platform.isMacOS || Platform.isWindows || Platform.isLinux; if (isDesk) { return DeskFrameShower( content: content, @@ -143,7 +144,7 @@ class FrameShower extends StatelessWidget { title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), - PictureFrame(child: content), + PictureFrame(child: content,color: Colors.white,), Container( padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( @@ -155,8 +156,8 @@ class FrameShower extends StatelessWidget { const Spacer(), GestureDetector( onTap: _launch, - child: const Text( - "源码地址 ", + child: Text( + "${context.l10n.srcPath} ", style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, diff --git a/lib/painter_system/utils/colors.dart b/modules/painting_system/draw_system/lib/src/utils/colors.dart similarity index 100% rename from lib/painter_system/utils/colors.dart rename to modules/painting_system/draw_system/lib/src/utils/colors.dart diff --git a/lib/painter_system/utils/coordinate.dart b/modules/painting_system/draw_system/lib/src/utils/coordinate.dart similarity index 100% rename from lib/painter_system/utils/coordinate.dart rename to modules/painting_system/draw_system/lib/src/utils/coordinate.dart diff --git a/modules/painting_system/draw_system/pubspec.yaml b/modules/painting_system/draw_system/pubspec.yaml new file mode 100644 index 00000000..28e38def --- /dev/null +++ b/modules/painting_system/draw_system/pubspec.yaml @@ -0,0 +1,50 @@ +name: draw_system +description: "A new Flutter package project." +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/painting_system/draw_system/test/draw_system_test.dart b/modules/painting_system/draw_system/test/draw_system_test.dart new file mode 100644 index 00000000..516a3964 --- /dev/null +++ b/modules/painting_system/draw_system/test/draw_system_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:draw_system/draw_system.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/modules/tools_system/treasure_tools/.gitignore b/modules/tools_system/treasure_tools/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/tools_system/treasure_tools/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/tools_system/treasure_tools/.metadata b/modules/tools_system/treasure_tools/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/modules/tools_system/treasure_tools/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/modules/tools_system/treasure_tools/CHANGELOG.md b/modules/tools_system/treasure_tools/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/tools_system/treasure_tools/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/tools_system/treasure_tools/LICENSE b/modules/tools_system/treasure_tools/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/tools_system/treasure_tools/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/tools_system/treasure_tools/README.md b/modules/tools_system/treasure_tools/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/tools_system/treasure_tools/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/tools_system/treasure_tools/analysis_options.yaml b/modules/tools_system/treasure_tools/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/tools_system/treasure_tools/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/tools_system/treasure_tools/lib/src/bloc/state.dart b/modules/tools_system/treasure_tools/lib/src/bloc/state.dart new file mode 100644 index 00000000..d852422c --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/bloc/state.dart @@ -0,0 +1,8 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../model/class.dart'; + + +class ClassGenBloc extends Cubit{ + ClassGenBloc():super(Class(fields: [], name: '')); +} \ No newline at end of file diff --git a/lib/code_gen/class_generator.dart b/modules/tools_system/treasure_tools/lib/src/class_generator.dart similarity index 100% rename from lib/code_gen/class_generator.dart rename to modules/tools_system/treasure_tools/lib/src/class_generator.dart diff --git a/lib/code_gen/code_gen_page.dart b/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart similarity index 96% rename from lib/code_gen/code_gen_page.dart rename to modules/tools_system/treasure_tools/lib/src/code_gen_page.dart index 5df5945c..25a872bb 100644 --- a/lib/code_gen/code_gen_page.dart +++ b/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart @@ -1,13 +1,14 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_gen_page.dart'; import 'class_generator.dart'; import 'desk_widget_top_bar.dart'; +import 'icon_font_gen/icon_font_gen_page.dart'; import 'model/class.dart'; import 'model/field.dart'; import 'popable/class_gen_field.dart'; import 'popable/toly_select.dart'; +import 'view/json_display/json_display.dart'; class A {} @@ -58,11 +59,7 @@ class _CodeGenPageState extends State { controller:_ctrl, children: [ IconFontGenPage(), - Center( - child: Text( - '敬请期待' - ), - ), + JsonAnalysisTool(), Center( child: Text( '敬请期待' diff --git a/lib/code_gen/data/task_result.dart b/modules/tools_system/treasure_tools/lib/src/data/task_result.dart similarity index 100% rename from lib/code_gen/data/task_result.dart rename to modules/tools_system/treasure_tools/lib/src/data/task_result.dart diff --git a/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart b/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart new file mode 100644 index 00000000..a966facb --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart @@ -0,0 +1,73 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; + + + +class DeskCodeGenTopBar extends StatefulWidget { + final ValueChanged onTabPressed; + final VoidCallback onTapGen; + + const DeskCodeGenTopBar({Key? key,required this.onTabPressed, required this.onTapGen}) : super(key: key); + + @override + State createState() => _DeskCodeGenTopBarState(); +} + +class _DeskCodeGenTopBarState extends State with SingleTickerProviderStateMixin { + late TabController tabController; + + static const List _tabs = ['IconFont','Json 解析', '数据类' , '状态管理',]; + + @override + void initState() { + super.initState(); + tabController = TabController(length: _tabs.length, vsync: this); + } + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Container( + height: 64, + color: isDark?Color(0xff2C3036):Colors.white, + child: Row( + children: [ + const SizedBox(width: 12,), + SizedBox( + width: 350, + child: TabBar( + onTap: widget.onTabPressed, + indicatorSize: TabBarIndicatorSize.label, + labelPadding: const EdgeInsets.symmetric(horizontal: 6), + isScrollable: false, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: + _tabs.map((String name) => Tab(text: name)).toList(), + ), + ), + Spacer(), + + const SizedBox(width: 20,), + WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/modules/tools_system/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart new file mode 100644 index 00000000..78095d46 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart @@ -0,0 +1,41 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +class GenMessageAction extends StatelessWidget { + final VoidCallback onGen; + const GenMessageAction({Key? key, required this.onGen}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + '使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold), + )), + ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 0, shape: const StadiumBorder()), + onPressed: onGen, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 4, + children: [ + Icon( + TolyIcon.icon_fast, + size: 16, + ), + const Text( + '生成代码', + style: TextStyle(height: 1.1, fontSize: 12), + ), + ], + )), + ], + ); + } +} diff --git a/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart new file mode 100644 index 00000000..224bd81e --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart @@ -0,0 +1,110 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:archive/archive_io.dart'; + +import 'icon_font_gen_config.dart'; +import 'package:path/path.dart' as path; + +class IconFontClassParser{ + + void gen(IconFontGenConfig config){ + final inputStream = InputFileStream(config.srcZip); + // 将压缩包有用资源解压到目标文件 + final archive = ZipDecoder().decodeStream(inputStream); + for (var file in archive.files) { + if (file.isFile) { + if (file.name.endsWith('.ttf')) { + final outputStream = OutputFileStream(config.ttfDistPath); + file.writeContent(outputStream); + outputStream.close(); + } + if (file.name.endsWith('.json')) { + dynamic data = file.content; + String jsonContent = utf8.decode(data); + String resultCode = parser(jsonContent,config.fontFamily); + File distFile = File(config.distFilePath); + if(!distFile.existsSync()){ + distFile.createSync(recursive: true); + } + distFile.writeAsStringSync(resultCode); + setYaml(config); + } + } + } + } + + String parser(String input,String fontFamily){ + dynamic map = json.decode(input); + List glyphs = map['glyphs'] as List; + String code = ''; + for(int i=0;i lines = pubspecFile.readAsLinesSync(); + RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); + bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); + + if(!hasFonts){ + // 当前没有 fonts 节点,需要添加到 flutter 节点下 + int index = lines.indexWhere((e) => e.startsWith('flutter:')); + List fonts = [ + ' fonts:', + ' - family: $familyName', + ' fonts:', + ' - asset: $fontAssetsDist', + ]; + + lines.insertAll(index+1, fonts); + pubspecFile.writeAsStringSync(lines.join('\n')); + return; + } + // 存在 fonts 节点,查询 family ,有没有当前字体图标 + bool hasTargetFamily = false; + RegExp regExp = RegExp(r'^ +- family: +(\w+)'); + + for(int i=0;i e.startsWith(fontsRegex)); + List fonts = [ + ' - family: $familyName', + ' fonts:', + ' - asset: $fontAssetsDist', + ]; + lines.insertAll(index+1, fonts); + pubspecFile.writeAsStringSync(lines.join('\n')); + } + } +} \ No newline at end of file diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_config.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart similarity index 100% rename from lib/code_gen/icon_font_gen/icon_font_gen_config.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart similarity index 85% rename from lib/code_gen/icon_font_gen/icon_font_gen_page.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart index e1d7ea2b..39b7a0e4 100644 --- a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart +++ b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart @@ -1,15 +1,10 @@ import 'dart:convert'; -import 'dart:io'; - -import 'package:app_config/app_config.dart'; -import 'package:archive/archive_io.dart'; +import 'package:app/app.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; import 'package:shared_preferences/shared_preferences.dart'; import 'package:utils/utils.dart'; -import 'package:yaml_modify/yaml_modify.dart'; -import '../code_gen_page.dart'; import 'gen_message_action.dart'; import 'icon_font_class_parser.dart'; import 'icon_font_gen_config.dart'; @@ -38,16 +33,11 @@ class _IconFontGenPageState extends State void initState() { super.initState(); _initData(); - - // _iconFontAssetsCtrl.text = 'assets${spa}iconfont'; - // _resultFileCtrl.text = 'lib${spa}app${spa}gen${spa}toly_icon.dart'; - // _projectCtrl.text = r'E:\Projects\Flutter\FlutterUnit'; - // _iconFontCtrl.text = r'E:\Download\download.zip'; } IconFontGenConfig config = IconFontGenConfig(); - _initData() async{ + void _initData() async{ _sp = await SharedPreferences.getInstance(); String? configStr = sp.getString(SpKey.iconFontGenConfig); if(configStr!=null){ @@ -62,6 +52,7 @@ class _IconFontGenPageState extends State @override Widget build(BuildContext context) { + super.build(context); return Center( child: SizedBox( width: 600, @@ -133,27 +124,7 @@ class _IconFontGenPageState extends State projectPath: _projectCtrl.text, srcZip: _iconFontCtrl.text, ); - parser.gen(config); - // // 将压缩包有用资源解压到目标文件 - // final archive = ZipDecoder().decodeBuffer(inputStream); - // for (var file in archive.files) { - // if (file.isFile) { - // if (file.name.endsWith('.ttf')) { - // String filePath = path.join(assetsDirPath, path.basename(file.name)); - // final outputStream = OutputFileStream(filePath); - // file.writeContent(outputStream); - // outputStream.close(); - // } - // - // if (file.name.endsWith('.json')) { - // dynamic data = file.content; - // String jsonContent = utf8.decode(data); - // - // Toast.success(context, '生成代码成功!'); - // } - // } - // } Toast.success(context, '生成代码成功!'); sp.setString(SpKey.iconFontGenConfig,json.encode(config)); @@ -179,6 +150,8 @@ class LabelInputInput extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -201,14 +174,14 @@ class LabelInputInput extends StatelessWidget { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0, left: 15), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(6)), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xffE2E7EE)), + borderSide: BorderSide(color: isDark?Color(0xff2C3036):Color(0xffE2E7EE)), borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: hintText, @@ -237,6 +210,8 @@ class FileSelectorInput extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -281,13 +256,13 @@ class FileSelectorInput extends StatelessWidget { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0, left: 15), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(6)), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xffE2E7EE)), + borderSide: BorderSide(color: isDark?Color(0xff2C3036):Color(0xffE2E7EE)), borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: hintText, @@ -299,7 +274,6 @@ class FileSelectorInput extends StatelessWidget { } void _showSelectFile() async { - print("=======_showSelectFile============="); String? path; if (pickerDir) { path = await FilePicker.platform.getDirectoryPath(); diff --git a/lib/code_gen/model/class.dart b/modules/tools_system/treasure_tools/lib/src/model/class.dart similarity index 100% rename from lib/code_gen/model/class.dart rename to modules/tools_system/treasure_tools/lib/src/model/class.dart diff --git a/lib/code_gen/model/field.dart b/modules/tools_system/treasure_tools/lib/src/model/field.dart similarity index 100% rename from lib/code_gen/model/field.dart rename to modules/tools_system/treasure_tools/lib/src/model/field.dart diff --git a/lib/code_gen/popable/class_gen_field.dart b/modules/tools_system/treasure_tools/lib/src/popable/class_gen_field.dart similarity index 98% rename from lib/code_gen/popable/class_gen_field.dart rename to modules/tools_system/treasure_tools/lib/src/popable/class_gen_field.dart index b57b06e2..562c927b 100644 --- a/lib/code_gen/popable/class_gen_field.dart +++ b/modules/tools_system/treasure_tools/lib/src/popable/class_gen_field.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/code_gen/model/class.dart'; import '../code_gen_page.dart'; +import '../model/class.dart'; import '../model/field.dart'; import 'toly_select.dart'; diff --git a/lib/code_gen/popable/toly_select.dart b/modules/tools_system/treasure_tools/lib/src/popable/toly_select.dart similarity index 100% rename from lib/code_gen/popable/toly_select.dart rename to modules/tools_system/treasure_tools/lib/src/popable/toly_select.dart diff --git a/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart b/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart new file mode 100644 index 00000000..41f572a2 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart @@ -0,0 +1,362 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +/// 颜色定义 +class FieldColor { + static const keyColor = Colors.grey; + static const intColor = Colors.deepOrange; + static const stringColor = Colors.green; + static const nullColor = Colors.blueGrey; + static const arrayColor = Colors.blue; + static const objectColor = Colors.purple; +} + +/// 基础类型抽象类 +abstract class BaseValue { + final String? key; + final T value; + bool isExpanded; + + BaseValue(this.value, {this.key, this.isExpanded = true}); + + Widget buildValue(); +} + +/// 整数值 +class IntValue extends BaseValue { + IntValue(super.value, {super.key}); + + @override + Widget buildValue() { + return Text(value.toString()+",", + style: const TextStyle(color: FieldColor.intColor)); + } +} + +/// 字符串值 +class StringValue extends BaseValue { + StringValue(super.value, {super.key}); + + @override + Widget buildValue() { + return Text('"$value",', + style: const TextStyle(color: FieldColor.stringColor)); + } +} + +/// Null 值 +class NullValue extends BaseValue { + NullValue({super.key}) : super(null); + + @override + Widget buildValue() { + return const Text('null', style: TextStyle(color: FieldColor.nullColor)); + } +} + +/// 数组值 +class ArrayValue extends BaseValue> { + ArrayValue(super.value, {super.key}); + + @override + Widget buildValue() { + return StatefulBuilder(builder: (context, setState) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + isExpanded = !isExpanded; + }); + }, + child: Row( + children: [ + Icon(isExpanded ? Icons.arrow_drop_down : Icons.arrow_right, + color: FieldColor.arrayColor), + Text('(Array)${isExpanded?'【':'【...'}', + style: TextStyle(color: FieldColor.arrayColor)), + + if (!isExpanded) + const Text('】', + style: TextStyle(color: FieldColor.arrayColor)), + ], + ), + ), + if (isExpanded) ...[ + Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: value.map((e) => parseJson(e).buildValue()).toList(), + ), + ), + const Text('】', style: TextStyle(color: FieldColor.arrayColor)), + ] + ], + ); + }); + } +} + +/// 对象值 +class ObjectValue extends BaseValue> { + ObjectValue(super.value, {super.key}); + + @override + Widget buildValue() { + return StatefulBuilder( + builder: (context, setState) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + isExpanded = !isExpanded; // 触发 UI 重新渲染 + }); + }, + child: Row( + children: [ + Icon(isExpanded ? Icons.arrow_drop_down : Icons.arrow_right, + color: FieldColor.objectColor), + Text('(Object)${isExpanded?'{':'{...'}', + style: TextStyle(color: FieldColor.objectColor)), + if (!isExpanded) + const Text('}', + style: TextStyle(color: FieldColor.objectColor)), + ], + ), + ), + if (isExpanded) ...[ + Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: value.entries + .map((e) => + KeyBlock(keyText: e.key, value: parseJson(e.value))) + .toList(), + ), + ), + const Text('}', style: TextStyle(color: FieldColor.objectColor)), + ] + ], + ); + }, + ); + } +} + +/// 键值对组件 +class KeyBlock extends StatelessWidget { + final String keyText; + final BaseValue value; + + const KeyBlock({super.key, required this.keyText, required this.value}); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('$keyText: ', + style: const TextStyle( + color: FieldColor.keyColor, fontWeight: FontWeight.bold)), + Expanded(child: value.buildValue()), + ], + ); + } +} + +/// 解析 JSON 数据 +BaseValue parseJson(dynamic json, {String? key}) { + if (json == null) return NullValue(key: key); + if (json is int) return IntValue(json, key: key); + if (json is String) return StringValue(json, key: key); + if (json is List) return ArrayValue(json, key: key); + if (json is Map) return ObjectValue(json, key: key); + return StringValue(json.toString(), key: key); +} + +/// JSON 解析工具 UI +class JsonAnalysisTool extends StatefulWidget { + const JsonAnalysisTool({super.key}); + + @override + State createState() => _JsonAnalysisToolState(); +} + +class _JsonAnalysisToolState extends State { + final TextEditingController _controller = TextEditingController( + text: """ +{ + "id": 1, + "name": "Container", + "localName": "容器组件", + "info": "用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可用于显示一个指定宽高的区域", + "desc": [ + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "可以在区域中放入一个子组件", + "desc": [ + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】: 外边距 【EdgeInsetsGeometry】", + "【child】: 子组件 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "可对子组件进行对齐定位", + "desc": [ + "【alignment】 : 对齐定位 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "可对子组件进行装饰", + "desc": [ + "【decoration】 : 装饰 【Decoration】", + "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container还具有变换性", + "desc": [ + "【transform】 : 变换矩阵 【Matrix4】", + "基于Matrix4的矩阵变换,变换详情见线性代数" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container的约束性", + "desc": [ + "【constraints】 : 约束 【BoxConstraints】", + "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。" + ] + } + ] +}""", + ); + BaseValue? _parsedData; + String? _error; + + final ScrollController _hCtrl = ScrollController(); + final ScrollController _vCtrl = ScrollController(); + + @override + void initState() { + super.initState(); + _parseJson(); + } + + void _parseJson() { + setState(() { + _error = null; + try { + final parsed = jsonDecode(_controller.text); + _parsedData = parseJson(parsed); + } catch (e) { + _error = 'JSON 解析失败: $e'; + _parsedData = null; + } + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + style: TextStyle(fontSize: 14,fontFamily: '楷体'), + controller: _controller, + onChanged: _onChanged, + expands: true, + maxLines: null, + decoration: const InputDecoration( + fillColor: Colors.white, + filled: true, + labelText: '输入 JSON', + border: OutlineInputBorder(), + ), + ), + ), + ), + VerticalDivider(), + Expanded( + child: Align( + alignment: Alignment.topLeft, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(4) + ), + margin: EdgeInsets.all(8), + child: Scrollbar( //-> ::tag1:: + thumbVisibility: true, + //-> ::tag6:: + notificationPredicate: (ScrollNotification notification) => notification.depth == 1, + key: const Key('debuggerCodeViewVerticalScrollbarKey'), + controller: _vCtrl, + child: LayoutBuilder( + builder: (context,cts) { + final double boxHeight = 800; + return Scrollbar( //-> ::tag2:: + key: const Key('debuggerCodeViewHorizontalScrollbarKey'), + thumbVisibility: true, + controller: _hCtrl, + child: SingleChildScrollView( + controller: _hCtrl, //-> ::tag3:: + child: SingleChildScrollView( + controller: _vCtrl, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 8,vertical: 6), + child: SizedBox( + width: boxHeight, + child: _error != null + ? Text(_error!, style: const TextStyle(color: Colors.red)) + : _parsedData?.buildValue() ?? const Text('请输入 JSON'), + ), + ), + ), + ); + } + ), + ), + ), + ), + ), + ], + ), + ); + } + + void _onChanged(String value) { + _parseJson(); + } +} diff --git a/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart b/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart new file mode 100644 index 00000000..f7ab0049 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +class MobileToolPage extends StatelessWidget { + const MobileToolPage({super.key}); + + @override + Widget build(BuildContext context) { + AppLocalizations l10n = context.l10n; + String title = l10n.treasureTools; + String building = l10n.knowledgeConstruction; + return Scaffold( + appBar: AppBar(title: Text(title),), + body: Center( + child: Text(building), + ), + ); + } +} + diff --git a/lib/code_gen/wrapper.dart b/modules/tools_system/treasure_tools/lib/src/wrapper.dart similarity index 100% rename from lib/code_gen/wrapper.dart rename to modules/tools_system/treasure_tools/lib/src/wrapper.dart diff --git a/modules/tools_system/treasure_tools/lib/treasure_tools.dart b/modules/tools_system/treasure_tools/lib/treasure_tools.dart new file mode 100644 index 00000000..c61f6a34 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/treasure_tools.dart @@ -0,0 +1,4 @@ +library treasure_tools; + +export 'src/code_gen_page.dart'; +export 'src/view/mobile/mobile_tool_page.dart'; \ No newline at end of file diff --git a/modules/tools_system/treasure_tools/pubspec.yaml b/modules/tools_system/treasure_tools/pubspec.yaml new file mode 100644 index 00000000..a70d90ba --- /dev/null +++ b/modules/tools_system/treasure_tools/pubspec.yaml @@ -0,0 +1,50 @@ +name: treasure_tools +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + +# To add assets to your package, add an assets section, like this: +# assets: +# - images/a_dot_burr.jpeg +# - images/a_dot_ham.jpeg +# +# For details regarding assets in packages, see +# https://flutter.dev/assets-and-images/#from-packages +# +# An image asset can refer to one or more resolution-specific "variants", see +# https://flutter.dev/assets-and-images/#resolution-aware + +# To add custom fonts to your package, add a fonts section here, +# in this "flutter" section. Each entry in this list should have a +# "family" key with the font family name, and a "fonts" key with a +# list giving the asset and other descriptors for the font. For +# example: +# fonts: +# - family: Schyler +# fonts: +# - asset: fonts/Schyler-Regular.ttf +# - asset: fonts/Schyler-Italic.ttf +# style: italic +# - family: Trajan Pro +# fonts: +# - asset: fonts/TrajanPro.ttf +# - asset: fonts/TrajanPro_Bold.ttf +# weight: 700 +# +# For details regarding fonts in packages, see +# https://flutter.dev/custom-fonts/#from-packages diff --git a/test/iconfont_parser_test.dart b/modules/tools_system/treasure_tools/test/iconfont_parser_test.dart similarity index 81% rename from test/iconfont_parser_test.dart rename to modules/tools_system/treasure_tools/test/iconfont_parser_test.dart index 37780b40..ae20198d 100644 --- a/test/iconfont_parser_test.dart +++ b/modules/tools_system/treasure_tools/test/iconfont_parser_test.dart @@ -2,7 +2,8 @@ import 'dart:convert'; import 'dart:io'; -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; +import 'package:treasure_tools/src/icon_font_gen/icon_font_class_parser.dart'; + void main(){ final String filePath = r'E:\Download\out\font_1717416_cwm89ioqkfo\iconfont.json'; diff --git a/modules/tools_system/treasure_tools/test/treasure_tools_test.dart b/modules/tools_system/treasure_tools/test/treasure_tools_test.dart new file mode 100644 index 00000000..1a5dd707 --- /dev/null +++ b/modules/tools_system/treasure_tools/test/treasure_tools_test.dart @@ -0,0 +1,12 @@ +// import 'package:flutter_test/flutter_test.dart'; +// +// import 'package:treasure_tools/treasure_tools.dart'; +// +// void main() { +// test('adds one to input values', () { +// final calculator = Calculator(); +// expect(calculator.addOne(2), 3); +// expect(calculator.addOne(-7), -6); +// expect(calculator.addOne(0), 1); +// }); +// } diff --git a/modules/tools_system/treasure_tools/test/yaml_parser_test.dart b/modules/tools_system/treasure_tools/test/yaml_parser_test.dart new file mode 100644 index 00000000..ea8e36e8 --- /dev/null +++ b/modules/tools_system/treasure_tools/test/yaml_parser_test.dart @@ -0,0 +1,51 @@ +// +// import 'dart:convert'; +// import 'dart:io'; +// +// // import 'package:yaml/yaml.dart'; +// import 'package:yaml_modify/yaml_modify.dart'; +// +// void main(){ +// final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; +// File pubspecFile = File(filePath); +// final String pubspec = pubspecFile.readAsStringSync(); +// print(pubspec); +// +// // YamlEditor doc = YamlEditor(pubspec); +// // print(doc); +// final doc = loadYaml(pubspec); +// print(doc); +// +// YamlList fontsList = doc['flutter']['fonts'] as YamlList; +// +// final modifiableDoc = getModifiableNode(doc); +// final modifiableList = getModifiableNode(fontsList); +// modifiableList.removeWhere((e) => e['family'] == 'TolyIcon'); +// modifiableList.add( +// YamlMap.wrap({ +// 'family': 'TolyIcon3', +// 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) +// }) +// ); +// modifiableDoc['flutter']['fonts'] = modifiableList; +// final strYaml = toYamlString(modifiableDoc); +// print(modifiableList); +// +// // // YamlMap flutterNode = doc[]; +// // doc.update('flutter', (value) { +// // // YamlList fontsNode = value as YamlList; +// // // List filter = fontsNode.where((e) => e['family']!='TolyIcon').toList(); +// // +// // return YamlMap.wrap({ +// // 'family': 'TolyIcon3', +// // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) +// // }); +// // }); +// +// // YamlList fontsList = doc['flutter']['fonts'] as YamlList; +// // +// +// // // doc. +// print(doc); +// +// } \ No newline at end of file diff --git a/modules/tools_system/treasure_tools/test/yaml_parser_test2.dart b/modules/tools_system/treasure_tools/test/yaml_parser_test2.dart new file mode 100644 index 00000000..f8a47928 --- /dev/null +++ b/modules/tools_system/treasure_tools/test/yaml_parser_test2.dart @@ -0,0 +1,64 @@ +// +// import 'dart:convert'; +// import 'dart:io'; +// +// // import 'package:yaml/yaml.dart'; +// import 'package:yaml_modify/yaml_modify.dart'; +// +// void main(){ +// String familyName = 'TolyIcon'; +// String fontAssetsDist = 'assets/iconfont/iconfont.ttf'; +// +// // final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; +// final String filePath = r'E:\Projects\Flutter\Work\toly_image_edit\pubspec.yaml'; +// File pubspecFile = File(filePath); +// +// List lines = pubspecFile.readAsLinesSync(); +// +// RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); +// bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); +// +// if(!hasFonts){ +// // 当前没有 fonts 节点,需要添加到 flutter 节点下 +// int index = lines.indexWhere((e) => e.startsWith('flutter:')); +// +// List fonts = [ +// ' fonts:', +// ' - family: TolyIcon', +// ' fonts:', +// ' - asset: assets/iconfont/iconfont.ttf', +// ]; +// +// lines.insertAll(index+1, fonts); +// print(lines); +// pubspecFile.writeAsStringSync(lines.join('\n')); +// return; +// } +// // 存在 fonts 节点,查询 family ,有没有当前字体图标 +// bool hasTargetFamily = false; +// RegExp regExp = RegExp(r'^ +- family: +(\w+)'); +// +// for(int i=0;i e.startsWith(fontsRegex)); +// List fonts = [ +// ' - family: TolyIcon', +// ' fonts:', +// ' - asset: $fontAssetsDist', +// ]; +// lines.insertAll(index+1, fonts); +// print(lines); +// pubspecFile.writeAsStringSync(lines.join('\n')); +// return; +// } +// +// } \ No newline at end of file diff --git a/packages/widget_repository/.gitignore b/modules/widget_system/widget_module/.gitignore similarity index 100% rename from packages/widget_repository/.gitignore rename to modules/widget_system/widget_module/.gitignore diff --git a/packages/old_fancy_mobile_ui/.metadata b/modules/widget_system/widget_module/.metadata similarity index 100% rename from packages/old_fancy_mobile_ui/.metadata rename to modules/widget_system/widget_module/.metadata diff --git a/modules/widget_system/widget_module/CHANGELOG.md b/modules/widget_system/widget_module/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/widget_system/widget_module/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/widget_system/widget_module/LICENSE b/modules/widget_system/widget_module/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/widget_system/widget_module/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/widget_system/widget_module/README.md b/modules/widget_system/widget_module/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/widget_system/widget_module/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/widget_system/widget_module/analysis_options.yaml b/modules/widget_system/widget_module/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/widget_system/widget_module/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart new file mode 100644 index 00000000..42295119 --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart @@ -0,0 +1,21 @@ +import 'package:flutter/cupertino.dart'; +import 'package:app/app.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import '../../widget_module.dart'; + +extension WidgetContext on BuildContext { + void initWidgetData() { + switchWidgetFamily(WidgetFamily.stateless); + } + + void switchWidgetFamily(WidgetFamily family) { + String locale = read().state.language.code; + read().add(EventTabTap(family, locale: locale)); + } + + void toggleLike(int widgetId) { + read().add(ToggleLikeWidgetEvent(id: widgetId)); + } +} diff --git a/packages/widget_module/lib/blocs/blocs.dart b/modules/widget_system/widget_module/lib/blocs/blocs.dart similarity index 100% rename from packages/widget_module/lib/blocs/blocs.dart rename to modules/widget_system/widget_module/lib/blocs/blocs.dart diff --git a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart similarity index 98% rename from packages/widget_module/lib/blocs/category_bloc/category_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart index 41c66d31..cd4f03c9 100644 --- a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart @@ -1,8 +1,8 @@ -import 'package:db_storage/db_storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; + part 'category_event.dart'; part 'category_state.dart'; diff --git a/packages/widget_module/lib/blocs/category_bloc/category_event.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_bloc/category_event.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_event.dart diff --git a/packages/widget_module/lib/blocs/category_bloc/category_state.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_bloc/category_state.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_state.dart diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart similarity index 99% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart index a99451df..b263c2bd 100644 --- a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; + import '../category_bloc/category_bloc.dart'; part 'category_widget_event.dart'; diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart similarity index 99% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart index 32035416..0ab2ef17 100644 --- a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart @@ -3,6 +3,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; + + part 'liked_widget_event.dart'; part 'liked_widget_state.dart'; diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart new file mode 100644 index 00000000..be4d555d --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -0,0 +1,70 @@ +import 'dart:ui'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; + +part 'widget_detail_state.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: 组件详情页状态数据维护核心类 +/// [_modelStack] 组件详情页支持管理跳转,栈数据交由 Bloc 维护 + +class WidgetDetailBloc extends Cubit { + final WidgetRepository widgetRepo; + final NodeRepository nodeRepo; + + WidgetDetailBloc({ + required this.widgetRepo, + required this.nodeRepo, + }) : super(DetailLoading()); + + List _modelStack = []; + + WidgetModel get currentWidget => _modelStack.last; + + void push(WidgetModel model, {String? locale}) { + _modelStack.add(model); + queryDetail(model, locale: locale); + } + + Future pop() async { + if (_modelStack.isEmpty) { + return true; + } + _modelStack.removeLast(); + if (_modelStack.isNotEmpty) { + queryDetail(currentWidget); + return false; + } else { + return true; + } + } + + void queryDetail(WidgetModel widget, {String? locale}) async { + emit(DetailLoading()); + try { + final List nodes = + await nodeRepo.loadNode(widget.id, locale: locale); + final List links = + await widgetRepo.loadWidget(widget.links, locale); + if (nodes.isEmpty) { + emit(DetailEmpty()); + } else { + emit(DetailWithData(widgetModel: widget, nodes: nodes, links: links)); + } + } catch (e, s) { + print("queryDetail=error===${e}=$s=="); + emit(DetailFailed()); + } + } + + void changeLocale(Locale locale) async { + String localeStr = + '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + List ids = _modelStack.map((e) => e.id).toList(); + _modelStack = await widgetRepo.loadWidget(ids, localeStr); + queryDetail(currentWidget, locale: localeStr); + } +} diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart new file mode 100644 index 00000000..d54e9663 --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart @@ -0,0 +1,50 @@ +part of 'widget_detail_bloc.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: 详情状态类 + +abstract class DetailState extends Equatable { + const DetailState(); + + @override + List get props => []; +} + +class DetailWithData extends DetailState { + final WidgetModel widgetModel; + final List links; + final List nodes; + + const DetailWithData({ + required this.widgetModel, + required this.nodes, + required this.links, + }); + + @override + List get props => [widgetModel, nodes]; + + @override + String toString() { + return 'DetailWithData{widget: $widgetModel, nodes: $nodes}'; + } + + DetailWithData copyWith({ + WidgetModel? widgetModel, + List? links, + List? nodes, + }) { + return DetailWithData( + widgetModel: widgetModel ?? this.widgetModel, + nodes: this.nodes, + links: this.links, + ); + } +} + +class DetailLoading extends DetailState {} + +class DetailEmpty extends DetailState {} + +class DetailFailed extends DetailState {} diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart new file mode 100644 index 00000000..3da35ffc --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -0,0 +1,137 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:app/app.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; + +part 'widgets_event.dart'; + +part 'widgets_state.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: 处理主页 Widget 列表加载逻辑 + +class WidgetsBloc extends Bloc { + final WidgetRepository repository; + + WidgetsBloc({required this.repository}) : super(const WidgetsLoading()) { + on(_onEventTabTap); + on(_onEventLoadMore); + on(_onEventRefresh); + on(_onEventSearchWidget); + } + + /// 切换页签,以 [family] 为过滤项 + void _onEventTabTap(EventTabTap event, Emitter emit) async { + // emit(const WidgetsLoading(operate: LoadOperate.load)); + int size = kIsDesk ? 1000 : 20; + WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size,locale: event.locale); + try { + final List widgets = await repository.searchWidgets(filter); + emit(WidgetsLoaded( + widgets: widgets, + filter: filter, + operate: LoadOperate.load, + )); + } catch (err, t) { + print("======$err==========$t=============="); + emit(WidgetsLoadFailed( + err.toString(), + filter: filter, + operate: LoadOperate.load, + )); + } + } + + FutureOr _onEventRefresh( + EventRefresh event, Emitter emit) async { + try { + await Future.delayed(const Duration(milliseconds: 500)); + final List widgets = + await repository.searchWidgets(state.filter.copyWith(page: 1)); + emit(WidgetsLoaded( + widgets: widgets, + filter: state.filter, + operate: LoadOperate.refresh, + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); + } catch (err) { + print(err); + emit(WidgetsLoadFailed( + err.toString(), + filter: state.filter, + operate: LoadOperate.refresh, + )); + } + } + + FutureOr _onEventLoadMore( + EventLoadMore event, Emitter emit) async { + if (state is WidgetsLoaded) { + WidgetsLoaded old = (state as WidgetsLoaded); + int total = await repository.total(old.filter); + if (old.widgets.length < old.filter.pageSize) { + // 不满一页 + emit(old.copyWith( + full: true, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); + return; + } + + if (total <= old.widgets.length) { + // 已满 + emit(old.copyWith( + full: true, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); + return; + } + // 未满,继续加载下一页 + int pageIndex = old.widgets.length ~/ old.filter.pageSize + 1; + WidgetFilter filter = old.filter.copyWith(page: pageIndex); + final List newData = await repository.searchWidgets(filter); + List newWidget = old.widgets + newData; + emit(old.copyWith( + widgets: newWidget, + full: newWidget.length == total, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch, + filter: filter, + )); + } + } + + void _onEventSearchWidget( + EventSearchWidget event, Emitter emit) async { + emit(const WidgetsLoading(operate: LoadOperate.load)); + try { + final List widgets = + await repository.searchWidgets(event.filter); + emit(WidgetsLoaded( + widgets: widgets, + filter: event.filter, + operate: LoadOperate.load, + )); + } catch (err) { + print(err); + emit(WidgetsLoadFailed( + err.toString(), + filter: event.filter, + operate: LoadOperate.load, + )); + } + } + + void changeLocale(Locale locale) { + add(EventTabTap( + state.filter.family??WidgetFamily.stateless, + locale: '${locale.languageCode}-${locale.countryCode}'.toLowerCase() + )); + } +} diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart new file mode 100644 index 00000000..7dcdacbd --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart @@ -0,0 +1,40 @@ +part of 'widgets_bloc.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class WidgetsEvent extends Equatable { + const WidgetsEvent(); + @override + List get props => []; +} + +class EventTabTap extends WidgetsEvent { + final WidgetFamily family; + final String? locale; + + const EventTabTap(this.family,{this.locale}); + + @override + List get props => [family]; +} + +class EventLoadMore extends WidgetsEvent { + + @override + List get props => []; +} + +class EventRefresh extends WidgetsEvent { + + @override + List get props => []; +} + + +class EventSearchWidget extends WidgetsEvent { + final WidgetFilter filter;//参数 + const EventSearchWidget({required this.filter}); +} + diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart new file mode 100644 index 00000000..e9fd3efc --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart @@ -0,0 +1,88 @@ +part of 'widgets_bloc.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: 主页 Widget 列表 状态类 + +/// 对于一个可查询、可分页的数据集 +/// 状态类持有过滤数据 Filter, 任何衍生状态都需要感知过滤的信息,比如加载异常,点击重试,可以基于最后的过滤状态。 +/// 分页加载 信息需要 了解 总数据、页数、每页含量 +/// + +sealed class WidgetsState extends Equatable { + final WidgetFilter filter; + final LoadOperate operate; + + const WidgetsState({required this.filter, required this.operate}); + + @override + List get props => [filter]; +} + +class WidgetsLoading extends WidgetsState { + const WidgetsLoading({ + super.filter = const WidgetFilter(), + super.operate = LoadOperate.load, + }); +} + +/// [full] 是否已满,用于加载更多到底的标识 +/// [widgets] 加载的数据 +class WidgetsLoaded extends WidgetsState { + final List widgets; + final bool full; + final int fetchTime; + + const WidgetsLoaded({ + this.widgets = const [], + required super.filter, + required super.operate, + this.full = false, + this.fetchTime = 0, + }); + + @override + List get props => [widgets, full, filter, operate, fetchTime]; + + @override + String toString() { + return 'WidgetsLoaded{widgets: $widgets}'; + } + + WidgetsLoaded copyWith({ + List? widgets, + bool? full, + LoadOperate? operate, + WidgetFilter? filter, + int? fetchTime, + }) { + return WidgetsLoaded( + widgets: widgets ?? this.widgets, + full: full ?? this.full, + operate: operate ?? this.operate, + filter: filter ?? this.filter, + fetchTime: fetchTime ?? this.fetchTime, + ); + } +} + +class WidgetsLoadFailed extends WidgetsState { + final String error; + + const WidgetsLoadFailed(this.error, + {required super.filter, required super.operate}); + + @override + List get props => [error]; +} + +/// 加载类型 +/// [load] 加载第一页数据, 用于首次加载, +/// [refresh] 下拉刷新状态标识。之前加载的更多数据将会被移除 +/// [more] 加载更多状态标识。 +/// +enum LoadOperate { + load, + refresh, + more, +} diff --git a/modules/widget_system/widget_module/lib/event/widget_event.dart b/modules/widget_system/widget_module/lib/event/widget_event.dart new file mode 100644 index 00000000..0a38e6e5 --- /dev/null +++ b/modules/widget_system/widget_module/lib/event/widget_event.dart @@ -0,0 +1,16 @@ +import 'package:fx_trace/fx_trace.dart'; + +import '../widget_module.dart'; + +class SelectWidgetEvent extends FxEvent { + final String name; + final int? id; + final WidgetModel? model; + + + SelectWidgetEvent({ + required this.name, + this.id, + this.model, + }); +} diff --git a/modules/widget_system/widget_module/lib/views/components/collected_tag.dart b/modules/widget_system/widget_module/lib/views/components/collected_tag.dart new file mode 100644 index 00000000..62a1d2da --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/components/collected_tag.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/ext.dart'; +import 'package:wrapper/wrapper.dart'; + +class CollectedTag extends StatelessWidget { + const CollectedTag({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color color = Theme.of(context).primaryColor; + String text = context.l10n.favorite; + return Wrapper.just( + radius: 10, + color: isDark ? const Color(0xff292A2D) : const Color(0xffF3F3F5), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text( + text, + style: TextStyle(color: color, height: 1, fontSize: 10, shadows: [ + Shadow( + color: isDark ? Colors.black : Colors.white, + blurRadius: 2, + offset: const Offset(1, 1), + ) + ]), + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart new file mode 100644 index 00000000..f142b23d --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -0,0 +1,64 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:fx_env/fx_env.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class WidgetLogo extends StatelessWidget { + final Color background; + final String widgetName; + + const WidgetLogo({ + super.key, + required this.background, + required this.widgetName, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 110, + height: 110, + alignment: Alignment.center, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform: const GradientRotation(270 * 180 / pi), + colors: [ + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), + ), + child: SvgPicture.asset( + 'assets/images/widgets/${widgetLogo(widgetName)}', + width: kApp.isDesktopUI ? 90 : 80, + ), + ); + } +} + +String widgetLogo(String widgetName) { + return switch (widgetName) { + 'Container' => 'Container.svg', + 'Text' => 'Text.svg', + 'GestureDetector' => 'GestureDetector.svg', + 'CircleAvatar' => 'CircleAvatar.svg', + 'Card' => 'Card.svg', + 'ListView' => 'ListView.svg', + 'GridView' => 'GridView.svg', + 'SingleChildScrollView' => 'SingleChildScrollView.svg', + 'PageView' => 'PageView.svg', + 'InputChip' => 'InputChip.svg', + 'Chip' => 'Chip.svg', + 'FilterChip' => 'FilterChip.svg', + 'MaterialButton' => 'MaterialButton.svg', + 'FlutterLogo' => 'FlutterLogo.svg', + 'RichText' => 'RichText.svg', + 'FloatingActionButton' => 'FloatingActionButton.svg', + 'Banner' => 'Banner.svg', + 'Icon' => 'Icon.svg', + _ => 'Widget.svg', + }; +} diff --git a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart similarity index 86% rename from lib/widget_ui/desk_ui/category_panel/desk_category_page.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart index 38ddb395..6550094e 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart @@ -1,16 +1,15 @@ -import 'package:app_config/app/style/gap.dart'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; -import '../../../components/top_bar/desk_tab_top_bar.dart'; +import 'package:widget_repository/widget_repository.dart'; import '../../mobile/category_page/category_list_item.dart'; import '../../mobile/category_page/delete_category_dialog.dart'; import '../../mobile/category_page/edit_category_panel.dart'; -import '../../mobile/category_page/like_widget_page.dart'; import 'desk_top_like_panel.dart'; class DeskCategoryPage extends StatefulWidget { @@ -31,9 +30,7 @@ class _DeskCategoryPageState extends State { children: [ DeskTabTopBar(onTabPressed: (int value) { _ctrl.jumpToPage(value); - }, tabs: ['收藏记录','珍藏组件', - // '添加收藏集' - ],), + }, tabs: ['组件酒肆','珍藏组件'],), Expanded(child: PageView( controller: _ctrl, children: [ @@ -50,23 +47,23 @@ class _DeskCategoryPageState extends State { class DeskCateGoryPage extends StatelessWidget { const DeskCateGoryPage({Key? key}) : super(key: key); - final SliverGridDelegate deskGridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 300, - mainAxisSpacing: 10, - mainAxisExtent: 260, - crossAxisSpacing: 10, - ); + @override Widget build(BuildContext context) { + const SliverGridDelegate deskGridDelegate = SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 240, + mainAxisSpacing: 8, + mainAxisExtent: 220, + crossAxisSpacing: 8, + ); CategoryBloc bloc = context.read(); CategoryState state = bloc.state; if(state is CategoryLoadedState){ return GridView.builder( itemCount: state.categories.length, - padding: EdgeInsets.all(20), + padding: EdgeInsets.all(12), gridDelegate: deskGridDelegate, itemBuilder: (_, index) => GestureDetector( onTap: () => _toDetailPage(context, state.categories[index]), child: CategoryListItem( @@ -145,7 +142,9 @@ class DeskCateGoryPage extends StatelessWidget { void _toDetailPage(BuildContext context, CategoryModel model) { BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); - Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); + // Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + context.push('${AppRoute.collectionDetail.url}${model.id}',extra: model); } diff --git a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart similarity index 87% rename from lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart index 96688c40..ff2f7f1a 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart @@ -1,11 +1,12 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/widget_detail_page.dart'; import 'package:widget_module/blocs/blocs.dart'; + import 'package:widget_repository/widget_repository.dart'; import '../../mobile/widget_detail/collect_widget_list_item.dart'; +import '../../mobile/widget_detail/widget_detail_page.dart'; class DeskLikePage extends StatelessWidget { const DeskLikePage({Key? key}) : super(key: key); @@ -48,7 +49,7 @@ class DeskLikePage extends StatelessWidget { _toDetailPage(BuildContext context, WidgetModel model) { // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.push(context, Right2LeftRouter(child: WidgetDetailPageScope(model: model))); + Navigator.push(context, SlidePageRoute(child: WidgetDetailPageScope(model: model))); } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart b/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart new file mode 100644 index 00000000..77d7097a --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart @@ -0,0 +1,5 @@ +export 'widget_detail/widget_detail_page.dart'; +export 'category_panel/desk_category_page.dart'; +export 'widget_panel/widget_panel.dart'; +export 'widget_panel/desk_search_bar.dart'; +export 'widget_panel/desk_search_bar_v2.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart new file mode 100644 index 00000000..ad6b1249 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../blocs/blocs.dart'; +import '../../widget_module.dart'; +import '../components/collected_tag.dart'; + + +class LikeTag extends StatelessWidget { + final WidgetModel widget; + + const LikeTag({super.key, required this.widget}); + + @override + Widget build(BuildContext context) { + bool show = context.select( + (LikeWidgetBloc bloc) => bloc.state.widgets.contains(widget), + ); + if (show) { + return GestureDetector( + onTap: (){ + context.read().add(ToggleLikeWidgetEvent(id: widget.id)); + }, + child: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.3), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), + bottomRight: Radius.circular(8), + ) + ), + child: Icon(Icons.star,color: Colors.white,size: 16,), + ), + ); + } + return const SizedBox(); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart new file mode 100644 index 00000000..b357dc4c --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart @@ -0,0 +1,54 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class LinkWidgetButtons extends StatelessWidget { + final List links; + final ValueChanged onSelect; + + const LinkWidgetButtons( + {Key? key, required this.links, required this.onSelect}) + : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + Color? chipColor = isDark + ? Theme.of(context).floatingActionButtonTheme.backgroundColor + : Theme.of(context).primaryColor; + + if (links.isEmpty) { + return Padding( + padding: const EdgeInsets.only(left: 10), + child: Chip( + backgroundColor: Colors.grey.withAlpha(120), + labelStyle: const TextStyle(fontSize: 12, color: Colors.white), + label: const Text('暂无链接组件'), + )); + } else { + return Padding( + padding: const EdgeInsets.only(left: 10.0, top: 10), + child: Wrap( + spacing: 5, + runSpacing: 5, + children: links + .map((WidgetModel model) => ActionChip( + labelPadding: EdgeInsets.zero, + side: BorderSide.none, + onPressed: () => onSelect(model), + elevation: 1, + // shadowColor: chipColor, + backgroundColor: chipColor, + labelStyle: model.deprecated + ? UnitTextStyle.deprecatedChip + : UnitTextStyle.commonChip, + label: Text(model.name), + )) + .toList(), + ), + ); + } + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart new file mode 100644 index 00000000..274a2bfa --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart @@ -0,0 +1,126 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:utils/utils.dart'; + + +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class DeskSliverWidgetDetailBar extends StatelessWidget { + final WidgetModel model; + + const DeskSliverWidgetDetailBar({Key? key, required this.model}) + : super(key: key); + + final Color backgroundColor = const Color(0xffFAFAFA); + static const Color textColor = Color(0xff262626); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? appBarColor = Theme.of(context).appBarTheme.backgroundColor; + Color? appBarTextColor = Theme.of(context).appBarTheme.titleTextStyle?.color; + + return SliverAppBar( + pinned: true, + backgroundColor: isDark? appBarColor:backgroundColor, + titleTextStyle: TextStyle(color: isDark?appBarTextColor:Color(0xff696969)), + iconTheme: IconThemeData(color: isDark?appBarTextColor:Color(0xff696969)), + expandedHeight: 120.0, + scrolledUnderElevation: 0.5, + flexibleSpace: DragToMoveWrapper( + child: DiyFlexibleSpaceBar( + centerTitle: false, + expandedTitleScale: 2, + titleIconBuilder: (t) => WindmillWidget( + rotate: t * 2 * pi * 2, + radius: 15, + ), + fixedSubtitle: Text( + model.name, + style: TextStyle(color:isDark?appBarTextColor:Color(0xff696969), fontSize: 12), + ), + title: Padding( + padding: const EdgeInsets.only(bottom: 3), + child: Text( + model.nameCN, + style: TextStyle(color:isDark?appBarTextColor: textColor, fontSize: 16), + ), + ), + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 20, bottom: 10), + //标题边距 + collapseMode: CollapseMode.parallax, + ), + ), + elevation: 0, + actions: [ + + WindowButtons( + actions: [ + _buildToHome(context), + FeedbackWidget( + onPressed: () => _toggleLikeState(context), + child: BlocConsumer( + listener: _listenLikeStateChange, + builder: _buildByLikeState, + ), + ), + ], + ) + ], + ); + } + + void _toggleLikeState(BuildContext context) { + BlocProvider.of(context).add( + ToggleLikeWidgetEvent(id: model.id), + ); + } + + // 监听 LikeWidgetBloc 伺机弹出 toast + void _listenLikeStateChange(BuildContext context, LikeWidgetState state) { + bool collected = state.widgets.contains(model); + String msg = + collected ? "收藏【${model.name}】组件成功!" : "已取消【${model.name}】组件收藏!"; + Toast.toast( + context, + msg, + duration: Duration(milliseconds: collected ? 1500 : 600), + action: collected + ? SnackBarAction( + textColor: Colors.white, + label: '收藏夹管理', + onPressed: () => Scaffold.of(context).openEndDrawer()) + : null, + ); + } + + // 根据 [LikeWidgetState ] 构建图标 + Widget _buildByLikeState(BuildContext context, LikeWidgetState state) { + bool liked = state.widgets.contains(model); + return SizedBox( + width: 30, + height: 30, + child: Icon( + liked ? TolyIcon.icon_star_ok : TolyIcon.icon_star_add, + size: 20, + ), + ); + } + + Widget _buildToHome(BuildContext context) => GestureDetector( + onLongPress: () => Scaffold.of(context).openEndDrawer(), + child:const SizedBox( + width: 30, + height: 30, + child: Icon(Icons.home,size: 20,), + ), + onTap: () => Navigator.of(context).pop()); +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart new file mode 100644 index 00000000..c6ed4726 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -0,0 +1,143 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../../mobile/mobile_ui.dart'; +import '../../mobile/widget_detail/category_end_drawer.dart'; +import '../../mobile/widget_detail/node_display/node_display.dart'; +import 'link_widget_buttons.dart'; +import 'widget_detail_bar.dart'; +import 'widget_detail_panel.dart'; + +// 用于组件详情不需要在一开始就加载 +// WidgetDetailBloc 可以在稍后提供 +class DeskWidgetDetailPageScope extends StatefulWidget { + final WidgetModel? model; + final String? widgetName; + + const DeskWidgetDetailPageScope( + {super.key, required this.model, this.widgetName}); + + @override + State createState() => + _DeskWidgetDetailPageScopeState(); +} + +class _DeskWidgetDetailPageScopeState extends State { + WidgetModel? _model; + + WidgetRepository get widgetRepository => + context.read().repository; + + NodeRepository get nodeRepository => + kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); + + @override + void initState() { + super.initState(); + _model = widget.model; + if (_model == null) { + _loadModelByName(); + } + } + + void _loadModelByName() async { + _model = await widgetRepository.queryWidgetByName(widget.widgetName); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + if (_model == null) + return const Center(child: CupertinoActivityIndicator()); + Locale locale = context.read().state.language.locale; + // Locale locale = Localizations.localeOf(context); + // String? countryCode = locale.countryCode; + // if (countryCode == null) {} + String localeStr = '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + + return BlocProvider( + create: (_) => WidgetDetailBloc( + widgetRepo: widgetRepository, + nodeRepo: nodeRepository, + )..push(_model!, locale: localeStr), + child: DeskWidgetDetailPage( + model: widget.model, + ), + ); + } +} + +class DeskWidgetDetailPage extends StatelessWidget { + final WidgetModel? model; + + const DeskWidgetDetailPage({Key? key, required this.model}) : super(key: key); + + @override + Widget build(BuildContext context) { + WidgetDetailBloc bloc = context.watch(); + DetailState state = context.watch().state; + WidgetModel widget = bloc.currentWidget; + return BlocListener( + listenWhen: (p, n) => p.language != n.language, + listener: (_, state) { + BlocProvider.of(context) + .changeLocale(state.language.locale); + }, + child: Scaffold( + backgroundColor: Theme.of(context).appBarTheme.backgroundColor, + endDrawer: CategoryEndDrawer(widget: widget), + body: Builder(builder: (ctx) { + return _buildContent(ctx, bloc, state); + }), + ), + ); + } + + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); + + Widget _buildContent( + BuildContext context, WidgetDetailBloc bloc, DetailState state) { + return WillPopScope( + onWillPop: () => _whenPop(context), + child: CustomScrollView( + slivers: [ + DeskSliverWidgetDetailBar(model: bloc.currentWidget), + SliverToBoxAdapter( + child: Column( + children: [ + DeskWidgetDetailPanel(model: bloc.currentWidget, state: state,), + const Divider(height: 18,) + ], + ), + ), + if (state is DetailWithData) + SliverNodeList( + nodes: state.nodes, + model: state.widgetModel, + ) + ], + )); + } + + Future _whenPop(BuildContext context) async { + WidgetDetailBloc detailBloc = context.read(); + if (Scaffold.of(context).isEndDrawerOpen) { + return true; + } + return detailBloc.pop(); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart new file mode 100644 index 00000000..ea3b269a --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_star/flutter_star.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'dart:math'; + +import '../../../blocs/blocs.dart'; +import '../../components/widget_logo_map.dart'; + +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:l10n/l10n.dart'; +import 'link_widget_buttons.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class DeskWidgetDetailPanel extends StatelessWidget { + final WidgetModel model; + final DetailState state; + + const DeskWidgetDetailPanel( + {Key? key, required this.model, required this.state}) + : super(key: key); + + @override + Widget build(BuildContext context) { + Color color = Theme.of(context).primaryColor; + + return Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildLeft(model, context), + const SizedBox(width: 12), + _buildRight(color, model), + ], + ), + ); + } + + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + ], + ); + + Widget _buildLeft(WidgetModel model, BuildContext context) => Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Panel( + color: Color(0x33E5EAE1), + child: Text(model.info), + ), + const SizedBox(height: 16), + linkText(context), + if (state is DetailWithData) + LinkWidgetButtons( + links: (state as DetailWithData).links, + onSelect: (v) { + context.read().push(v); + }) + ], + ), + ); + + Widget _buildRight(Color color, WidgetModel model) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Hero( + tag: "hero_widget_image_${model.id}", + child: WidgetLogo( + widgetId: model.id, + background: color, + widgetName: model.name, + ), + ), + const SizedBox( + height: 6, + ), + StarScore( + score: model.lever, + star: Star(size: 15, fillColor: color), + ) + ], + ); +} + +class WidgetLogo extends StatelessWidget { + final Color background; + final String widgetName; + final int widgetId; + + const WidgetLogo({ + super.key, + required this.background, + required this.widgetName, + required this.widgetId, + }); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + width: 240, + height: 160, + alignment: Alignment.center, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform: const GradientRotation(270 * 180 / pi), + colors: [ + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: BorderRadius.circular(6), + ), + child: SvgPicture.asset( + 'assets/images/widgets/${widgetLogo(widgetName)}', + width: 140, + ), + ), + Positioned( + bottom: 2, + left: 6, + child: Text( + "#$widgetId", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + color: Colors.white70, + ), + )) + ], + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart new file mode 100644 index 00000000..cdf6533a --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart @@ -0,0 +1,166 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:toggle_rotate/toggle_rotate.dart'; +import 'package:utils/utils.dart'; + +/// create by 张风捷特烈 on 2020-04-13 +/// contact me by email 1981462002@qq.com +/// 说明: 一个Widget的知识点对应的界面 + +class DeskWidgetNodePanel extends StatefulWidget { + final String text; + final String subText; + final String code; + final Widget? show; + final HighlighterStyle? codeStyle; + final String? codeFamily; + final bool death; + + const DeskWidgetNodePanel( + {Key? key, + this.text = '', + this.subText = '', + this.code = '', + this.death = false, + this.show, + required this.codeStyle, + this.codeFamily}) + : super(key: key); + + @override + _DeskWidgetNodePanelState createState() => _DeskWidgetNodePanelState(); +} + +class _DeskWidgetNodePanelState extends State { + CrossFadeState _crossFadeState = CrossFadeState.showFirst; + + bool get isFirst => _crossFadeState == CrossFadeState.showFirst; + + Color get themeColor => Theme.of(context).primaryColor; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + buildNodeTitle(), + const SizedBox( + height: 20, + ), + _buildCode(context), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 10, bottom: 20), + child: widget.show, + ), + ), + ), + if (!widget.death) Expanded(child: _buildNodeInfo()), + ], + ), + const SizedBox( + height: 16, + ), + const Divider(), + ], + ), + ); + } + + Widget buildNodeTitle() => Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Circle( + color: themeColor, + radius: 5, + ), + ), + Expanded( + child: Text( + widget.text, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + ), + _buildShareButton(), + _buildCodeButton(), + ], + ); + + Widget _buildNodeInfo() => SizedBox( + width: double.infinity, + child: Panel( + color: Color(0x33E5EAE1), + child: Text( + widget.subText, + style: const TextStyle(fontSize: 12), + )), + ); + + Widget _buildCodeButton() => Padding( + padding: const EdgeInsets.only(right: 10.0), + child: ToggleRotate( + durationMs: 300, + child: Icon( + TolyIcon.icon_code, + color: themeColor, + ), + onTap: _toggleCodePanel, + ), + ); + + Widget _buildShareButton() => FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _doShare, + child: Padding( + padding: const EdgeInsets.only(right: 10), + child: Icon( + Icons.copy, + size: 20, + color: themeColor, + ), + ), + ); + + Widget _buildCode(BuildContext context) => AnimatedCrossFade( + firstCurve: Curves.easeInCirc, + secondCurve: Curves.easeInToLinear, + firstChild: const SizedBox(), + secondChild: SizedBox( + width: MediaQuery.of(context).size.width, + child: CodeWidget( + fontFamily: widget.codeFamily, + code: isFirst ? '' : widget.code, + style: widget.codeStyle ?? + HighlighterStyle.fromColors(HighlighterStyle.lightColor), + ), + ), + duration: const Duration(milliseconds: 200), + crossFadeState: _crossFadeState, + ); + + //执行分享 + void _doShare() async { + // Share.share(widget.code); + await Clipboard.setData(ClipboardData(text: widget.code)); + Toast.success(context, '代码复制成功!'); + } + + // 折叠代码面板 + void _toggleCodePanel() { + setState(() { + _crossFadeState = + !isFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond; + }); + } +} diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart similarity index 87% rename from lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index b4df155e..f41f2f1a 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; @@ -36,12 +36,7 @@ class _DeskSearchBarState extends State { focusScope.unfocus(); } _controller.clear(); - - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}',extra: model); } Future> buildOptions(TextEditingValue textEditingValue) async { @@ -60,11 +55,12 @@ class _DeskSearchBarState extends State { } Widget _buildOptionsView(BuildContext context, AutocompleteOnSelected onSelected, Iterable options) { + return Align( alignment: Alignment.topLeft, child: Material( - color: Colors.white, elevation: 6, + color: Colors.white, borderRadius: BorderRadius.circular(8), shadowColor: Colors.black, child: ConstrainedBox( @@ -96,6 +92,8 @@ class _DeskSearchBarState extends State { Widget _buildFieldView(BuildContext context, TextEditingController textEditingController, FocusNode focusNode, VoidCallback onFieldSubmitted) { _controller = textEditingController; + bool isDark = Theme.of(context).brightness == Brightness.dark; + return TextField( controller: textEditingController, onChanged: widget.onChanged, @@ -109,14 +107,13 @@ class _DeskSearchBarState extends State { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), prefixIcon: Icon( Icons.search, size: 18, color: Colors.grey, ), focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(8)), ), @@ -126,7 +123,7 @@ class _DeskSearchBarState extends State { borderSide: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(8)), ), - hintText: "输入组件名称", + hintText: context.l10n.enterComponentName, hintStyle: TextStyle(fontSize: 12, color: Colors.grey)), ); @@ -139,15 +136,18 @@ class _DeskSearchBarState extends State { ); InlineSpan formSpan(String src, String pattern) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? textColor = Theme.of(context).listTileTheme.textColor; + List span = []; - RegExp regExp = RegExp(pattern, caseSensitive: false); + RegExp regExp = RegExp(RegExp.escape(pattern), caseSensitive: false); src.splitMapJoin(regExp, onMatch: (Match match) { span.add(TextSpan(text: match.group(0), style: lightTextStyle)); return ''; }, onNonMatch: (str) { span.add(TextSpan( text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032),fontSize: 12))); + style: lightTextStyle.copyWith(color: isDark?textColor:const Color(0xff2F3032),fontSize: 12))); return ''; }); return TextSpan(children: span); diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart new file mode 100644 index 00000000..701ed44a --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart @@ -0,0 +1,192 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/event/widget_event.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:fx_trace/fx_trace.dart'; + +class GlobalFindDialog extends StatefulWidget { + final ValueChanged? onChanged; + + const GlobalFindDialog({Key? key, this.onChanged}) : super(key: key); + + @override + State createState() => _GlobalFindDialogState(); +} + +class _GlobalFindDialogState extends State { + late TextEditingController _controller = TextEditingController(); + + // final PopoverController controller = PopoverController(); + + @override + void initState() { + _focusNode.addListener(_onFocusChange); + + super.initState(); + } + + @override + void dispose() { + super.dispose(); + _focusNode.removeListener(_onFocusChange); + } + + void _onFocusChange() { + // if (_focusNode.hasFocus) { + // controller.open(); + // } else { + // controller.close(); + // } + } + + @override + Widget build(BuildContext context) { + return Dialog( + surfaceTintColor: Colors.transparent, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + child: SizedBox( + width: 400, + height: 400, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + SizedBox(height: 32, child: _buildFieldView()), + Expanded(child: _buildOptionsView()), + ], + ), + ), + )); + ; + } + + void onSelected(WidgetModel model) { + final FocusScopeNode focusScope = FocusScope.of(context); + if (focusScope.hasFocus) { + focusScope.unfocus(); + } + _controller.clear(); + Navigator.of(context).pop(); + FxEmitter().emit(SelectWidgetEvent(name: model.name)); + } + + Iterable options = []; + + void searchByArgs(String text) async { + WidgetRepository repository = context.read().repository; + options = await repository.searchWidgets(WidgetFilter(name: text)); + setState(() {}); + } + + Widget _buildOptionsView() { + return Align( + alignment: Alignment.topLeft, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: ListView.builder( + itemCount: options.length, + padding: const EdgeInsets.symmetric(vertical: 10), + itemBuilder: (_, index) { + WidgetModel model = options.elementAt(index); + return InkWell( + onTap: () => onSelected(model), + child: Ink( + padding: + const EdgeInsets.symmetric(vertical: 6, horizontal: 15), + child: Row( + children: [ + Expanded( + child: Text.rich( + formSpan(model.name, _controller.text), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 12))), + // Spacer(), + const SizedBox( + width: 10, + ), + Text( + model.nameCN, + style: const TextStyle(fontSize: 12), + ), + ], + ), + ), + ); + }), + ), + ); + } + + final FocusNode _focusNode = FocusNode(); + FocusNode get focusNode => _focusNode; + + Widget _buildFieldView() { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return TextField( + autofocus: true, + controller: _controller, + onChanged: (value) { + searchByArgs(value); + }, + style: const TextStyle(fontSize: 12), + maxLines: 1, + focusNode: focusNode, + decoration: InputDecoration( + prefixIconConstraints: const BoxConstraints(minWidth: 30), + filled: true, + hoverColor: Colors.transparent, + contentPadding: const EdgeInsets.only(top: 0), + fillColor: isDark ? null : const Color(0xffF1F2F3), + prefixIcon: const Icon( + Icons.search, + size: 18, + color: Colors.grey, + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Theme.of(context).primaryColor), + borderRadius: const BorderRadius.all(Radius.circular(8)), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + hintText: '搜索', + hintStyle: const TextStyle(fontSize: 12, color: Colors.grey)), + ); + } + + final TextStyle lightTextStyle = const TextStyle( + color: Colors.red, + fontSize: 12, + fontWeight: FontWeight.bold, + ); + + InlineSpan formSpan(String src, String pattern) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? textColor = Theme.of(context).listTileTheme.textColor; + + List span = []; + RegExp regExp = RegExp(RegExp.escape(pattern), caseSensitive: false); + src.splitMapJoin(regExp, onMatch: (Match match) { + span.add(TextSpan(text: match.group(0), style: lightTextStyle)); + return ''; + }, onNonMatch: (str) { + span.add(TextSpan( + text: str, + style: lightTextStyle.copyWith( + color: isDark ? textColor : const Color(0xff2F3032), + fontSize: 12))); + return ''; + }); + return TextSpan(children: span); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart new file mode 100644 index 00000000..a8908c88 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -0,0 +1,88 @@ +import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; + +import 'desk_search_bar.dart'; + +class DeskWidgetTopBar extends StatefulWidget { + final ValueChanged onTabPressed; + + const DeskWidgetTopBar({Key? key,required this.onTabPressed}) : super(key: key); + + @override + State createState() => _DeskWidgetTopBarState(); +} + +class _DeskWidgetTopBarState extends State with SingleTickerProviderStateMixin { + late TabController tabController; + + + List get _tabs =>[ + context.l10n.stateless, + context.l10n.stateful, + context.l10n.single, + context.l10n.multi, + context.l10n.sliver, + context.l10n.proxy, + context.l10n.other, + ]; + + + @override + void initState() { + super.initState(); + tabController = TabController(length: 7, vsync: this); + } + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveWrapper( + child: Container( + padding: const EdgeInsets.only(left: 20), + height: 64, + color: isDark?Color(0xff2C3036):Colors.white, + child: Row( + children: [ + SizedBox( + width: 380, + child: TabBar( + onTap: widget.onTabPressed, + tabAlignment: TabAlignment.start, + indicatorSize: TabBarIndicatorSize.label, + labelPadding: const EdgeInsets.symmetric(horizontal: 6), + isScrollable: true, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: + _tabs.map((String name) => Tab(text: name)).toList(), + ), + ), + Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: SizedBox( + width: 250, height: 30, child: DeskSearchBar( + )), + ), + // const SizedBox(width: 20,), + const WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart new file mode 100644 index 00000000..073713ff --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart @@ -0,0 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../../../widget_module.dart'; + +class WidgetIdView extends StatelessWidget { + final WidgetModel model; + + const WidgetIdView({super.key, required this.model}); + + @override + Widget build(BuildContext context) { + return Text( + "#${model.id}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, + color: Colors.white70, + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart new file mode 100644 index 00000000..e79767fe --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -0,0 +1,113 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/event/widget_event.dart'; +import 'package:widget_module/widget_module.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:fx_trace/fx_trace.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'desk_widget_top_bar.dart'; +import 'widget_tiled.dart'; + +class DeskWidgetPanel extends StatefulWidget { + final Widget? header; + const DeskWidgetPanel({super.key, this.header}); + + @override + State createState() => _DeskWidgetPanelState(); +} + +class _DeskWidgetPanelState extends State { + @override + Widget build(BuildContext context) { + WidgetsState state = context.watch().state; + + return Scaffold( + body: Column( + children: [ + DeskWidgetTopBar(onTabPressed: _switchTab), + const Divider(height: 1), + Expanded( + child: switch (state) { + WidgetsLoading() => const CupertinoActivityIndicator(), + WidgetsLoaded() => WidgetList( + state: state, + header: widget.header, + ), + WidgetsLoadFailed() => + Center(child: Text("${state.runtimeType}")), + }, + ), + ], + ), + ); + } + + void _switchTab(int index) { + WidgetFamily widgetFamily = WidgetFamily.values[index]; + context.switchWidgetFamily(widgetFamily); + } +} + +class WidgetList extends StatelessWidget { + final Widget? header; + + final WidgetsLoaded state; + + const WidgetList({super.key, required this.state, this.header}); + + @override + Widget build(BuildContext context) { + SliverGridDelegate gridDelegate = + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 400, + mainAxisSpacing: 10, + mainAxisExtent: 110, + crossAxisSpacing: 10, + ); + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: Theme.of(context).listTileTheme.tileColor, + borderRadius: BorderRadius.circular(8)), + height: 180, + child: header, + ), + ), + SliverPadding( + padding: const EdgeInsets.only(left: 14, right: 14, bottom: 8), + sliver: SliverGrid.builder( + gridDelegate: gridDelegate, + itemBuilder: _buildItem, + itemCount: state.widgets.length, + ), + ) + ], + ); + + return GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + gridDelegate: gridDelegate, + itemBuilder: _buildItem, + itemCount: state.widgets.length, + ); + } + + Widget _buildItem(BuildContext context, int index) { + WidgetModel model = state.widgets[index]; + return WidgetTiled( + model: model, + onTap: () { + context.push('${AppRoute.widgetDetail.url}${model.name}', extra: model); + }, + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart new file mode 100644 index 00000000..631d5a12 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart @@ -0,0 +1,209 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_star/flutter_star.dart'; +import 'package:widget_module/blocs/action/widget_action.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:wrapper/wrapper.dart'; +import 'package:tolyui/tolyui.dart'; +import '../../components/widget_logo_map.dart'; +import '../like_tag.dart'; +import 'package:l10n/l10n.dart'; + +import 'widget_id_view.dart'; + +class WidgetTiled extends StatelessWidget { + final WidgetModel model; + final VoidCallback onTap; + final String? searchArg; + + const WidgetTiled({ + super.key, + required this.model, + required this.onTap, + this.searchArg, + }); + + @override + Widget build(BuildContext context) { + ThemeData theme = Theme.of(context); + ListTileThemeData data = theme.listTileTheme; + Color? tileColor = data.tileColor; + Color? textColor = data.textColor; + bool isDark = theme.brightness == Brightness.dark; + textColor = isDark ? textColor : const Color(0xff2F3032); + Color color = theme.primaryColor; + EdgeInsetsGeometry padding = + const EdgeInsets.symmetric(horizontal: 12, vertical: 8); + + return Stack( + children: [ + InkWell( + borderRadius: BorderRadius.circular(6), + onTap: onTap, + child: Ink( + decoration: BoxDecoration( + color: tileColor, + borderRadius: BorderRadius.circular(6), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.1), + blurRadius: 2, + ) + ], + ), + child: Row( + children: [ + GestureDetector( + onLongPress: () => context.toggleLike(model.id), + child: Hero( + tag: model.heroId, + child: WidgetLogo( + background: color, widgetName: model.name)), + ), + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildTitle(color, textColor, isDark), + _buildContent(textColor), + _buildFoot(isDark) + ], + ), + ), + ), + ], + ), + ), + ), + LikeTag(widget: model), + Positioned(bottom: 2, left: 6, child: WidgetIdView(model: model)) + ], + ); + } + + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); + + Widget listTitle(Color? textColor) { + return GestureDetector( + child: Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14, + color: textColor, + fontWeight: FontWeight.bold, + ), + ), + onLongPress: () async { + await Clipboard.setData(ClipboardData(text: model.name)); + $message.success(message: '名称复制成功!'); + }, + ); + } + + Widget _buildTitle(Color color, Color? textColor, bool isDark) { + Widget title; + if (searchArg == null) { + title = listTitle(textColor); + } else { + title = Text.rich(formSpan(model.name, searchArg!)); + } + return Row( + children: [ + Expanded(child: title), + StarScore( + star: Star(emptyColor: Colors.white, size: 12, fillColor: color), + score: model.lever, + ), + ], + ); + } + + Widget _buildContent(Color? textColor) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Text( + model.info, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 13, color: textColor), + ), + ); + } + + Widget _buildFoot(bool isDark) { + return Row( + children: [ + Container( + width: 4, + height: 4, + margin: const EdgeInsets.only(right: 6), + decoration: const BoxDecoration( + color: Color(0xff86909c), shape: BoxShape.circle), + ), + Expanded( + child: Text( + model.nameCN, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, height: 1, color: Color(0xff86909c)), + ), + ), + Wrapper.just( + radius: 4, + color: isDark ? const Color(0xff292A2D) : const Color(0xffF3F3F5), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text( + Cons.kWidgetFamilyLabelMap[model.family]!, + style: TextStyle( + color: + isDark ? const Color(0xffCCCCCC) : const Color(0xff878D96), + height: 1, + fontSize: 10, + shadows: [ + Shadow( + color: isDark ? Colors.black : Colors.white, + blurRadius: 2, + offset: const Offset(1, 1)) + ]), + ), + ), + ], + ); + } + + final TextStyle lightTextStyle = const TextStyle( + color: Colors.red, + fontSize: 16, + fontWeight: FontWeight.bold, + ); + + InlineSpan formSpan(String src, String pattern) { + List span = []; + RegExp regExp = RegExp(pattern, caseSensitive: false); + src.splitMapJoin(regExp, onMatch: (Match match) { + span.add(TextSpan(text: match.group(0), style: lightTextStyle)); + return ''; + }, onNonMatch: (str) { + span.add(TextSpan( + text: str, + style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); + return ''; + }); + return TextSpan(children: span); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart new file mode 100644 index 00000000..70fd7c1f --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart @@ -0,0 +1,159 @@ + +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_star/flutter_star.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:widget_module/blocs/blocs.dart'; + +import 'package:widget_repository/widget_repository.dart'; + + + +/// create by 张风捷特烈 on 2020-04-22 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryShow extends StatelessWidget { + final CategoryModel model; + + const CategoryShow({Key? key, required this.model}) : super(key: key); + + @override + Widget build(BuildContext context) { + CategoryWidgetState state = context.watch().state; + Widget child = const SizedBox(); + if (state is CategoryWidgetLoadedState) { + child = _buildWidgetList(state.widgets); + } + return Scaffold( + appBar: AppBar(title: Text(model.name)), + body: child, + ); + } + + Widget _buildWidgetList(List widgets) { + return ListView.separated( + separatorBuilder: (_, index) => const Divider(height: 1), + itemBuilder: (context, index) => Dismissible( + direction: DismissDirection.endToStart, + key: ValueKey(widgets[index].id), + background: Container( + padding: const EdgeInsets.only(right: 20), + alignment: Alignment.centerRight, + color: Colors.red, + child: const Icon( + CupertinoIcons.delete_solid, + color: Colors.white, + size: 30, + ), + ), + onDismissed: (v) { + BlocProvider.of(context).add( + EventToggleCategoryWidget(model.id!, widgets[index].id)); + }, + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: FeedbackWidget( + duration: const Duration(milliseconds: 200), + onPressed: () => _toDetailPage(context, widgets[index]), + child: + // Container(height: 60,) + SimpleWidgetItem( + data: widgets[index], + )), + ), + ), + itemCount: widgets.length); + } + + void _toDetailPage(BuildContext context, WidgetModel model) async { + // Navigator.pushNamed(context, UnitRouter.widget_detail, arguments: model); + context.push('/widget/detail/${model.name}',extra: model); + } +} + +class SimpleWidgetItem extends StatelessWidget { + final WidgetModel data; + + const SimpleWidgetItem({Key? key, required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; +Color shadowColor = isDark?Colors.black:Colors.white; + return Container( + height: 64, + child: Row( + children: [ + _buildLeading(shadowColor), + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [_buildTitle(shadowColor), _buildSummary(shadowColor)], + ), + ) + ], + ), + ); + } + + Widget _buildTitle(Color shadowColor) { + return Row( + children: [ + Expanded( + child: Text(data.name, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + shadows: [ + Shadow(color: shadowColor, offset: Offset(.3, .3)) + ])), + ), + const SizedBox(width: 15), + StarScore( + star: Star(emptyColor: shadowColor, size: 12, fillColor: data.color), + score: data.lever, + ) + ], + ); + } + + Widget _buildLeading(Color shadowColor) => Padding( + padding: const EdgeInsets.only(left: 5, right: 5), + child: data.image == null + ? Material( + color: Colors.transparent, + child: CircleText( + + text: data.name, + size: 50, + color: data.color, + ), + ) + : CircleImage( + image: data.image!, + size: 50, + ), + ); + + Widget _buildSummary(Color shadowColor) { + return Text( + data.info, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Color(0xFF757575), + fontSize: 12, + shadows: [Shadow(color: shadowColor, offset: Offset(.5, .5))]), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart new file mode 100644 index 00000000..570900f4 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart @@ -0,0 +1,109 @@ +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:widget_repository/widget_repository.dart'; + + + +/// create by 张风捷特烈 on 2020-04-21 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryListItem extends StatelessWidget { + final CategoryModel data; + final Function(CategoryModel)? onDeleteItemClick; + final Function(CategoryModel)? onEditItemClick; + + const CategoryListItem({Key? key, required this.data, this.onDeleteItemClick,this.onEditItemClick}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + child: _buildChild(context), + padding: const EdgeInsets.all(8), + + decoration: BoxDecoration( + color: Theme.of(context).listTileTheme.tileColor, + boxShadow: [ + BoxShadow(color: Colors.black.withOpacity(0.01),blurRadius: 6,offset: Offset(0,2)) + ], + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + ); + + } + + _buildChild(BuildContext context) { + final Color themeColor = Theme.of(context).primaryColor; + return Column( + children: [ + _buildTitle(themeColor), + const SizedBox(height: 8,), + const Divider(), + Expanded( + child: Container( + padding: const EdgeInsets.only(top: 10, left: 10, right: 10), + child: Text(data.info, + maxLines: 4, + style: TextStyle( + color: Colors.grey, + fontSize: 14, + shadows: [ + Shadow(color: themeColor.withOpacity(0.4), offset:const Offset(.2,.2),blurRadius: .5) + ])), + ),), + const Divider(), + const SizedBox(height: 8,), + Text( + '创建于: ${data.createDate}', + style: const TextStyle(color: Colors.grey, fontSize: 12), + ), + ], + ); + } + + Row _buildTitle(Color themeColor) { + return Row( + children: [ + CircleText( + text: "${data.count}", + size: 35, + fontSize: 14, + backgroundColor: data.color, + ), + const SizedBox( + width: 10, + ), + Expanded( + child: Text( + data.name, + style: const TextStyle(fontWeight: FontWeight.bold), + )), + FeedbackWidget( + onPressed: () { + onEditItemClick?.call(data); + }, + child: Icon( + Icons.edit, + size: 20, + color: themeColor, + ), + ), + const SizedBox(width: 4,), + FeedbackWidget( + onPressed: () { + onDeleteItemClick?.call(data); + }, + child: const Icon( + CupertinoIcons.delete_solid, + color: Colors.red, + size: 20, + ), + ), + + + ], + ); + } +} \ No newline at end of file diff --git a/lib/widget_ui/mobile/category_page/category_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart similarity index 87% rename from lib/widget_ui/mobile/category_page/category_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart index 0c42fe78..555e9436 100644 --- a/lib/widget_ui/mobile/category_page/category_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart @@ -1,26 +1,33 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/delete_category_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; + + + import 'category_list_item.dart'; +import 'delete_category_dialog.dart'; import 'edit_category_panel.dart'; import 'empty_category.dart'; class CategoryPage extends StatelessWidget { - final SliverGridDelegateWithFixedCrossAxisCount gridDelegate = - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: 0.8, + final SliverGridDelegateWithMaxCrossAxisExtent gridDelegate = + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 200, + mainAxisExtent: 200, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + // crossAxisCount: 2, + + // childAspectRatio: 0.8, ); final SliverGridDelegateWithFixedCrossAxisCount deskGridDelegate = const SliverGridDelegateWithFixedCrossAxisCount( @@ -42,9 +49,6 @@ class CategoryPage extends StatelessWidget { handle: NestedScrollView.sliverOverlapAbsorberHandleFor(ctx), ), _buildContent(context, state), - const SliverToBoxAdapter( - child: NoMoreWidget(), - ) ], ); } @@ -54,8 +58,10 @@ class CategoryPage extends StatelessWidget { } _buildContent(BuildContext context, CategoryLoadedState state) { + double bottom = MediaQuery.of(context).padding.bottom; + return SliverPadding( - padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 0), + padding: EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 20+bottom), sliver: SliverLayoutBuilder( builder: (_,c){ SliverGridDelegate delegate = gridDelegate; @@ -142,7 +148,7 @@ class CategoryPage extends StatelessWidget { void _toDetailPage(BuildContext context, CategoryModel model) { BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); - Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + context.push('/collection_widgets/${model.id}',extra: model); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart new file mode 100644 index 00000000..36b87540 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart @@ -0,0 +1,175 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:l10n/l10n.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'package:authentication/views/authentic_widget.dart'; +import '../../desk_ui/category_panel/desk_category_page.dart'; +import 'category_page.dart'; +import 'like_widget_page.dart'; +import 'sync/async_button.dart'; +import 'sync/upload_button.dart'; + + +class CollectPageAdapter extends StatelessWidget { + const CollectPageAdapter({Key? key,}) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDesk = Platform.isMacOS||Platform.isWindows||Platform.isLinux; + if(isDesk){ + return const DeskCategoryPage(); + }else{ + return const CollectPage(canPop:true); + } + } +} + + + +class CollectPage extends StatefulWidget { + final bool canPop; + const CollectPage({Key? key, this.canPop=false}) : super(key: key); + + @override + _CollectPageState createState() => _CollectPageState(); +} + +class _CollectPageState extends State + with AutomaticKeepAliveClientMixin { + late final List _tabs = [ + context.l10n.widgetsInn, + context.l10n.likedWidgets, + ]; + + @override + Widget build(BuildContext context) { + super.build(context); + BuildContext _topContext = context; + final Color color = Colors.blue.withAlpha(11); + + return Scaffold( + // backgroundColor: Colors.white, + body: Container( + color: color, + child: DefaultTabController( + length: _tabs.length, + child: NestedScrollView( + headerSliverBuilder: (context, innerBoxIsScrolled) => [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + sliver: _buildAppBar(_topContext, innerBoxIsScrolled)), + ], + body: const TabBarView( + children: [ + CategoryPage(), + LikeWidgetPage(), + ], + ), + ), + ), + )); + } + + Widget _buildAppBar(BuildContext context, bool index) { + // final Color color = Colors.blue; + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'draw_bg3.webp':'caver.webp'; + return SliverAppBar( + systemOverlayStyle: const SystemUiOverlayStyle( + statusBarIconBrightness: Brightness.light + ), + leading: widget.canPop?BackButton(color: Colors.white,):Container( + margin: const EdgeInsets.all(10), + child: FeedbackWidget( + onPressed: () { + // Navigator.of(context).pushNamed(UnitRouter.login); + }, + child: const CircleImage( + image: AssetImage('assets/images/icon_head.webp'), + borderSize: 1.5, + ), + )), + backgroundColor: Theme.of(context).primaryColor, + actionsIconTheme: IconThemeData(color: Colors.white), + actions: [ + SizedBox( + width: 32, + child: AuthenticWidget.just(const UploadCategoryButton())), + // SizedBox(width: 5,), + + SizedBox( + width: 32, + child: AuthenticWidget.just(const SyncCategoryButton())), + if(!widget.canPop) + SizedBox(child: _buildAddAction(context)) + ], + title: Text( + context.l10n.collectCollection, + style: TextStyle( + color: Colors.white, //标题 + fontSize: 18, + shadows: [ + Shadow(color: Colors.blue, offset:Offset(1, 1), blurRadius: 2) + ]), + ), + pinned: true, + expandedHeight: 150.0, + flexibleSpace: FlexibleSpaceBar( + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/$image", + fit: BoxFit.cover, + ), + ), + forceElevated: index, + bottom: PreferredSize( + preferredSize: const Size.fromHeight(30), + child: TabBar( + indicatorColor: Colors.transparent, + unselectedLabelColor: Colors.white, + labelColor: Colors.black, + labelStyle: TextStyle(fontSize: 16, shadows: [ + Shadow( + color: Theme.of(context).primaryColor, + offset: const Offset(1, 1), + blurRadius: 10) + ]), + tabs: _buildTabs(), + ), + ), + ); + } + + Widget _buildAddAction(BuildContext context) => GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => Scaffold.of(context).openEndDrawer(), + child: SizedBox( + width: 32, + child: const Icon( + Icons.add, + size: 24, + ), + ), + ); + + List _buildTabs() => _tabs + .map( + (String name) => Container( + margin: const EdgeInsets.only(bottom: 5), + alignment: Alignment.center, + child: Text(name), + ), + ) + .toList(); + + @override + bool get wantKeepAlive => true; +} + + + + diff --git a/lib/widget_ui/mobile/category_page/delete_category_dialog.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart similarity index 98% rename from lib/widget_ui/mobile/category_page/delete_category_dialog.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart index ab21223d..6c74675b 100644 --- a/lib/widget_ui/mobile/category_page/delete_category_dialog.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; /// create by 张风捷特烈 on 2020-04-21 diff --git a/lib/widget_ui/mobile/category_page/edit_category_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart similarity index 91% rename from lib/widget_ui/mobile/category_page/edit_category_panel.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart index 53ef249f..0ee7740e 100644 --- a/lib/widget_ui/mobile/category_page/edit_category_panel.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart @@ -1,12 +1,14 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; +import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; - import 'package:widget_repository/widget_repository.dart'; + + + /// create by 张风捷特烈 on 2020-04-23 /// contact me by email 1981462002@qq.com /// 说明: @@ -50,7 +52,7 @@ class _EditCategoryPanelState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), child: InputButton( - defaultText: '${widget.model?.name}', + defaultText: '${widget.model?.name??''}', config: const InputButtonConfig(hint: '收藏集名称', iconData: Icons.check), onSubmit: _doEdit, ), @@ -58,7 +60,7 @@ class _EditCategoryPanelState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), child: EditPanel( - defaultText: '${widget.model?.info}', + defaultText: '${widget.model?.info??''}', submitClear: false, hint: '收藏集简介...', onChange: (v) => info = v, diff --git a/lib/widget_ui/mobile/category_page/empty_category.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/empty_category.dart similarity index 95% rename from lib/widget_ui/mobile/category_page/empty_category.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/empty_category.dart index 8ea1e14f..6f27ac09 100644 --- a/lib/widget_ui/mobile/category_page/empty_category.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/empty_category.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/widget_ui/mobile/category_page/home_right_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/home_right_drawer.dart similarity index 83% rename from lib/widget_ui/mobile/category_page/home_right_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/home_right_drawer.dart index 2c021177..e0d999b9 100644 --- a/lib/widget_ui/mobile/category_page/home_right_drawer.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/home_right_drawer.dart @@ -1,9 +1,9 @@ -import 'package:components/toly_ui/ti/circle.dart'; + import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/unit_drawer_header.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../widget_page/unit_drawer_header.dart'; import 'edit_category_panel.dart'; class HomeRightDrawer extends StatefulWidget { @@ -28,10 +28,10 @@ class _HomeRightDrawerState extends State { Widget _buildChild(BuildContext context) { // final Color color = BlocProvider.of(context).state.color; - final Color color = BlocProvider.of(context).state.color; + final Color color = Theme.of(context).scaffoldBackgroundColor; return Container( - color: color.withAlpha(33), + color: color, child: ListView(padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color:color), _buildTitle(context), diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart similarity index 87% rename from lib/widget_ui/mobile/category_page/like_widget_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart index 5e2044a5..be108c61 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart @@ -1,13 +1,13 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - import 'package:widget_repository/widget_repository.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/collect_widget_list_item.dart'; + import 'package:widget_module/blocs/blocs.dart'; +import '../widget_detail/collect_widget_list_item.dart'; import '../widget_detail/widget_detail_page.dart'; @@ -22,8 +22,8 @@ class LikeWidgetPage extends StatelessWidget { final SliverGridDelegate gridDelegate = const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + mainAxisSpacing: 8, + crossAxisSpacing: 8, childAspectRatio: 1 / 0.5, ); @@ -81,7 +81,6 @@ class LikeWidgetPage extends StatelessWidget { .add(ToggleLikeWidgetEvent(id: model.id)); _toDetailPage(BuildContext context, WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.push(context, Right2LeftRouter(child: WidgetDetailPage(model: model))); + Navigator.push(context, SlidePageRoute(child: WidgetDetailPageScope(model: model))); } } diff --git a/lib/widget_ui/mobile/category_page/sync/async_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart similarity index 90% rename from lib/widget_ui/mobile/category_page/sync/async_button.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart index e8594422..be83c4ad 100644 --- a/lib/widget_ui/mobile/category_page/sync/async_button.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -1,17 +1,20 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; +import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:widget_repository/widget_repository.dart'; -import 'package:components/toly_ui/toly_ui.dart'; + + + +import 'package:toly_ui/toly_ui.dart'; /// create by 张风捷特烈 on 2021/2/24 @@ -66,7 +69,7 @@ class _SyncCategoryButtonState extends State { return FeedbackWidget( child: const Icon( TolyIcon.download, - size: 28, + size: 24, ), onPressed: _doSync); } @@ -88,7 +91,7 @@ class _SyncCategoryButtonState extends State { // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); @@ -104,7 +107,7 @@ class _SyncCategoryButtonState extends State { Widget _buildSuccess() => const Icon( TolyIcon.upload_success, - size: 25, + size: 22, color: Colors.green, ); diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/category_api.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/category_api.dart new file mode 100644 index 00000000..df6be8fb --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/category_api.dart @@ -0,0 +1,73 @@ +import 'package:app/app.dart'; +import 'package:utils/utils.dart'; + + +/// create by 张风捷特烈 on 2021/2/24 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryApi { + static Future> uploadCategoryData( + {required String data, required String likeData}) async { + String errorMsg = ""; + + try { + var result = await HttpUtil.instance.client.post( + PathUnit.categoryDataSync, + data: {"data": data, "likeData": likeData}); + print(result.data); + if (result.data != null) { + return TaskResult.success(data:result.data['status']); + } + } catch (e) { + print(e); + errorMsg = e.toString(); + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } + + static Future> getCategoryData() async { + String errorMsg = ""; + var result = await HttpUtil.instance + .client + .get(PathUnit.categoryData) + .catchError((err) { + errorMsg =err.toString(); + + }); + + // 获取的数据非空且 status = true + if (result.data != null && result.data['status']) { + // 说明有数据 + if (result.data['data'] != null) { + return TaskResult.success(data:CategoryData.fromJson(result.data['data'])); + } else { + return const TaskResult.success(data:null); + } + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } +} + +class CategoryData{ + final int categoryDataId; + final int userId; + final String data; + final String likeData; + + CategoryData( + {required this.categoryDataId, + required this.userId, + required this.data, + required this.likeData}); + + factory CategoryData.fromJson(Map map) { + return CategoryData( + categoryDataId: map['categoryDataId'], + userId: map["userId"], + likeData: map["likeData"], + data: map["data"]); + } +} \ No newline at end of file diff --git a/lib/widget_ui/mobile/category_page/sync/upload_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart similarity index 81% rename from lib/widget_ui/mobile/category_page/sync/upload_button.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index b26fe618..06242ece 100644 --- a/lib/widget_ui/mobile/category_page/sync/upload_button.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -1,18 +1,17 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; +import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:widget_repository/widget_repository.dart'; - /// create by 张风捷特烈 on 2021/2/24 /// contact me by email 1981462002@qq.com /// 说明: @@ -56,8 +55,8 @@ class _UploadCategoryButtonState extends State { Widget _buildError() { return const Icon( TolyIcon.error, - size: 28, - color: Colors.green, + size: 22, + color: Colors.redAccent, ); } @@ -65,23 +64,23 @@ class _UploadCategoryButtonState extends State { return FeedbackWidget( child: const Icon( TolyIcon.upload, - size: 28, + size: 24, ), onPressed: _doUploadCategoryData); } - void _doUploadCategoryData() async{ + void _doUploadCategoryData() async { setState(() => state = AsyncType.loading); CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); - + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); - TaskResult result = await CategoryApi.uploadCategoryData(data: json,likeData: likeJson); + TaskResult result = + await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); if (result.success) { setState(() => state = AsyncType.success); @@ -95,7 +94,7 @@ class _UploadCategoryButtonState extends State { Widget _buildSuccess() { return const Icon( TolyIcon.upload_success, - size: 25, + size: 22, color: Colors.green, ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart b/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart new file mode 100644 index 00000000..5996b986 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart @@ -0,0 +1,8 @@ +export 'widget_detail/widget_detail_page.dart'; +export 'widget_detail/node_display/node_title.dart'; +export 'widget_page/standard_home_page.dart'; +export 'widget_page/widget_page.dart'; +export 'category_page/category_page.dart'; +export 'category_page/collect_page.dart'; +export 'category_page/category_detail.dart'; +export 'category_page/home_right_drawer.dart'; diff --git a/lib/widget_ui/mobile/search_page/app_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart similarity index 99% rename from lib/widget_ui/mobile/search_page/app_search_bar.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart index 3011eaf6..1de3cf28 100644 --- a/lib/widget_ui/mobile/search_page/app_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart @@ -3,9 +3,10 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; + class AppSearchBar extends StatefulWidget { const AppSearchBar({Key? key}):super(key: key); diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart new file mode 100644 index 00000000..0db7d89a --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -0,0 +1,101 @@ +import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +class StandardSearchBarInner extends StatelessWidget + implements PreferredSizeWidget { + const StandardSearchBarInner({Key? key}) : super(key: key); + + @override + Size get preferredSize => const Size.fromHeight(35 + 8 * 2); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? color = Theme.of(context).appBarTheme.backgroundColor; + return Container( + color: isDark ? color : Colors.white, + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + children: [ + const SizedBox( + width: 15, + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).maybePop(); + }, + child: const SizedBox( + height: 32, width: 32, child: Icon(Icons.arrow_back)), + ), + Expanded( + child: Container( + height: 35, + padding: const EdgeInsets.only(left: 10, right: 10), + child: Material( + color: Colors.transparent, + child: TextField( + autofocus: true, + enabled: true, + cursorColor: Colors.blue, + maxLines: 1, + onChanged: (str) => _doSearch(context, str), + onSubmitted: (str) { + //提交后,收起键盘 + FocusScope.of(context).requestFocus(FocusNode()); + }, + decoration: InputDecoration( + filled: true, + fillColor: + isDark ? Color(0xff292929) : Color(0xffF3F6F9), + prefixIcon: Icon( + Icons.search, + color: Colors.grey, + size: 20, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 24, + minWidth: 36 + ), + isCollapsed: true, + contentPadding: EdgeInsets.only(top: 4,bottom: 4,right: 8), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.all(Radius.circular(8)), + ), + hintText:context.l10n.searchWidget, + hintStyle: TextStyle(fontSize: 14)), + ), + )), + ), + Wrap( + spacing: 3, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Icon(TolyIcon.icon_sound), + // Text('已签',style: TextStyle(color: Colors.grey),) + ], + ), + const SizedBox(width: 15) + ], + ), + ); + } + + void _doSearch(BuildContext context, String str) { + WidgetsBloc widgetsBloc = BlocProvider.of(context); + final WidgetFilter filter = widgetsBloc.state.filter.copyWith( + name: str, + ); + widgetsBloc.add( + EventSearchWidget(filter: filter), + ); + } +} diff --git a/lib/widget_ui/mobile/search_page/standard_search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart similarity index 75% rename from lib/widget_ui/mobile/search_page/standard_search_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart index 63b66d7a..0dd26148 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -1,12 +1,14 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:l10n/l10n.dart'; -import '../widget_panel/widget_model_item.dart'; +import 'package:widget_repository/widget_repository.dart'; +import '../widget_page/mobile_widget_tiled.dart'; import 'standard_search_bar.dart'; // SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc @@ -31,13 +33,19 @@ class StandardSearchPage extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Scaffold( body: Column( children: [ SizedBox( height: MediaQuery.of(context).padding.top, width: MediaQuery.of(context).size.width, - child: const ColoredBox(color: Colors.white), + child: ColoredBox( + color: isDark + ? Theme.of(context).appBarTheme.backgroundColor ?? + Colors.black + : Colors.white), ), const StandardSearchBarInner(), Expanded( @@ -49,20 +57,22 @@ class StandardSearchPage extends StatelessWidget { } Widget _buildBodyByState(BuildContext context, WidgetsState state) { - Widget noSearchArg = const NotSearchPage(); + Widget noSearchArg = NotSearchPage( + tips: context.l10n.searchSomething, + ); if (state.filter.name.isEmpty) { return noSearchArg; } if (state is WidgetsLoaded) { if (state.widgets.isEmpty) { - return const EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", + return EmptyShower( + message: context.l10n.emptySearch, ); } return ListView.builder( padding: EdgeInsets.zero, - itemBuilder: (_, index) => StandardWidgetItem( + itemBuilder: (_, index) => MobileWidgetTiled( searchArg: state.filter.name, model: state.widgets[index], onTap: () => _toDetail(context, state.widgets[index])), @@ -83,10 +93,6 @@ class StandardSearchPage extends StatelessWidget { void _toDetail(BuildContext context, WidgetModel model) { // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}', extra: model); } } diff --git a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart similarity index 80% rename from lib/widget_ui/mobile/widget_detail/category_end_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart index 59cdaafc..c14f6b83 100644 --- a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart @@ -1,12 +1,13 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/unit_drawer_header.dart'; +import 'package:toly_ui/toly_ui.dart'; + import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; - +import '../widget_page/unit_drawer_header.dart'; /// create by 张风捷特烈 on 2020-04-22 /// contact me by email 1981462002@qq.com @@ -23,24 +24,24 @@ class CategoryEndDrawer extends StatelessWidget { child: ListView(padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color: Theme.of(context).primaryColor), Padding( - padding: const EdgeInsets.all(10.0), - child: Row( - children: [ - Circle( - color: widget.color, + padding: const EdgeInsets.all(10.0), + child: Row( + children: [ + Circle( + color: widget.color, + ), + const SizedBox( + width: 10, + ), + Text(widget.name) + ], ), - const SizedBox( - width: 10, - ), - Text(widget.name) - ], - ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0), - child: Panel( - child: Text(widget.info, style: UnitTextStyle.shadowTextStyle), - ), + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Panel( + child: Text(widget.info, style: UnitTextStyle.shadowTextStyle), + ), ), const Divider(), _buildTitle(context), @@ -103,10 +104,11 @@ class _CategoryInfoState extends State { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), + padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Wrap( alignment: WrapAlignment.spaceBetween, spacing: 4, + runSpacing: 8, children: categories.map((e) => _buildItem(e)).toList(), ), ); @@ -119,9 +121,9 @@ class _CategoryInfoState extends State { selectedColor: Colors.orange.withAlpha(120), shadowColor: Theme.of(context).primaryColor, elevation: 1, - labelPadding: const EdgeInsets.only(right: 4,left: 4), + // labelPadding: const EdgeInsets.only(right: 4,left: 4), avatar: Circle( - radius: 13, + radius: 10, color: category.color, ), selected: inHere, @@ -129,7 +131,8 @@ class _CategoryInfoState extends State { onSelected: (v) async { await repository.toggleCategory(category.id!, widget.id); _loadCategoryIds(); - BlocProvider.of(context).add(EventLoadCategoryWidget(category.id!)); + BlocProvider.of(context) + .add(EventLoadCategoryWidget(category.id!)); }); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart new file mode 100644 index 00000000..75e0bff0 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart @@ -0,0 +1,122 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_star/flutter_star.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class CollectWidgetListItem extends StatelessWidget { + final WidgetModel data; + final Function(WidgetModel model)? onDeleteItemClick; + + const CollectWidgetListItem({Key? key, required this.data, this.onDeleteItemClick}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Material( + color: Theme.of(context).listTileTheme.tileColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0,vertical: 6), + child: Row( + children: [ + _buildLeading(), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle(), + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + _buildSummary(), + StarScore( + star: Star( + emptyColor: Colors.white, + size: 12, + fillColor: itemColor), + score: data.lever, + ) + ], + ), + const Spacer(), + FeedbackWidget( + onPressed: () { + onDeleteItemClick?.call(data); + }, + child: const Icon( + CupertinoIcons.delete_solid, + color: Colors.red, + size: 20, + ), + ) + ], + ) + + ], + ), + ), + ], + ), + ), + ), + ], + ); + } + + Widget _buildLeading() => Padding( + padding: const EdgeInsets.only(right: 8), + child: data.image == null + ? Material( + color: Colors.transparent, + child: CircleText( + text: data.name, + size: 40, + fontSize: 18, + color: itemColor, + ), + ) + : CircleImage( + image: data.image!, + size: 40, + ), + ); + + Color get itemColor => Cons.tabColors[data.family.index]; + + Widget _buildTitle() => Row( + children: [ + Expanded( + child: Text(data.name, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + shadows: [ + Shadow( + color: Colors.white, offset: Offset(.3, .3)) + ])), + ), + ], + ); + + Widget _buildSummary() => Padding( + padding: const EdgeInsets.only(bottom: 5, top: 5), + child: Text( + data.nameCN, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.grey[600], + fontSize: 12, + shadows: const [Shadow(color: Colors.white, offset: Offset(.5, .5))]), + ), + ); +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart new file mode 100644 index 00000000..d72b69ed --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart @@ -0,0 +1,187 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:toly_ui/code/code.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/tolyui.dart' hide TolyCollapse,CollapseController; + +// import 'package:flutter_highlight/flutter_highlight.dart'; +import 'collapse.dart'; + +class CodeDisplay extends StatefulWidget { + final Widget display; + final HighlighterStyle style; + final String code; + + const CodeDisplay({ + super.key, + required this.display, + required this.code, + required this.style, + }); + + @override + State createState() => _CodeDisplayState(); +} + +class _CodeDisplayState extends State { + String? codeRes; + + void _loadAssets() async { + codeRes = await codeData(); + setState(() {}); + } + + Future codeData() async { + if (widget.code.startsWith('assets')) { + return await rootBundle.loadString(widget.code); + } else { + return widget.code; + } + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.maxFinite, + decoration: BoxDecoration( + color: Theme.of(context).listTileTheme.tileColor, + border: Border.all( + color: Theme.of(context).dividerTheme.color ?? Colors.grey, + width: Theme.of(context).dividerTheme.space ?? 1, + ), + boxShadow: [ + BoxShadow(color: Colors.grey.withOpacity(0.05),spreadRadius: 1,blurRadius: 4) + ], + borderRadius: BorderRadius.circular(4)), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 12), + child: widget.display, + ), + const Divider(), + TolyCollapse( + titleBuilder: _buildTitle, + sizeCurve: Curves.ease, + content: CodeWidget( + code: widget.code, + style: widget.style, + ), + duration: const Duration(milliseconds: 500), + ) + ], + ), + ); + } + _doShare() { + Share.share(widget.code); + } + Widget _buildTitle(BuildContext context, Animation anima, CollapseController ctrl) { + Color color = Theme.of(context).primaryColor; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8.0), + child: Row( + children: [ + const Spacer(), + FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _doShare, + child: Padding( + padding: const EdgeInsets.only( + right: 10, + ), + child: Icon( + TolyIcon.icon_share, + size: 20, + color: color, + ), + ), + ), + FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _copyCode, + child: Padding( + padding: const EdgeInsets.only( + right: 10, + ), + child: Icon( + Icons.copy_rounded, + size: 20, + color: color, + ), + ), + ), + GestureDetector( + onTap: () => _toggleCode(ctrl), + child: AnimatedBuilder( + animation: anima, + builder: (_, child) { + return Transform.rotate( + angle: pi / 2 * Curves.ease.transform(anima.value), + child: Icon( + TolyIcon.icon_code, + color: color, + ), + ); + }, + )), + ], + )); + } + + + void _toggleCode(CollapseController ctrl) { + if (!ctrl.isOpen) { + _loadAssets(); + } else { + codeRes = null; + } + ctrl.toggle(); + } + + void _copyCode() async { + String code = await codeData(); + await Clipboard.setData(ClipboardData(text: code)); + $message.success(message: '代码复制成功!'); + } +} + +const githubTheme = { + 'root': TextStyle(color: Color(0xff333333), backgroundColor: Colors.transparent), + 'comment': TextStyle(color: Color(0xff999988), fontStyle: FontStyle.italic), + 'quote': TextStyle(color: Color(0xff999988), fontStyle: FontStyle.italic), + 'keyword': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.bold), + 'selector-tag': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.bold), + 'subst': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.normal), + 'number': TextStyle(color: Color(0xff008080)), + 'literal': TextStyle(color: Color(0xff008080)), + 'variable': TextStyle(color: Color(0xff008080)), + 'template-variable': TextStyle(color: Color(0xff008080)), + 'string': TextStyle(color: Color(0xffdd1144)), + 'doctag': TextStyle(color: Color(0xffdd1144)), + 'title': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'section': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'selector-id': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'type': TextStyle(color: Color(0xff445588), fontWeight: FontWeight.bold), + 'tag': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'name': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'attribute': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'regexp': TextStyle(color: Color(0xff009926)), + 'link': TextStyle(color: Color(0xff009926)), + 'symbol': TextStyle(color: Color(0xff990073)), + 'bullet': TextStyle(color: Color(0xff990073)), + 'built_in': TextStyle(color: Color(0xff0086b3)), + 'builtin-name': TextStyle(color: Color(0xff0086b3)), + 'meta': TextStyle(color: Color(0xff999999), fontWeight: FontWeight.bold), + 'deletion': TextStyle(backgroundColor: Color(0xffffdddd)), + 'addition': TextStyle(backgroundColor: Color(0xffddffdd)), + 'emphasis': TextStyle(fontStyle: FontStyle.italic), + 'strong': TextStyle(fontWeight: FontWeight.bold), +}; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart new file mode 100644 index 00000000..963b1f5b --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart @@ -0,0 +1,436 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart' hide CrossFadeState; +import 'package:flutter/rendering.dart'; + +typedef AnimatedTitleBuilder = Widget Function( + BuildContext context, + Animation anima, + CollapseController ctrl, +); + +/// A widget that cross-fades between two given children and animates itself +/// between their sizes. +/// +/// {@youtube 560 315 https://www.youtube.com/watch?v=PGK2UUAyE54} +/// +/// The animation is controlled through the [crossFadeState] parameter. +/// [firstCurve] and [opacityCurve] represent the opacity curves of the two +/// children. The [firstCurve] is inverted, i.e. it fades out when providing a +/// growing curve like [Curves.linear]. The [sizeCurve] is the curve used to +/// animate between the size of the fading-out child and the size of the +/// fading-in child. +/// +/// This widget is intended to be used to fade a pair of widgets with the same +/// width. In the case where the two children have different heights, the +/// animation crops overflowing children during the animation by aligning their +/// top edge, which means that the bottom will be clipped. +/// +/// The animation is automatically triggered when an existing +/// [TolyCollapse] is rebuilt with a different value for the +/// [crossFadeState] property. +/// +/// {@tool snippet} +/// +/// This code fades between two representations of the Flutter logo. It depends +/// on a boolean field `_first`; when `_first` is true, the first logo is shown, +/// otherwise the second logo is shown. When the field changes state, the +/// [TolyCollapse] widget cross-fades between the two forms of the logo +/// over three seconds. +/// +/// ```dart +/// AnimatedCrossFade( +/// duration: const Duration(seconds: 3), +/// firstChild: const FlutterLogo(style: FlutterLogoStyle.horizontal, size: 100.0), +/// secondChild: const FlutterLogo(style: FlutterLogoStyle.stacked, size: 100.0), +/// crossFadeState: _first ? CrossFadeState.showFirst : CrossFadeState.showSecond, +/// ) +/// ``` +/// {@end-tool} +/// +/// See also: +/// +/// * [AnimatedOpacity], which fades between nothing and a single child. +/// * [AnimatedSwitcher], which switches out a child for a new one with a +/// customizable transition, supporting multiple cross-fades at once. +/// * [AnimatedSize], the lower-level widget which [TolyCollapse] uses to +/// automatically change size. + +class TolyCollapse extends StatefulWidget { + /// Creates a cross-fade animation widget. + /// + /// The [duration] of the animation is the same for all components (fade in, + /// fade out, and size), and you can pass [Interval]s instead of [Curve]s in + /// order to have finer control, e.g., creating an overlap between the fades. + const TolyCollapse({ + super.key, + required this.content, + this.title, + this.opacityCurve = Curves.linear, + this.sizeCurve = Curves.linear, + this.alignment = Alignment.topCenter, + this.titlePadding = const EdgeInsets.symmetric(vertical: 12.0), + this.contentPadding = + const EdgeInsets.only(top: 0, right: 8, left: 8, bottom: 8), + required this.duration, + this.reverseDuration, + this.titleBuilder, + this.controller, + this.onOpen, + this.onClose, + this.excludeBottomFocus = true, + }) : assert(title == null && titleBuilder != null || + titleBuilder == null && title != null || + titleBuilder != null && title != null); + + final Widget content; + final Widget? title; + final VoidCallback? onOpen; + final VoidCallback? onClose; + final AnimatedTitleBuilder? titleBuilder; + final EdgeInsetsGeometry titlePadding; + final EdgeInsetsGeometry contentPadding; + final CollapseController? controller; + + /// The duration of the whole orchestrated animation. + final Duration duration; + + /// The duration of the whole orchestrated animation when running in reverse. + /// + /// If not supplied, this defaults to [duration]. + final Duration? reverseDuration; + + /// The fade curve of the second child. + /// + /// Defaults to [Curves.linear]. + final Curve opacityCurve; + + /// The curve of the animation between the two children's sizes. + /// + /// Defaults to [Curves.linear]. + final Curve sizeCurve; + + /// How the children should be aligned while the size is animating. + /// + /// Defaults to [Alignment.topCenter]. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry alignment; + + /// When true, this is equivalent to wrapping the bottom widget with an [ExcludeFocus] + /// widget while it is at the bottom of the cross-fade stack. + /// + /// Defaults to true. When it is false, the bottom widget in the cross-fade stack + /// can remain in focus until the top widget requests focus. This is useful for + /// animating between different [TextField]s so the keyboard remains open during the + /// cross-fade animation. + final bool excludeBottomFocus; + + @override + State createState() => _TolyCollapseState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty( + 'alignment', alignment, + defaultValue: Alignment.topCenter)); + properties + .add(IntProperty('duration', duration.inMilliseconds, unit: 'ms')); + properties.add(IntProperty( + 'reverseDuration', reverseDuration?.inMilliseconds, + unit: 'ms', defaultValue: null)); + } +} + +class _TolyCollapseState extends State + with TickerProviderStateMixin { + late AnimationController _controller; + late Animation _firstAnimation; + late Animation _secondAnimation; + + CollapseController? _internalController; + + CollapseController get _collapseCtrl => + widget.controller ?? _internalController!; + + @override + void initState() { + super.initState(); + if (widget.controller == null) { + _internalController = CollapseController(); + } + _collapseCtrl._attach(this); + _controller = AnimationController( + duration: widget.duration, + reverseDuration: widget.reverseDuration, + vsync: this, + ); + // if (widget.crossFadeState == CrossFadeState.showSecond) { + // _controller.value = 1.0; + // } + _firstAnimation = _initAnimation(Curves.linear, true); + _secondAnimation = _initAnimation(widget.opacityCurve, false); + _controller.addStatusListener((AnimationStatus status) { + setState(() { + // Trigger a rebuild because it depends on _isTransitioning, which + // changes its value together with animation status. + }); + }); + } + + Animation _initAnimation(Curve curve, bool inverted) { + Animation result = _controller.drive(CurveTween(curve: curve)); + if (inverted) { + result = result.drive(Tween(begin: 1.0, end: 0.0)); + } + return result; + } + + @override + void dispose() { + _controller.dispose(); + _collapseCtrl._detach(this); + super.dispose(); + } + + @override + void didUpdateWidget(TolyCollapse oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.duration != oldWidget.duration) { + _controller.duration = widget.duration; + } + if (widget.reverseDuration != oldWidget.reverseDuration) { + _controller.reverseDuration = widget.reverseDuration; + } + if (widget.opacityCurve != oldWidget.opacityCurve) { + _secondAnimation = _initAnimation(widget.opacityCurve, false); + } + } + + /// Whether we're in the middle of cross-fading this frame. + bool get _isTransitioning => + _controller.status == AnimationStatus.forward || + _controller.status == AnimationStatus.reverse; + + bool get _isOpen => _controller.value == 1.0; + + @override + Widget build(BuildContext context) { + const Key closeKey = ValueKey(false); + const Key openKey = ValueKey(true); + final bool transitioningForwards = + _controller.status == AnimationStatus.completed || + _controller.status == AnimationStatus.forward; + final Key topKey; + Widget topChild; + final Animation topAnimation; + final Key bottomKey; + Widget bottomChild; + final Animation bottomAnimation; + if (transitioningForwards) { + topKey = openKey; + topChild = Align( + alignment: Alignment.topLeft, + child: Padding(padding: widget.contentPadding, child: widget.content), + ); + topAnimation = _secondAnimation; + bottomKey = closeKey; + bottomChild = Container( + height: 0, + ); + bottomAnimation = _firstAnimation; + } else { + topKey = closeKey; + topChild = Container( + height: 0, + ); + topAnimation = _firstAnimation; + bottomKey = openKey; + bottomChild = Align( + alignment: Alignment.topLeft, + child: Padding( + padding: widget.contentPadding, + child: widget.content, + ), + ); + bottomAnimation = _secondAnimation; + } + + bottomChild = TickerMode( + key: bottomKey, + enabled: _isTransitioning, + child: IgnorePointer( + child: ExcludeSemantics( + // Always exclude the semantics of the widget that's fading out. + child: ExcludeFocus( + excluding: widget.excludeBottomFocus, + child: FadeTransition( + opacity: bottomAnimation, + child: bottomChild, + ), + ), + ), + ), + ); + topChild = TickerMode( + key: topKey, + enabled: true, // Top widget always has its animations enabled. + child: IgnorePointer( + ignoring: false, + child: ExcludeSemantics( + excluding: false, + // Always publish semantics for the widget that's fading in. + child: ExcludeFocus( + excluding: false, + child: FadeTransition( + opacity: topAnimation, + child: topChild, + ), + ), + ), + ), + ); + Widget title; + if (widget.titleBuilder != null) { + title = widget.titleBuilder!(context, _controller, _collapseCtrl); + } else { + title = GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _toggleCodePanel(); + }, + child: Row( + children: [ + Expanded( + child: Padding( + padding: widget.titlePadding, + child: widget.title, + )), + Spacer(), + AnimatedBuilder( + animation: _controller, + builder: (_, child) => Transform.rotate( + angle: pi * _controller.value, + child: child, + ), + child: const Icon(Icons.expand_more)) + ], + )); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title, + ClipRect( + child: AnimatedSize( + alignment: widget.alignment, + duration: widget.duration, + reverseDuration: widget.reverseDuration, + curve: widget.sizeCurve, + child: + defaultLayoutBuilder(topChild, topKey, bottomChild, bottomKey), + ), + ), + ], + ); + } + + Widget defaultLayoutBuilder(Widget topChild, Key topChildKey, + Widget bottomChild, Key bottomChildKey) { + return Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + key: bottomChildKey, + left: 0.0, + top: 0.0, + right: 0.0, + child: bottomChild, + ), + Positioned( + key: topChildKey, + child: topChild, + ), + ], + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder description) { + super.debugFillProperties(description); + // description.add(EnumProperty('crossFadeState', widget.crossFadeState)); + description.add(DiagnosticsProperty( + 'controller', _controller, + showName: false)); + description.add(DiagnosticsProperty( + 'alignment', widget.alignment, + defaultValue: Alignment.topCenter)); + } + + void _close() { + widget.onClose?.call(); + _controller.reverse(); + } + + void _open() { + widget.onOpen?.call(); + _controller.forward(); + } + + // 折叠代码面板 + void _toggleCodePanel() { + if (_isOpen) { + _close(); + } else { + _open(); + } + } +} + +class CollapseController { + _TolyCollapseState? _state; + + bool get isOpen { + assert(_state != null); + return _state!._isOpen; + } + + void toggle() { + if (isOpen) { + close(); + } else { + open(); + } + } + + void close() { + assert(_state != null); + _state!._close(); + } + + void open() { + assert(_state != null); + _state!._open(); + } + + void _attach(_TolyCollapseState state) { + _state = state; + } + + void _detach(_TolyCollapseState state) { + if (_state == state) { + _state = null; + } + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart new file mode 100644 index 00000000..e70bdf11 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart @@ -0,0 +1,55 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:widget_module/views/mobile/widget_detail/node_display/code_display.dart'; + +import 'node_title.dart'; + +typedef NodeWidgetMapper = Widget Function(NodeModel model); + +class NodeDisplay extends StatelessWidget { + final NodeModel node; + final NodeWidgetMapper mapper; + final bool isDeath; + + const NodeDisplay({ + super.key, + required this.node, + required this.isDeath, + required this.mapper, + }); + + @override + Widget build(BuildContext context) { + Color primaryColor = Theme.of(context).primaryColor; + var style = context.select((AppConfigBloc bloc) => bloc.state.codeStyle); + bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; + EdgeInsets pd = isDesk ? const EdgeInsets.symmetric(horizontal: 24, vertical: 8) : const EdgeInsets.all(8.0); + return Padding( + padding: pd, + child: Column( + children: [ + NodeTitle(text: node.name), + const SizedBox(height: 10), + CodeDisplay(display: mapper(node), code: node.code, style: style), + if (!isDeath) _buildNodeInfo(primaryColor), + ], + ), + ); + } + + Widget _buildNodeInfo(Color primaryColor) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Panel( + color: primaryColor.withOpacity(0.04), + child: Text( + node.subtitle, + style: const TextStyle(fontSize: 12), + )), + ); +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart new file mode 100644 index 00000000..f285fb65 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; + +class NodeTitle extends StatelessWidget { + final String text; + const NodeTitle({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + + return Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Circle( + color: Theme.of(context).primaryColor, + radius: 5, + ), + ), + Expanded( + child: Text( + text, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + ), + ], + ); + } +} + +class LinkedButton extends StatelessWidget { + const LinkedButton({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} + + diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart new file mode 100644 index 00000000..2af9060c --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart @@ -0,0 +1,117 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:utils/utils.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class SliverWidgetDetailBar extends StatelessWidget { + final WidgetModel model; + + const SliverWidgetDetailBar({Key? key, required this.model}) + : super(key: key); + + final Color backgroundColor = const Color(0xffFAFAFA); + static const Color textColor = Color(0xff262626); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? appBarColor = Theme.of(context).appBarTheme.backgroundColor; + Color? appBarTextColor = Theme.of(context).appBarTheme.titleTextStyle?.color; + + + return SliverAppBar( + pinned: true, + backgroundColor: isDark? appBarColor:backgroundColor, + titleTextStyle: TextStyle(color:isDark?appBarTextColor: textColor), + iconTheme: isDark? null:const IconThemeData(color: textColor), + centerTitle: false, + expandedHeight: 120.0, + scrolledUnderElevation: 0.5, + flexibleSpace: DiyFlexibleSpaceBar( + centerTitle: false, + expandedTitleScale: 2, + titleIconBuilder: (t) => WindmillWidget( + rotate: t * 2 * pi * 2, + radius: 15, + ), + fixedSubtitle: Text( + model.name, + style: TextStyle(color: isDark?appBarTextColor:Color(0xff696969), fontSize: 12), + ), + title: Padding( + padding: const EdgeInsets.only(bottom: 3), + child: Text( + model.nameCN, + style: TextStyle( fontSize: 16,color:isDark?appBarTextColor: textColor), + ), + ), + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 20, bottom: 10), + //标题边距 + collapseMode: CollapseMode.parallax, + ), + elevation: 0, + actions: [ + _buildToHome(context), + FeedbackWidget( + onPressed: () => _toggleLikeState(context), + child: BlocConsumer( + listener: _listenLikeStateChange, + builder: _buildByLikeState, + ), + ) + ], + ); + } + + void _toggleLikeState(BuildContext context) { + BlocProvider.of(context).add( + ToggleLikeWidgetEvent(id: model.id), + ); + } + + // 监听 LikeWidgetBloc 伺机弹出 toast + void _listenLikeStateChange(BuildContext context, LikeWidgetState state) { + bool collected = state.widgets.contains(model); + String msg = + collected ? "收藏【${model.name}】组件成功!" : "已取消【${model.name}】组件收藏!"; + Toast.toast( + context, + msg, + duration: Duration(milliseconds: collected ? 1500 : 600), + action: collected + ? SnackBarAction( + textColor: Colors.white, + label: '收藏夹管理', + onPressed: () => Scaffold.of(context).openEndDrawer()) + : null, + ); + } + + // 根据 [LikeWidgetState ] 构建图标 + Widget _buildByLikeState(BuildContext context, LikeWidgetState state) { + bool liked = state.widgets.contains(model); + return Padding( + padding: const EdgeInsets.only(right: 20.0), + child: Icon( + liked ? TolyIcon.icon_star_ok : TolyIcon.icon_star_add, + size: 25, + ), + ); + } + + Widget _buildToHome(BuildContext context) => GestureDetector( + onLongPress: () => Scaffold.of(context).openEndDrawer(), + child: const Padding( + padding: EdgeInsets.all(15.0), + child: Icon(Icons.home), + ), + onTap: () => Navigator.of(context).pop()); +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart new file mode 100644 index 00000000..c9c97f3f --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -0,0 +1,180 @@ +import 'dart:io'; + +import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../../desk_ui/widget_detail/link_widget_buttons.dart'; +import 'node_display/node_display.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import 'category_end_drawer.dart'; +import 'widget_detail_bar.dart'; +import 'widget_detail_panel.dart'; +import 'package:widgets/widgets.dart'; +import 'package:tolyui/tolyui.dart'; + +// 用于组件详情不需要在一开始就加载 +// WidgetDetailBloc 可以在稍后提供 +class WidgetDetailPageScope extends StatelessWidget { + final WidgetModel model; + + const WidgetDetailPageScope({super.key, required this.model}); + + @override + Widget build(BuildContext context) { + WidgetRepository widgetRepository = context.read().repository; + NodeRepository nodeRepository = + kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); + + return BlocProvider( + create: (_) => WidgetDetailBloc( + widgetRepo: widgetRepository, + nodeRepo: nodeRepository, + )..push(model), + child: WidgetDetailPage(model: model), + ); + } +} + +class WidgetDetailPage extends StatelessWidget { + final WidgetModel model; + + const WidgetDetailPage({super.key, required this.model}); + + @override + Widget build(BuildContext context) { + WidgetDetailBloc bloc = context.watch(); + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDark ? Colors.black : Colors.white, + endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), + body: Builder(builder: (ctx) => _buildContent(ctx, bloc)), + ); + } + + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); + + Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { + DetailState state = bloc.state; + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) => + _onPop(context, didPop, result), + child: CustomScrollView( + slivers: [ + SliverWidgetDetailBar(model: bloc.currentWidget), + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetDetailPanel(model: bloc.currentWidget), + linkText(context), + if (state is DetailWithData) + LinkWidgetButtons(links: state.links, onSelect: bloc.push), + ], + ), + ), + if (state is DetailWithData) + SliverNodeList( + nodes: state.nodes, + model: state.widgetModel, + ), + ], + )); + } + + void _onPop(BuildContext context, bool didPop, dynamic result) { + if (didPop) { + return; + } + WidgetDetailBloc detailBloc = context.read(); + // 检查抽屉是否打开 + if (Scaffold.of(context).isEndDrawerOpen) { + if (context.mounted) { + Navigator.of(context).pop(); + } + return; + } + // 调用原来的 pop 逻辑 + detailBloc.pop().then((bool canPop) { + if (canPop && context.mounted) { + Navigator.of(context).pop(); + } + }); + } +} + +class SliverNodeList extends StatelessWidget { + final List nodes; + final WidgetModel model; + + const SliverNodeList({super.key, required this.nodes, required this.model}); + + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, i) => NodeDisplay( + mapper: _nodeMapper, + node: nodes[i], + isDeath: model.death, + ), + childCount: nodes.length, + )); + } + + Widget _nodeMapper(NodeModel node) { + NodeType type = node.type(model.name, node.priority); + Widget display = mapNodeDisplay(model.id, node.priority); + return switch (type) { + NodeType.display => display, + NodeType.newPage => newPageDisplay(display), + NodeType.description => display, + NodeType.deprecated => display, + }; + } +} + +Widget newPageDisplay(Widget page) { + return Builder( + builder: (ctx) => ElevatedButton( + onPressed: () { + Navigator.of(ctx).push(MaterialPageRoute(builder: (_) => page)); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.open_in_new, + size: 16, + color: Colors.white, + ), + Text('新界面打开'), + ], + ), + style: FillButtonPalette( + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ); +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart new file mode 100644 index 00000000..96dc2abd --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart @@ -0,0 +1,53 @@ +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_star/flutter_star.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class WidgetDetailPanel extends StatelessWidget { + final WidgetModel model; + + const WidgetDetailPanel({Key? key, required this.model}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + _buildLeft(model, context), + _buildRight(model), + ], + ); + } + + Widget _buildLeft(WidgetModel model, BuildContext context) => Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Panel( + color: Theme.of(context).scaffoldBackgroundColor, + child: Text(model.info)), + ), + ); + + Widget _buildRight(WidgetModel model) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 100, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Hero( + tag: "hero_widget_image_${model.id}", + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: model.image == null + ? Image.asset('assets/images/caver.webp') + : Image(image: model.image!))), + ), + ), + StarScore( + score: model.lever, + star: const Star(size: 15, fillColor: Colors.blue), + ) + ], + ); +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart new file mode 100644 index 00000000..c886ea4f --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart @@ -0,0 +1,154 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:toggle_rotate/toggle_rotate.dart'; + + +/// create by 张风捷特烈 on 2020-04-13 +/// contact me by email 1981462002@qq.com +/// 说明: 一个Widget的知识点对应的界面 + +class WidgetNodePanel extends StatefulWidget { + final String text; + final String subText; + final String code; + final Widget? show; + final HighlighterStyle? codeStyle; + final String? codeFamily; + final bool death; + + const WidgetNodePanel( + {Key? key, this.text='', + this.subText='', + this.code='', + this.death=false, + this.show, + required this.codeStyle, + this.codeFamily}) : super(key: key); + + @override + _WidgetNodePanelState createState() => _WidgetNodePanelState(); +} + +class _WidgetNodePanelState extends State { + CrossFadeState _crossFadeState = CrossFadeState.showFirst; + + bool get isFirst => _crossFadeState == CrossFadeState.showFirst; + + Color get themeColor => Theme.of(context).primaryColor; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + buildNodeTitle(), + const SizedBox( + height: 20, + ), + _buildCode(context), + Padding( + padding: const EdgeInsets.only(top: 10, bottom: 20), + child: widget.show, + ), + if(!widget.death) + _buildNodeInfo(), + const Divider(), + ], + ), + ); + } + + Widget buildNodeTitle() => Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Circle( + color: themeColor, + radius: 5, + ), + ), + Expanded( + child: Text( + widget.text, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + ), + _buildShareButton(), + _buildCodeButton() + ], + ); + + Widget _buildNodeInfo() => SizedBox( + width: double.infinity, + child: Panel( + color: Theme.of(context).scaffoldBackgroundColor, + child: Text( + widget.subText, + style: const TextStyle(fontSize: 12), + )), + ); + + Widget _buildCodeButton() => Padding( + padding: const EdgeInsets.only(right: 10.0), + child: ToggleRotate( + durationMs: 300, + child: Icon( + TolyIcon.icon_code, + color: themeColor, + ), + onTap: _toggleCodePanel, + ), + ); + + + + Widget _buildShareButton() => FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _doShare, + child: Padding( + padding: const EdgeInsets.only( + right: 10, + ), + child: Icon( + TolyIcon.icon_share, + size: 20, + color: themeColor, + ), + ), + ); + + Widget _buildCode(BuildContext context) => AnimatedCrossFade( + firstCurve: Curves.easeInCirc, + secondCurve: Curves.easeInToLinear, + firstChild: const SizedBox(), + secondChild: SizedBox( + width: MediaQuery.of(context).size.width, + child: CodeWidget( + fontFamily: widget.codeFamily, + code: isFirst?'':widget.code, + style: widget.codeStyle ?? + HighlighterStyle.fromColors(HighlighterStyle.lightColor), + ), + ), + duration: const Duration(milliseconds: 200), + crossFadeState: _crossFadeState, + ); + + //执行分享 + _doShare() { + Share.share(widget.code); + } + + // 折叠代码面板 + _toggleCodePanel() { + setState(() { + _crossFadeState = + !isFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond; + }); + } +} diff --git a/lib/app/navigation/home_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart similarity index 78% rename from lib/app/navigation/home_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart index c62be23b..a23c52c5 100644 --- a/lib/app/navigation/home_drawer.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart @@ -1,9 +1,7 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; +import 'package:go_router/go_router.dart'; import 'unit_drawer_header.dart'; @@ -13,7 +11,7 @@ import 'unit_drawer_header.dart'; class HomeDrawer extends StatelessWidget { - const HomeDrawer({Key? key}):super(key: key); + const HomeDrawer({super.key}); @override Widget build(BuildContext context) { @@ -25,7 +23,7 @@ class HomeDrawer extends StatelessWidget { Widget _buildChild(BuildContext context) { - final Color color = BlocProvider.of(context).state.color; + final Color color = Theme.of(context).primaryColor; return Container( color: color.withAlpha(33), @@ -33,15 +31,15 @@ class HomeDrawer extends StatelessWidget { padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color: color), - _buildItem(context, TolyIcon.icon_them, '应用设置', UnitRouter.setting), + _buildItem(context, TolyIcon.icon_them, '应用设置', '/settings'), _buildItem( - context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), + context, TolyIcon.icon_layout, '数据管理', '/data_manage'), const Divider(height: 1), _buildFlutterUnit(context), _buildItem(context, TolyIcon.icon_code, 'Dart 手册', ''), const Divider(height: 1), - _buildItem(context, Icons.info, '关于应用', UnitRouter.about_app), - _buildItem(context, TolyIcon.icon_kafei, '联系本王', UnitRouter.about_me), + _buildItem(context, Icons.info, '关于应用', '/about_app'), + _buildItem(context, TolyIcon.icon_kafei, '联系本王', '/about_me'), ], ), ); @@ -58,7 +56,7 @@ class HomeDrawer extends StatelessWidget { _buildItem(context, TolyIcon.icon_tag, '属性集录', ''), _buildItem(context, Icons.palette, '绘画集录', ''), _buildItem(context, Icons.widgets, '布局集录', ''), - _buildItem(context, TolyIcon.icon_bug, '要点集录', UnitRouter.issues_point), + _buildItem(context, TolyIcon.icon_bug, '要点集录', ''), ], ); @@ -75,7 +73,7 @@ class HomeDrawer extends StatelessWidget { Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), onTap: () { if (linkTo.isNotEmpty) { - Navigator.of(context).pushNamed(linkTo); + context.push(linkTo); if (onTap != null) onTap(); } }, diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart new file mode 100644 index 00000000..ac1c637f --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +import 'package:widget_repository/widget_repository.dart'; +import '../../desk_ui/widget_panel/widget_tiled.dart'; + +class MobileWidgetTiled extends StatelessWidget { + final WidgetModel model; + final VoidCallback onTap; + final String? searchArg; + + const MobileWidgetTiled({ + Key? key, + required this.model, + required this.onTap, + this.searchArg, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8, top: 8), + child: WidgetTiled( + model: model, + onTap: onTap, + searchArg: searchArg, + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart new file mode 100644 index 00000000..13160801 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart @@ -0,0 +1,33 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:widget_repository/widget_repository.dart'; + +import 'mobile_widget_tiled.dart'; + + + +class PhoneWidgetContent extends StatelessWidget { + final List items; + + const PhoneWidgetContent({Key? key,required this.items}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) => MobileWidgetTiled( + model: items[index], + onTap: () => _toDetail(context, items[index]), + ), + childCount: items.length, + ), + ); + } + + void _toDetail(BuildContext context, WidgetModel model) { + context.push('/widget/detail/${model.name}',extra: model); + + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart new file mode 100644 index 00000000..e791a024 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart @@ -0,0 +1,212 @@ +// import 'package:flutter/gestures.dart'; +// import 'package:flutter/material.dart'; +// import 'package:app/app.dart'; +// +// import 'widget_page.dart'; +// +// class Carousel extends StatefulWidget { +// final List data; +// +// const Carousel({Key? key, required this.data}) : super(key: key); +// +// @override +// _CarouselState createState() => _CarouselState(); +// } +// +// class _CarouselState extends State { +// final ValueNotifier factor = ValueNotifier(0); +// +// late PageController _ctrl; +// +// final int _firstOffset = 1000; //初始偏移 +// int _position = 0; //页面位置 +// +// @override +// void initState() { +// super.initState(); +// _position = _position + _firstOffset; +// +// double value = ((_position - _firstOffset + 1) % 5) / 5; +// factor.value = value == 0 ? 1 : value; +// _ctrl = PageController( +// viewportFraction: 0.9, +// initialPage: _position, +// )..addListener(() { +// if (_ctrl.page != null) { +// double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; +// factor.value = value == 0 ? 1 : value; +// } +// }); +// } +// +// @override +// void dispose() { +// _ctrl.dispose(); +// factor.dispose(); +// super.dispose(); +// } +// +// Color get color => Colors.blue; +// +// Color get nextColor => Colors.orangeAccent; +// +// bool get isDark => Theme.of(context).brightness == Brightness.dark; +// +// BoxDecoration get boxDecoration => BoxDecoration( +// color: isDark ? Colors.white.withAlpha(33) : Colors.white, +// borderRadius: const BorderRadius.only( +// topLeft: Radius.circular(40), topRight: Radius.circular(40)), +// ); +// +// @override +// Widget build(BuildContext context) { +// List data = widget.data; +// Widget child = PageView.builder( +// controller: _ctrl, // itemCount: 7, +// itemBuilder: (_, index) { +// return AnimatedBuilder( +// child: _buildByIndex(context, index, data), +// animation: _ctrl, +// builder: (context, child) => _buildAnimItemByIndex( +// context, +// child, +// index, +// ), +// ); +// }, +// onPageChanged: (index) { +// _position = index; +// setState(() {}); +// }, +// ); +// +// int realIndex = _fixPosition(_position, _firstOffset, data.length); +// +// child = Stack( +// alignment: Alignment.bottomCenter, +// children: [ +// child, +// Padding( +// padding: const EdgeInsets.only(bottom: 16.0), +// child: Wrap( +// spacing: 6, +// children: widget.data.asMap().keys.map((int index) { +// return GestureDetector( +// onTap: () { +// int deta = index - realIndex; +// _position += deta; +// print('$_position,$realIndex'); +// // _position = index; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// child: Container( +// width: 8, +// height: 8, +// decoration: BoxDecoration( +// color: realIndex == index +// ? Colors.white +// : Colors.black.withValues(alpha: 0.4), +// shape: BoxShape.circle, +// boxShadow: [ +// BoxShadow( +// color: Colors.white.withValues(alpha: 0.3), +// spreadRadius: 1, +// blurRadius: 10, +// blurStyle: BlurStyle.outer) +// ]), +// ), +// ); +// }).toList(), +// ), +// ) +// ], +// ); +// +// if (!kIsDesk) { +// return child; +// } +// +// return MouseRegion( +// onEnter: _onEnter, +// onExit: _onExit, +// child: Stack( +// alignment: Alignment.center, +// children: [ +// Padding( +// padding: const EdgeInsets.symmetric(horizontal: 48.0), +// child: child), +// Positioned( +// right: 0, +// child: IconButton( +// onPressed: () { +// _position += 1; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// icon: Icon(Icons.navigate_next_outlined))), +// Positioned( +// left: 0, +// child: IconButton( +// onPressed: () { +// _position -= 1; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// icon: Icon(Icons.navigate_before))), +// ], +// ), +// ); +// } +// +// Widget? _buildByIndex( +// BuildContext context, int index, List data) { +// int realIndex = _fixPosition(index, _firstOffset, data.length); +// return WidgetDisplay( +// widget: data[realIndex], +// ); +// } +// +// Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { +// double value; +// if (_ctrl.position.haveDimensions && _ctrl.page != null) { +// value = _ctrl.page! - index; +// } else { +// value = (_position - index).toDouble(); +// } +// value = (1 - ((value.abs()) * .3)).clamp(0, 1).toDouble(); +// value = Curves.easeOut.transform(value); +// +// return Transform( +// transform: Matrix4.diagonal3Values(1.0, value, 1.0), +// alignment: Alignment.center, +// child: Padding( +// padding: const EdgeInsets.all(4.0), +// child: child, +// ), +// ); +// } +// +// int _fixPosition(int realPos, int initPos, int length) { +// final int offset = realPos - initPos; +// int result = offset % length; +// return result < 0 ? length + result : result; +// } +// +// bool _hover = false; +// +// void _onEnter(PointerEnterEvent event) { +// setState(() { +// _hover = true; +// }); +// } +// +// void _onExit(PointerExitEvent event) { +// setState(() { +// _hover = false; +// }); +// } +// } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart new file mode 100644 index 00000000..06e3c647 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -0,0 +1,135 @@ +import 'package:l10n/ext.dart'; +import 'package:widget_module/blocs/action/widget_action.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'home_drawer.dart'; +import 'standard_home_search.dart'; +import 'widget_page.dart'; + +class StandardHomePage extends StatefulWidget { + final Widget? heard; + const StandardHomePage({super.key, this.heard}); + + @override + State createState() => _StandardHomePageState(); +} + +class _StandardHomePageState extends State + with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { + List get _tabs => [ + context.l10n.stateless, + context.l10n.stateful, + context.l10n.single, + context.l10n.multi, + context.l10n.sliver, + context.l10n.proxy, + context.l10n.other, + ]; + + late TabController tabController; + + @override + void initState() { + super.initState(); + tabController = TabController(length: 7, vsync: this); + } + + int maxCount = 60; + + @override + void dispose() { + tabController.dispose(); + super.dispose(); + } + + void _switchTab(int index) { + WidgetFamily widgetFamily = WidgetFamily.values[index]; + WidgetsBloc bloc = context.read(); + if (bloc.state.filter.family == widgetFamily) return; + PrimaryScrollController.of(context).jumpTo(0); + context.switchWidgetFamily(widgetFamily); + } + + @override + Widget build(BuildContext context) { + super.build(context); + final AppBarTheme appBarTheme = AppBarTheme.of(context); + bool isDark = Theme.of(context).brightness == Brightness.dark; + double bottom = MediaQuery.of(context).padding.bottom; + return Scaffold( + extendBody: true, + drawer: const HomeDrawer(), + body: Column( + children: [ + AnnotatedRegion( + value: appBarTheme.systemOverlayStyle!, + child: Container( + color: isDark ? Colors.black : Colors.white, + height: MediaQuery.of(context).padding.top, + ), + ), + Expanded( + child: NestedScrollView( + floatHeaderSlivers: true, + physics: const BouncingScrollPhysics(), + headerSliverBuilder: _buildHeader, + body: const WidgetPage()), + ), + SizedBox(height: bottom) + ], + ), + ); + } + + List _buildHeader(BuildContext context, bool innerBoxIsScrolled) { + Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return [ + // const SliverSnapHeader(child: StandardHomeSearch()), + const SliverFloatingHeader( + snapMode: FloatingHeaderSnapMode.scroll, + child: StandardHomeSearch(), + ), + if (widget.heard != null) + SliverToBoxAdapter( + child: Container( + height: 168, + color: Colors.white, + child: widget.heard, + ), + ), + SliverPinnedHeader( + color: isDark ? Colors.black : Colors.white, + child: TabBar( + onTap: _switchTab, + tabAlignment: TabAlignment.start, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: _tabs.map((String name) => Tab(text: name)).toList(), + )), + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // ), + ]; + } + + @override + bool get wantKeepAlive => true; +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart new file mode 100644 index 00000000..cec88581 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -0,0 +1,99 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/ext.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../search_page/standard_search_page.dart'; + +class StandardHomeSearch extends StatelessWidget + implements PreferredSizeWidget { + const StandardHomeSearch({Key? key}) : super(key: key); + + @override + Size get preferredSize => const Size.fromHeight(35 + 8 * 2); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return ColoredBox( + color: isDark ? Colors.transparent : Colors.white, + child: Row( + children: [ + _buildHead(context), + Expanded( + child: GestureDetector( + onTap: () => _toSearchPage(context), + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8), + height: 35, + child: TextField( + autofocus: false, + enabled: false, + cursorColor: Colors.blue, + maxLines: 1, + decoration: _topSearchInputDecoration(isDark, context), + )), + ), + ), + _buildCollectIcon(context), + ], + ), + ); + } + + InputDecoration _topSearchInputDecoration(bool isDark, BuildContext context) { + String hintText = context.l10n.searchWidget; + return InputDecoration( + filled: true, + fillColor: isDark ? const Color(0xff292929) : const Color(0xffF3F6F9), + prefixIcon: const Icon( + Icons.search, + color: Colors.grey, + size: 20, + ), + prefixIconConstraints: + const BoxConstraints(maxHeight: 24, minWidth: 36), + isCollapsed: true, + contentPadding: const EdgeInsets.only(top: 4, bottom: 4, right: 8), + border: const UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(6)), + ), + hintText: hintText, + hintStyle: const TextStyle(fontSize: 14)); + } + + Widget _buildHead(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: FeedbackWidget( + onPressed: () => _openDrawer(context), + child: const CircleAvatar( + radius: 16, + backgroundImage: AssetImage('assets/images/icon_head.webp'), + ), + ), + ); + } + + Widget _buildCollectIcon(BuildContext context) { + return IconButton( + onPressed: () => context.push(AppRoute.collection.url), + icon: const Icon( + TolyIcon.icon_collect, + size: 22, + ), + ); + } + + void _toSearchPage(BuildContext context) { + Navigator.of(context) + .push(FadePageRoute(child: const StandardSearchPageProvider())); + } + + void _openDrawer(BuildContext context) { + Scaffold.of(context).openDrawer(); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart new file mode 100644 index 00000000..ebe738af --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-22 +/// contact me by email 1981462002@qq.com +/// 说明: + +class UnitDrawerHeader extends StatelessWidget { + final Color color; + + const UnitDrawerHeader({super.key, required this.color}); + + @override + Widget build(BuildContext context) { + return DrawerHeader( + padding: const EdgeInsets.only(top: 10, left: 15), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/wy_300x200_filter.webp'), + fit: BoxFit.cover), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Wrap( + spacing: 10, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + FlutterLogo( + size: 35, + ), + Text( + 'Flutter Unit', + style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ + Shadow( + color: Colors.black, offset: Offset(1, 1), blurRadius: 3) + ]), + ), + ], + ), + const SizedBox(height: 15), + Text( + 'The Unity Of Flutter, The Unity Of Coder.', + style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ + Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) + ]), + ), + const SizedBox(height: 5), + Text( + 'Flutter的联合,编程者的联合。', + style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ + Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) + ]), + ), + const SizedBox(height: 10), + const Row( + children: [ + Spacer(flex: 5), + Text( + '—— 张风捷特烈', + style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ + Shadow( + color: Colors.orangeAccent, + offset: Offset(.5, .5), + blurRadius: 1) + ]), + ), + Spacer(flex: 1), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart new file mode 100644 index 00000000..c19827ce --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart @@ -0,0 +1,39 @@ +import 'package:components/project_ui/project_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import 'phone_widget_content.dart'; + +class WidgetListPanel extends StatelessWidget { + const WidgetListPanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + WidgetsState state = context.watch().state; + + + if (state is WidgetsLoaded) { + return PhoneWidgetContent(items: state.widgets); + } + + if (state is WidgetsLoading) { + return const SliverFillRemaining( + child: LoadingShower(), + ); + } + + if (state is WidgetsLoadFailed) { + return SliverFillRemaining( + child: ErrorShower( + error: "数据加载异常:\n${state.error}", + )); + } + + return const SliverFillRemaining( + child: EmptyShower( + message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart new file mode 100644 index 00000000..51326cf8 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart @@ -0,0 +1,74 @@ +import 'package:components/components.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:note/note.dart'; +import 'widget_list_panel.dart'; + +class WidgetPage extends StatefulWidget { + const WidgetPage({Key? key}) : super(key: key); + + @override + State createState() => _WidgetPageState(); +} + +class _WidgetPageState extends State { + final RefreshController _refreshController = + RefreshController(initialRefresh: false); + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return BlocListener( + listener: _listenStateChange, + child: RefreshConfigWrapper( + child: SmartRefresher( + physics: BouncingScrollPhysics(), + controller: _refreshController, + onRefresh: _onRefresh, + enablePullUp: true, + onLoading: _onLoadMore, + child: CustomScrollView( + physics: BouncingScrollPhysics(), + // key: PageStorageKey(name), + slivers: [ + const WidgetListPanel(), + ], + ), + ), + ), + ); + } + + void _onRefresh() async { + context.read().add(EventRefresh()); + await context.read().refreshFromNet(); + } + + void _onLoadMore() { + context.read().add(EventLoadMore()); + } + + void _listenStateChange(BuildContext context, WidgetsState state) async { + if (state is WidgetsLoaded) { + if (state.operate == LoadOperate.refresh) { + _refreshController.refreshCompleted(); + } + if (state.operate == LoadOperate.more) { + if (state.full) { + _refreshController.loadNoData(); + await Future.delayed(const Duration(milliseconds: 2000)); + _refreshController.resetNoData(); + } else { + _refreshController.loadComplete(); + } + } + } + } +} diff --git a/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart new file mode 100644 index 00000000..f3aa6314 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart @@ -0,0 +1,52 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; + + +class WidgetsBlocProvider extends StatefulWidget { + final Widget child; + + const WidgetsBlocProvider({super.key, required this.child}); + + @override + State createState() => _WidgetsBlocProviderState(); +} + +class _WidgetsBlocProviderState extends State { + late WidgetRepository repository; + final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); + + @override + void initState() { + super.initState(); + if (kAppEnv.isWeb) { + repository = MemoryWidgetRepository(); + } else { + repository = const WidgetDbRepository(); + } + } + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => WidgetsBloc(repository: repository)), + BlocProvider(create: (_) => categoryBloc), + BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), + BlocProvider( + create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), + ], + child: widget.child, + ); + } + + + @override + void dispose() { + categoryBloc.close(); + super.dispose(); + } +} diff --git a/modules/widget_system/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart new file mode 100644 index 00000000..90affcab --- /dev/null +++ b/modules/widget_system/widget_module/lib/widget_module.dart @@ -0,0 +1,16 @@ +library widget_module; + +export 'views/desk_ui/desk_ui.dart'; +export 'views/mobile/mobile_ui.dart'; +export 'views/widgets_bloc_provider.dart'; +export 'event/widget_event.dart'; +export 'blocs/action/widget_action.dart'; +export 'package:widget_repository/widget_repository.dart' + show + WidgetFilter, + WidgetFamily, + CategoryModel, + WidgetModel, + CategoryRepository, + CategoryTo, + LikeDao,WidgetDao,NodeDao,CategoryDao; diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml new file mode 100644 index 00000000..63ee4db3 --- /dev/null +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -0,0 +1,53 @@ +name: widget_module +description: A new Flutter package project. +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + widget_repository: + path: ../widget_repository + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/widget_module/test/widget_module_test.dart b/modules/widget_system/widget_module/test/widget_module_test.dart similarity index 100% rename from packages/widget_module/test/widget_module_test.dart rename to modules/widget_system/widget_module/test/widget_module_test.dart diff --git a/modules/widget_system/widget_repository/.gitignore b/modules/widget_system/widget_repository/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/widget_system/widget_repository/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/widget_system/widget_repository/.metadata b/modules/widget_system/widget_repository/.metadata new file mode 100644 index 00000000..24472f12 --- /dev/null +++ b/modules/widget_system/widget_repository/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2663184aa79047d0a33a14a3b607954f8fdd8730" + channel: "stable" + +project_type: package diff --git a/modules/widget_system/widget_repository/CHANGELOG.md b/modules/widget_system/widget_repository/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/widget_system/widget_repository/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/widget_system/widget_repository/LICENSE b/modules/widget_system/widget_repository/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/widget_system/widget_repository/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/widget_system/widget_repository/README.md b/modules/widget_system/widget_repository/README.md new file mode 100644 index 00000000..4a260d8d --- /dev/null +++ b/modules/widget_system/widget_repository/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/widget_system/widget_repository/analysis_options.yaml b/modules/widget_system/widget_repository/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/widget_system/widget_repository/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart new file mode 100644 index 00000000..43990a56 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart @@ -0,0 +1,189 @@ +import 'package:fx_dao/fx_dao.dart'; + +import '../../../widget_repository.dart'; + +//""" +// CREATE TABLE IF NOT EXISTS category_widget( +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// name VARCHAR(64) NOT NULL, +// color VARCHAR(9) DEFAULT '#FF2196F3', +// info VARCHAR(256) DEFAULT '这里什么都没有...', +// created DATETIME NOT NULL, +// updated DATETIME NOT NULL, +// priority INTEGER DEFAULT 0, +// image VARCHAR(128) NULL image DEFAULT '' +// ); +//"""; + +class CategoryDao extends Dao { + @override + String get createSql => ''; + + @override + String get name => 'category'; + + Future insert(CategoryPo category) async { + String addSql = //插入数据 + "INSERT INTO " + "category(id,name,color,info,priority,image,created,updated) " + "VALUES (?,?,?,?,?,?,?,?);"; + return await database + .transaction((tran) async => await tran.rawInsert(addSql, [ + category.id, + category.name, + category.color, + category.info, + category.priority, + category.image, + category.created?.toIso8601String(), + category.updated.toIso8601String(), + ])); + } + + Future update(CategoryPo widget) async { + String updateSql = //插入数据 + "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " + "WHERE id = ?"; + + return await database + .transaction((tran) async => await tran.rawUpdate(updateSql, [ + widget.name, + widget.color, + widget.info, + widget.priority, + widget.image, + widget.updated.toIso8601String(), + widget.id, + ])); + } + + Future addWidget( + int categoryId, + int widgetId, + ) async { + String addSql = "INSERT INTO " + "category_widget(widgetId,categoryId) " + "VALUES (?,?);"; + return await database + .transaction((tran) async => await tran.rawInsert(addSql, [ + widgetId, + categoryId, + ])); + } + + Future addWidgets(int categoryId, List widgetIds) async { + String addSql = "INSERT INTO " + "category_widget(widgetId,categoryId) VALUES "; + String args = ''; + for (int i = 0; i < widgetIds.length; i++) { + args += "(${widgetIds[i]},$categoryId)"; + if (i == widgetIds.length - 1) { + args += ";"; + } else { + args += ","; + } + } + addSql += args; + return await database + .transaction((tran) async => await tran.rawInsert(addSql)); + } + + Future existByName(String name) async { + String sql = "SELECT COUNT(name) as count FROM category " + "WHERE name = ?"; + List> rawData = await database.rawQuery(sql, [name]); + if (rawData.isNotEmpty) { + return rawData[0]['count'] > 0; + } + return false; + } + + Future>> queryAll() async { + List> data = await database.rawQuery( + "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" + "FROM category AS c " + "LEFT JOIN category_widget AS cw " + "ON c.id = cw.categoryId GROUP BY c.id " + "ORDER BY priority DESC,created DESC", + []); + return data; + } + + Future> categoryWidgetIds(int id) async { + List> data = await database.rawQuery( + "SELECT categoryId FROM `category_widget`" + "WHERE widgetId = ?", + [id]); + return data.toList().map((e) => e["categoryId"]).toList(); + } + + Future deleteCollect(int id) async { + await database.execute( + "DELETE FROM category_widget " + "WHERE categoryId = ?", + [id]); + return await database.execute( + "DELETE FROM category " + "WHERE id = ?", + [id]); + } + + Future clear() async { + await database.execute("DELETE FROM category_widget " + "WHERE categoryId >0"); + return await database.execute("DELETE FROM category " + "WHERE id > 0"); + } + + Future removeWidget(int categoryId, int widgetId) async { + String deleteSql = "DELETE FROM " + "category_widget WHERE categoryId = ? AND widgetId = ? "; + return await database + .transaction((tran) async => await tran.rawInsert(deleteSql, [ + categoryId, + widgetId, + ])); + } + + Future existWidgetInCollect(int categoryId, int widgetId) async { + String sql = "SELECT COUNT(id) as count FROM category_widget " + "WHERE categoryId = ? AND widgetId = ?"; + List> rawData = + await database.rawQuery(sql, [categoryId, widgetId]); + if (rawData.isNotEmpty) { + return rawData[0]['count'] > 0; + } + return false; + } + + Future toggleCollect(int categoryId, int widgetId) async { + if (await existWidgetInCollect(categoryId, widgetId)) { + await removeWidget(categoryId, widgetId); + } else { + await addWidget(categoryId, widgetId); + } + } + + Future toggleCollectDefault(int widgetId) async { + await toggleCollect(1, widgetId); + } + + Future>> loadCollectWidgets(int categoryId) async { + String querySql = + "SELECT * FROM widget " + "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " + "ORDER BY lever DESC"; + + return await database.rawQuery(querySql, [categoryId]); + } + + Future> loadCollectWidgetIds(int categoryId) async { + String querySql = + "SELECT id FROM widget " + "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " + "ORDER BY lever DESC"; + + var data = await database.rawQuery(querySql, [categoryId]); + return data.map((e) => e["id"] as int).toList(); + } +} diff --git a/packages/db_storage/lib/src/dao/like_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart similarity index 80% rename from packages/db_storage/lib/src/dao/like_dao.dart rename to modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart index aa072fc7..f533415d 100644 --- a/packages/db_storage/lib/src/dao/like_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart @@ -1,12 +1,14 @@ -import 'package:sqflite/sqflite.dart'; +import 'package:fx_dao/fx_dao.dart'; -class LikeDao { - final Database db; +class LikeDao extends Dao { + @override + String get createSql => ''; - LikeDao(this.db); + @override + String get name => 'like_widget'; Future> likeWidgetIds() async { - var result = await db.rawQuery("SELECT widget_id FROM like_widget"); + var result = await database.rawQuery("SELECT widget_id FROM like_widget"); var ids = result.map((e) => e['widget_id'] as int).toList(); return ids; } @@ -30,7 +32,7 @@ class LikeDao { if (liked) return 0; } - return await db.rawInsert( + return await database.rawInsert( "INSERT INTO " "like_widget(widget_id) " "VALUES (?);", @@ -43,7 +45,7 @@ class LikeDao { bool liked = await isLiked(widgetId); if (!liked) return; } - await db.execute( + await database.execute( "DELETE FROM like_widget " "WHERE widget_id = ?", [widgetId]); @@ -51,7 +53,7 @@ class LikeDao { // 判断组件是否已 liked Future isLiked(int widgetId) async { - var data = await db.rawQuery( + var data = await database.rawQuery( "Select count(id) as `count` FROM like_widget " "WHERE widget_id = ?", [widgetId]); diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart new file mode 100644 index 00000000..2e6c04b8 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -0,0 +1,47 @@ +import 'package:fx_dao/fx_dao.dart'; + +import '../po/node_po.dart'; + +class NodeDao extends Dao { + @override + String get createSql => ''; + + @override + String get name => 'node'; + + Future insert(NodePo widget) async { + String addSql = "INSERT INTO " + "node(widgetId,name,priority,subtitle,code) " + "VALUES (?,?,?,?,?);"; + return await database.transaction((tran) async => await tran.rawInsert( + addSql, [ + widget.widgetId, + widget.name, + widget.priority, + widget.subtitle, + widget.code + ])); + } + + Future>> queryAll() async => + database.rawQuery("SELECT * FROM node"); + + //根据 id 查询组件 node + Future>> queryById(int id, {String? locale}) async { + String sql = """ +SELECT + node.priority, + node.code, + node_desc.name, + node_desc.subtitle +FROM node +INNER JOIN node_desc + ON node.id = node_desc.node_id +WHERE node_desc.locale = ? +AND node.widgetId = ? +ORDER BY priority +"""; + + return await database.rawQuery(sql, [locale ?? 'zh-cn', id]); + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart new file mode 100644 index 00000000..debeeefe --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -0,0 +1,128 @@ +import 'package:fx_dao/fx_dao.dart'; +import '../../model/widget_filter.dart'; + +class WidgetDao extends Dao { + @override + String get createSql => ''; + + @override + String get name => 'widget'; + + Future>> queryByIds( + List ids, String? locale) async { + if (ids.isEmpty) { + return []; + } + String searchSql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE + widget_desc.locale = ? AND + widget.id in (${'?,' * (ids.length - 1)}?) +ORDER BY + lever DESC, widget.id ASC; + """; + + return database.rawQuery(searchSql, [(locale ?? 'zh-cn'), ...ids]); + } + + Future>> search(WidgetFilter arguments) async { + // 保证 name 参数为空时,不进行搜索 + if (arguments.name.isEmpty) { + return []; + } + + // * 表示 name 任意 + String name = arguments.name == '*' ? '' : arguments.name; + bool hasFamily = arguments.family != null; + String familySql = hasFamily ? ' AND family = ?' : ''; + List familyArg = hasFamily ? [arguments.family!.index] : []; + List starArg = arguments.stars; + if (arguments.stars.reduce((a, b) => a + b) == -5) { + starArg = [1, 2, 3, 4, 5]; + } + String searchSql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE +widget_desc.locale = ? +AND (widget.name LIKE ? OR widget_desc.info LIKE ? OR widget_desc.name LIKE ?) +$familySql +AND lever IN(?,?,?,?,?) +ORDER BY + lever DESC, widget.id ASC +LIMIT ? OFFSET ? +; + """; + + return database.rawQuery(searchSql, [ + arguments.locale ?? 'zh-cn', + "%$name%", + "%$name%", + "%$name%", + ...familyArg, + ...starArg, + arguments.pageSize, + arguments.offset + ]); + } + + Future total(WidgetFilter args) async { + bool hasFamily = args.family != null; + String familySql = hasFamily ? 'family = ?' : ''; + List familyArg = hasFamily ? [args.family!.index] : []; + + String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; + + List> result = await database.rawQuery(sql, familyArg); + if (result.isNotEmpty) { + return result.first['count'] as int ?? 0; + } + return 0; + } + + Future?> queryWidgetByName(String name, + {String? locale}) async { + String querySql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE +widget.name = ? AND +widget_desc.locale = ? +; +"""; + List> result = + await database.rawQuery(querySql, [name, locale ?? 'zh-cn']); + if (result.isNotEmpty) { + return result.first; + } + return null; + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/database.dart b/modules/widget_system/widget_repository/lib/src/database/database.dart new file mode 100644 index 00000000..03fed7c2 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/database.dart @@ -0,0 +1,12 @@ +export 'po/category_po.dart'; +export 'po/node_po.dart'; +export 'po/widget_po.dart'; + +export 'dao/like_dao.dart'; +export 'dao/node_dao.dart'; +export 'dao/widget_dao.dart'; +export 'dao/category_dao.dart'; + +export 'db_impl/category_db_repository.dart'; +export 'db_impl/node_db_repository.dart'; +export 'db_impl/widget_db_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart new file mode 100644 index 00000000..456c216d --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart @@ -0,0 +1,110 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + +/// create by 张风捷特烈 on 2020-04-21 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryDbRepository implements CategoryRepository { + CategoryDao get categoryDao => AppStorage().flutter(); + + LikeDao get likeDao => AppStorage().flutter(); + + @override + Future addCategory(CategoryPo categoryPo) async { + int success = await categoryDao.insert(categoryPo); + return success != -1; + } + + @override + Future check(int categoryId, int widgetId) async { + return await categoryDao.existWidgetInCollect(categoryId, widgetId); + } + + @override + Future deleteCategory(int id) async { + await categoryDao.deleteCollect(id); + } + + @override + Future> loadCategories() async { + List> data = await categoryDao.queryAll(); + List collects = + data.map((e) => CategoryPo.fromJson(e)).toList(); + return collects.map(CategoryModel.fromPo).toList(); + } + + @override + Future> loadCategoryWidgets({int categoryId = 0}) async { + List> rawData = + await categoryDao.loadCollectWidgets(categoryId); + List widgets = rawData.map((e) => WidgetPo.fromJson(e)).toList(); + return widgets.map(WidgetModel.fromPo).toList(); + } + + @override + Future toggleCategory(int categoryId, int widgetId) async { + return await categoryDao.toggleCollect(categoryId, widgetId); + } + + @override + Future> getCategoryByWidget(int widgetId) async { + return await categoryDao.categoryWidgetIds(widgetId); + } + + @override + Future updateCategory(CategoryPo categoryPo) async { + int success = await categoryDao.update(categoryPo); + return success != -1; + } + + @override + Future> loadCategoryData() async { + List> data = await categoryDao.queryAll(); + + Completer> completer = Completer(); + List collects = []; + + if (data.isEmpty) { + completer.complete([]); + } + + for (int i = 0; i < data.length; i++) { + List ids = await categoryDao.loadCollectWidgetIds(data[i]['id']); + collects.add(CategoryTo(widgetIds: ids, model: CategoryPo.fromJson(data[i]))); + if (i == data.length - 1) { + completer.complete(collects); + } + } + + return completer.future; + } + + @override + Future syncCategoryByData(String data, String likeData) async { + try { + await categoryDao.clear(); + List dataMap = json.decode(data); + for (int i = 0; i < dataMap.length; i++) { + CategoryPo po = CategoryPo.fromNetJson(dataMap[i]["model"]); + List widgetIds = dataMap[i]["widgetIds"]; + await addCategory(po); + if (widgetIds.isNotEmpty && po.id != null) { + await categoryDao.addWidgets(po.id!, widgetIds); + } + } + List likeWidgets = + (json.decode(likeData) as List).map((e) => e).toList(); + for (int i = 0; i < likeWidgets.length; i++) { + await likeDao.like(likeWidgets[i]); + } + return true; + } catch (e) { + print(e); + return false; + } + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart new file mode 100644 index 00000000..743fb4ca --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart @@ -0,0 +1,18 @@ + +import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + +class NodeDbRepository implements NodeRepository{ + + const NodeDbRepository(); + + NodeDao get nodeDao => AppStorage().flutter(); + + @override + Future> loadNode(int widgetId,{String? locale}) async{ + List> data = await nodeDao.queryById(widgetId,locale: locale); + List nodes = data.map((e) => NodeModel.fromJson(e)).toList(); + return nodes; + } + +} \ No newline at end of file diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart new file mode 100644 index 00000000..3f2bef0e --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart @@ -0,0 +1,67 @@ +import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../../model/widget_filter.dart'; +import '../../repository/widget_repository.dart'; + + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明 : Widget数据仓库 + +class WidgetDbRepository implements WidgetRepository { + const WidgetDbRepository(); + + WidgetDao get widgetDao => AppStorage().flutter(); + + LikeDao get likeDao => AppStorage().flutter(); + + @override + Future> loadLikeWidgets() async { + // return []; + List likeIds = await likeDao.likeWidgetIds(); + List> data = await widgetDao.queryByIds(likeIds, null); + List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); + return widgets.map(WidgetModel.fromPo).toList(); + } + + @override + Future> searchWidgets(WidgetFilter args) async { + List> data = await widgetDao.search(args); + List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); + return widgets.map(WidgetModel.fromPo).toList(); + } + + @override + Future> loadWidget(List id,String? locale) async { + List> data = await widgetDao.queryByIds(id,locale); + List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); + if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); + return []; + } + + @override + Future toggleLike( + int id, + ) { + return likeDao.toggleCollect(id); + } + + @override + Future collected(int id) async { + return await likeDao.like(id); + } + + @override + Future total(WidgetFilter args) => widgetDao.total(args); + + @override + Future queryWidgetByName(String? name) async { + if (name == null) return null; + Map? data = await widgetDao.queryWidgetByName(name); + if (data != null) { + return WidgetModel.fromPo(WidgetPo.fromJson(data)); + } + return null; + } +} diff --git a/packages/db_storage/lib/src/bean/category_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart similarity index 82% rename from packages/db_storage/lib/src/bean/category_po.dart rename to modules/widget_system/widget_repository/lib/src/database/po/category_po.dart index 6046d5d8..0a017711 100644 --- a/packages/db_storage/lib/src/bean/category_po.dart +++ b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart @@ -1,19 +1,20 @@ + /// create by 张风捷特烈 on 2020-04-17 /// contact me by email 1981462002@qq.com /// 说明: 收藏夹数据库-数据模型 - -// """ -// CREATE TABLE IF NOT EXISTS category( -// id INTEGER PRIMARY KEY AUTOINCREMENT, -// name VARCHAR(64) NOT NULL, -// color VARCHAR(9) DEFAULT '#FF2196F3', -// info VARCHAR(256) DEFAULT '这里什么都没有...', -// created DATETIME NOT NULL, -// updated DATETIME NOT NULL, -// priority INTEGER DEFAULT 0, -// image VARCHAR(128) NULL image DEFAULT '' -// );"""; //建表语句 - +/// +/// """ +/// CREATE TABLE IF NOT EXISTS category( +/// id INTEGER PRIMARY KEY AUTOINCREMENT, +/// name VARCHAR(64) NOT NULL, +/// color VARCHAR(9) DEFAULT '#FF2196F3', +/// info VARCHAR(256) DEFAULT '这里什么都没有...', +/// created DATETIME NOT NULL, +/// updated DATETIME NOT NULL, +/// priority INTEGER DEFAULT 0, +/// image VARCHAR(128) NULL image DEFAULT '' +/// );"""; //建表语句 +/// class CategoryPo { final int? id; final String name; diff --git a/packages/db_storage/lib/src/bean/node_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/node_po.dart similarity index 97% rename from packages/db_storage/lib/src/bean/node_po.dart rename to modules/widget_system/widget_repository/lib/src/database/po/node_po.dart index 16bfd817..f5198a1b 100644 --- a/packages/db_storage/lib/src/bean/node_po.dart +++ b/modules/widget_system/widget_repository/lib/src/database/po/node_po.dart @@ -22,7 +22,7 @@ class NodePo { factory NodePo.fromJson(Map map) { return NodePo( - id: map['id'], + id: map['id']??0, name: map['name'], widgetId: map["widgetId"], priority: map["priority"], diff --git a/packages/db_storage/lib/src/bean/widget_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart similarity index 80% rename from packages/db_storage/lib/src/bean/widget_po.dart rename to modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart index 70f4dfd8..c90072f1 100644 --- a/packages/db_storage/lib/src/bean/widget_po.dart +++ b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart @@ -3,8 +3,6 @@ /// contact me by email 1981462002@qq.com /// 说明: 组件信息-数据库-数据模型 /// - - class WidgetPo { final int id; final String name; @@ -38,6 +36,18 @@ class WidgetPo { info: map["info"]); } + factory WidgetPo.fromDesc(Map map) { + return WidgetPo( + id: map['id'], + name: map['name'], + nameCN: map["localName"], + family: map["family"], + lever: map["lever"].toDouble(), + linkWidget: map["linkIds"].join(','), + deprecated: map["deprecated"] ?? 0, + info: map["info"]); + } + Map toJson() { return { "id": id, @@ -60,3 +70,4 @@ class WidgetPo { List get props => [id, name, nameCN, deprecated, family, linkWidget, lever, info]; } + diff --git a/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart new file mode 100644 index 00000000..02f24ba9 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart @@ -0,0 +1,39 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../repository/node_repository.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明 : Node 数据仓库 + +class MemoryNodeRepository implements NodeRepository { + List? _nodeCache; + + MemoryNodeRepository(); + + Future initData() async { + if (_nodeCache != null) { + return; + } + ByteData byteData = await rootBundle.load('assets/data/web/node.json'); + String content = utf8.decode(byteData.buffer.asUint8List()); + var data = json.decode(content) as List; + _nodeCache = data.map((e) => NodePo.fromJson(e)).toList(); + } + + @override + Future> loadNode(int widgetId,{String? locale}) async { + await initData(); + return _nodeCache! + .where((element) => element.widgetId == widgetId) + .map((e) => NodeModel( + name: e.name, + subtitle: e.subtitle, + code: e.code, + priority: e.priority, + )) + .toList(); + } +} diff --git a/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart new file mode 100644 index 00000000..955d418b --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart @@ -0,0 +1,81 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../model/widget_filter.dart'; +import '../repository/widget_repository.dart'; + + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明 : Widget 数据仓库 + +class MemoryWidgetRepository implements WidgetRepository { + List? _widgetCache; + + List get widgets => _widgetCache!; + + MemoryWidgetRepository(); + + Future _initData() async { + if (_widgetCache != null) { + return; + } + ByteData byteData = await rootBundle.load('assets/data/web/widget.json'); + String content = utf8.decode(byteData.buffer.asUint8List()); + var data = json.decode(content) as List; + _widgetCache = data.map((e) => WidgetPo.fromJson(e)).toList(); + } + + @override + Future> searchWidgets(WidgetFilter args) async { + await _initData(); + var result = widgets.map(WidgetModel.fromPo).where((e) => checkSearch(e, args)).toList(); + result.sort((a, b) => b.lever.compareTo(a.lever)); + return result; + } + + bool checkSearch(WidgetModel model, WidgetFilter args) { + bool nameMatch = model.name.toLowerCase().contains(args.name.toLowerCase()); + bool nameCNMatch = model.nameCN.toLowerCase().contains(args.name.toLowerCase()); + bool familyMatch = model.family == args.family; + + return nameMatch || nameCNMatch || familyMatch; + } + + @override + Future> loadWidget(List id,String? locale) async { + await _initData(); + var data = widgets.where((element) => id.contains(element.id)); + return data.map(WidgetModel.fromPo).toList(); + } + + @override + Future> loadLikeWidgets() async { + return []; + } + + @override + Future queryWidgetByName(String? name) async { + await _initData(); + Iterable ret = + widgets.map(WidgetModel.fromPo).where((element) => element.name == name); + if (ret.isNotEmpty) { + return ret.first; + } + return null; + } + + @override + Future toggleLike(int id) async {} + + @override + Future total(WidgetFilter args) async { + return 0; + } + + @override + Future collected(int id) async { + return 0; + } +} diff --git a/packages/widget_repository/lib/src/model/category_model.dart b/modules/widget_system/widget_repository/lib/src/model/category_model.dart similarity index 86% rename from packages/widget_repository/lib/src/model/category_model.dart rename to modules/widget_system/widget_repository/lib/src/model/category_model.dart index 87d1e40b..790267bb 100644 --- a/packages/widget_repository/lib/src/model/category_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/category_model.dart @@ -1,11 +1,15 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; - - import 'package:intl/intl.dart'; import 'package:utils/utils.dart'; -import 'package:db_storage/db_storage.dart'; +import '../database/po/category_po.dart'; + + +// import 'package:intl/intl.dart'; +// import 'package:utils/utils.dart'; +// +// import 'package:storage/storage.dart'; /// create by 张风捷特烈 on 2020-04-21 @@ -37,7 +41,7 @@ class CategoryModel extends Equatable { id: po.id, name: po.name, info: po.info, - createDate:po.created!=null? DateFormat('yyyy-MM-dd HH:mm').format(po.created!):null, + createDate:po.created!=null? DateFormat('yyyy/MM/dd').format(po.created!):null, imageCover: po.image, count: po.count, color: ColorUtils.parse(po.color), diff --git a/modules/widget_system/widget_repository/lib/src/model/model.dart b/modules/widget_system/widget_repository/lib/src/model/model.dart new file mode 100644 index 00000000..399e0f3c --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/model.dart @@ -0,0 +1,4 @@ +export 'node_model.dart'; +export 'widget_model.dart'; +export 'category_model.dart'; +export 'widget_filter.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_repository/lib/src/model/node_model.dart b/modules/widget_system/widget_repository/lib/src/model/node_model.dart new file mode 100644 index 00000000..b74a45f3 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/node_model.dart @@ -0,0 +1,53 @@ +import 'package:equatable/equatable.dart'; + +/// create by 张风捷特烈 on 2020-03-04 +/// contact me by email 1981462002@qq.com +/// 说明: 详情页节点-展示-数据模型 +/// + +enum NodeType { + display, + newPage, + description, + deprecated, +} + +class NodeModel extends Equatable { + final String name; + final String subtitle; + final String code; + final int priority; + + const NodeModel({ + required this.name, + required this.subtitle, + required this.code, + required this.priority, + }); + + @override + List get props => [name, subtitle, code, priority]; + + NodeType type(String widget, int priority) { + if (widget == 'PinnedHeaderSliver') { + return NodeType.newPage; + } + if (widget == 'NavigationRail') { + return NodeType.newPage; + } + return NodeType.display; + } + + factory NodeModel.fromJson(Map map) { + return NodeModel( + name: map['name'], + subtitle: map["subtitle"], + code: map["code"], + priority: map['priority']); + } + + @override + String toString() { + return 'Node{name: $name, subtitle: $subtitle, code: $code}'; + } +} diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart new file mode 100644 index 00000000..3482da8e --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart @@ -0,0 +1,60 @@ +enum WidgetFamily { + stateless, + stateful, + singleChildRender, + multiChildRender, + sliver, + proxy, + other, +} + + +class WidgetFilter { + final String name; + final String? locale; + final WidgetFamily? family; + final List stars; + final int page; + final int pageSize; + + const WidgetFilter({ + this.name = '', + this.locale = 'zh-cn', + this.family, + this.stars = const [-1, -1, -1, -1, -1], + this.page = 1, + this.pageSize = 20, + }); + + int get offset =>pageSize*(page-1); + + WidgetFilter.family( + this.family, { + this.name = '*', + this.page = 1, + this.locale = 'zh-cn', + this.pageSize = 20, + this.stars = const [1, 2, 3, 4, 5], + }); + + WidgetFilter copyWith({ + String? name, + WidgetFamily? family, + List? stars, + int? page, + String? locale, + }) { + return WidgetFilter( + name: name ?? this.name, + family: family ?? this.family, + stars: stars ?? this.stars, + page: page ?? this.page, + locale: locale ?? this.locale, + ); + } + + @override + String toString() { + return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; + } +} diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_model.dart b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart new file mode 100644 index 00000000..ae2bd01e --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart @@ -0,0 +1,109 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/cupertino.dart'; + +import '../../widget_repository.dart'; +import '../database/po/widget_po.dart'; + +/// create by 张风捷特烈 on 2020-03-04 +/// contact me by email 1981462002@qq.com +/// 说明: 组件信息-展示-数据模型 +/// + +const List kTabColors = [ + Color(0xff44D1FD), + Color(0xffFD4F43), + Color(0xffB375FF), + Color(0xFF4CAF50), + Color(0xFFFF9800), + Color(0xFF00F1F1), + Color(0xFFDBD83F), +]; + +class WidgetModel extends Equatable { + final int id; + final String name; + final String nameCN; + final WidgetFamily family; + final bool deprecated; + final bool death; + final List links; + final double lever; + final ImageProvider? image; + final String info; + + String get heroId => 'hero_widget_image_$id'; + + const WidgetModel( + {required this.id, + required this.name, + required this.nameCN, + required this.family, + this.deprecated = false, + this.death = false, + required this.links, + // required this.type, + required this.lever, + this.image, + required this.info}); + + @override + List get props => [id]; + + Color get color => kTabColors[family.index]; + + static WidgetModel fromPo(WidgetPo po) { + return WidgetModel( + id: po.id, + name: po.name, + nameCN: po.nameCN, + family: toFamily(po.family), + image: convertImage(po.name), + lever: po.lever, + deprecated: po.deprecated == 1, + death: po.deprecated == -1, + info: po.info, + links: formatLinkTo(po.linkWidget), + ); + } + + static convertImage(String name) { + // return image.isEmpty ? null : AssetImage(image); + return null; + } + + @override + String toString() { + return 'WidgetModel{id: $id, name: $name, nameCN: $nameCN, family: $family, deprecated: $deprecated, links: $links, lever: $lever, image: $image, info: $info}'; + } + + static List formatLinkTo(String links) { + if (links.isEmpty) { + return []; + } + if (!links.contains(',')) { + return [int.parse(links)]; + } + return links.split(',').map((e) => int.parse(e)).toList(); + } + + static WidgetFamily toFamily(int id) { + switch (id) { + case 0: + return WidgetFamily.stateless; + case 1: + return WidgetFamily.stateful; + case 2: + return WidgetFamily.singleChildRender; + case 3: + return WidgetFamily.multiChildRender; + case 4: + return WidgetFamily.sliver; + case 5: + return WidgetFamily.proxy; + case 6: + return WidgetFamily.other; + default: + return WidgetFamily.stateless; + } + } +} diff --git a/packages/widget_repository/lib/src/category_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/category_repository.dart similarity index 93% rename from packages/widget_repository/lib/src/category_repository.dart rename to modules/widget_system/widget_repository/lib/src/repository/category_repository.dart index c4811b1a..47329190 100644 --- a/packages/widget_repository/lib/src/category_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/category_repository.dart @@ -1,6 +1,6 @@ -import 'model/model.dart'; -import 'package:db_storage/db_storage.dart'; +import '../database/po/category_po.dart'; +import '../model/model.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart new file mode 100644 index 00000000..fe3ff0d0 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart @@ -0,0 +1,12 @@ + +import '../model/model.dart'; + +abstract class NodeRepository{ + + Future> loadNode(int widgetId,{String? locale}); + +} + + + + diff --git a/modules/widget_system/widget_repository/lib/src/repository/repository.dart b/modules/widget_system/widget_repository/lib/src/repository/repository.dart new file mode 100644 index 00000000..2f73ddde --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/repository/repository.dart @@ -0,0 +1,3 @@ +export 'category_repository.dart'; +export 'node_repository.dart'; +export 'widget_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart new file mode 100644 index 00000000..684d9109 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart @@ -0,0 +1,24 @@ + +import '../model/model.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com + +abstract class WidgetRepository { + // Future> loadWidgets(WidgetFamily family); + + Future> loadWidget(List ids,String? locale); + + Future queryWidgetByName(String? name); + + /// 根据 [WidgetFilter] 搜索 [WidgetModel] 列表 + Future> searchWidgets(WidgetFilter args); + + Future toggleLike(int id); + + Future total(WidgetFilter args); + + Future> loadLikeWidgets(); + + Future collected(int id); +} diff --git a/modules/widget_system/widget_repository/lib/widget_repository.dart b/modules/widget_system/widget_repository/lib/widget_repository.dart new file mode 100644 index 00000000..c163d131 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/widget_repository.dart @@ -0,0 +1,7 @@ +library widget_repository; + +export 'src/repository/repository.dart'; +export 'src/memory/memory_node_repository.dart'; +export 'src/memory/memory_widget_repository.dart'; +export 'src/model/model.dart'; +export 'src/database/database.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_repository/pubspec.yaml b/modules/widget_system/widget_repository/pubspec.yaml new file mode 100644 index 00000000..895e78c9 --- /dev/null +++ b/modules/widget_system/widget_repository/pubspec.yaml @@ -0,0 +1,60 @@ +name: widget_repository +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.5.0 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + equatable: ^2.0.5 # 相等辅助 + intl: ^0.19.0 # 相等辅助 + fx_dao: 0.0.3+4 # 数据库 + storage: + path: ../../basic_system/storage + utils: + path: ../../basic_system/utils +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^4.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/modules/widget_system/widget_repository/test/widget_repository_test.dart b/modules/widget_system/widget_repository/test/widget_repository_test.dart new file mode 100644 index 00000000..e69de29b diff --git a/modules/widget_system/widgets/.gitignore b/modules/widget_system/widgets/.gitignore new file mode 100644 index 00000000..a17a495d --- /dev/null +++ b/modules/widget_system/widgets/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ +example/ \ No newline at end of file diff --git a/packages/widgets/.metadata b/modules/widget_system/widgets/.metadata similarity index 100% rename from packages/widgets/.metadata rename to modules/widget_system/widgets/.metadata diff --git a/modules/widget_system/widgets/CHANGELOG.md b/modules/widget_system/widgets/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/widget_system/widgets/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/widget_system/widgets/LICENSE b/modules/widget_system/widgets/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/widget_system/widgets/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/widget_system/widgets/README.md b/modules/widget_system/widgets/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/widget_system/widgets/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/widget_system/widgets/analysis_options.yaml b/modules/widget_system/widgets/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/widget_system/widgets/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json new file mode 100644 index 00000000..b00b56ff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Spaltenlayout", + "info": "Flex-Layout mit vertikaler Ausrichtung, das mehrere Komponenten aufnehmen kann. Alle anderen Eigenschaften sind identisch, siehe Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Grundlegende Verwendung von Column", + "desc": [ + "【children】 : Liste der Komponenten 【List】", + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】 : Textbaseline 【TextBaseline】", + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】 : Hauptachsengröße 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json new file mode 100644 index 00000000..f7250c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Column Layout", + "info": "A Flex layout with a vertical arrangement direction, capable of accommodating multiple components. All other properties are the same, see Flex for details.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Basic Usage of Column", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json new file mode 100644 index 00000000..933b7ab5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Disposición de columna", + "info": "Disposición Flex con dirección vertical, puede contener múltiples componentes. Todas las demás propiedades son iguales, consulte Flex para más detalles.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso básico de Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】 : Línea base del texto 【TextBaseline】", + "【verticalDirection】 : Dirección vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamaño del eje principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json new file mode 100644 index 00000000..105e2a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Disposition en colonne", + "info": "Une disposition Flex avec une orientation verticale, capable de contenir plusieurs composants. Toutes les autres propriétés sont identiques, voir Flex pour plus de détails.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Utilisation de base de Column", + "desc": [ + "【children】 : Liste des composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe secondaire 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json new file mode 100644 index 00000000..b8ca8dff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Layout Colonna", + "info": "Un layout Flex con direzione di disposizione verticale, in grado di contenere più componenti. Tutte le altre proprietà sono le stesse, vedi Flex per maggiori dettagli.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso di base di Column", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json new file mode 100644 index 00000000..a432e054 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "列レイアウト", + "info": "縦方向に配置するFlexレイアウトで、複数のコンポーネントを収容できます。他の属性はすべて同じです。詳細はFlexを参照してください。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Columnの基本的な使用法", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸サイズ 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json new file mode 100644 index 00000000..93f2ed26 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "열 레이아웃", + "info": "세로 방향으로 배열되는 Flex 레이아웃으로, 여러 컴포넌트를 수용할 수 있습니다. 다른 속성은 모두 동일하며, 자세한 내용은 Flex를 참조하십시오.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Column 기본 사용", + "desc": [ + "【children】 : 컴포넌트 목록 【List】", + "【mainAxisAlignment】 : 메인 축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차 축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 세로 방향 【VerticalDirection】", + "【mainAxisSize】 : 메인 축 크기 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json new file mode 100644 index 00000000..937db6d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Layout de Coluna", + "info": "Layout Flex com direção de disposição vertical, pode acomodar vários componentes. Todas as outras propriedades são iguais, consulte Flex para mais detalhes.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso Básico do Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo transversal 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json new file mode 100644 index 00000000..82d8686c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Колонка", + "info": "Гибкий макет с вертикальным направлением размещения, который может содержать несколько компонентов. Все остальные свойства идентичны, подробнее см. Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Основное использование Column", + "desc": [ + "【children】 : Список компонентов 【List】", + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】 : Базовая линия текста 【TextBaseline】", + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】 : Размер главной оси 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json new file mode 100644 index 00000000..5dc8af0c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "列布局", + "info": "排布方向为竖向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Column基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart new file mode 100644 index 00000000..b90694f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class ColumnNode1 extends StatelessWidget { + const ColumnNode1({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildTitle(), + _buildContent(context), + ], + ); + } + + Widget _buildTitle() { + return Container( + height: 70, + color: const Color(0x4484FFFF), + child: Row( + children: const [ + Padding( + child: Icon( + Icons.add_location, + size: 30, + color: Colors.pink, + ), + padding: EdgeInsets.only(left: 25, right: 20), + ), + Expanded( + child: Text( + "附近", + style: TextStyle(fontSize: 18), + ), + ), + Padding( + child: Icon(Icons.keyboard_arrow_right, color: Colors.black38), + padding: EdgeInsets.only(right: 25), + ), + ], + )); + } + + Widget _buildContent(ctx) => Container( + width: MediaQuery.of(ctx).size.width, + color: Colors.orangeAccent, + height: 100, + child: const Icon( + Icons.android, + size: 50, + color: Colors.white, + ), + ); +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json new file mode 100644 index 00000000..0259fe26 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Allgemeines Multi-Kind-Layout", + "info": "Verwenden Sie eine Proxy-Klasse, um das Layout einer Gruppe von Kinderkomponenten zu steuern. Die Kinderkomponenten müssen mit der LayoutId-Komponente gekennzeichnet werden.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Grundlegende Verwendung von CustomMultiChildLayout", + "desc": [ + "【children】 : Kinderkomponentensammlung 【List】", + "【delegate】 : Layout-Proxy 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json new file mode 100644 index 00000000..b93a246d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "General Multi-Child Layout", + "info": "Use a delegate class to control the layout of a set of child components. Child components must be identified using the LayoutId component.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Basic Usage of CustomMultiChildLayout", + "desc": [ + "【children】: Set of child components 【List】", + "【delegate】: Layout delegate 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json new file mode 100644 index 00000000..ab14f34d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Diseño de múltiples hijos genérico", + "info": "Utiliza una clase delegada para controlar el diseño de un conjunto de componentes hijos. Los componentes hijos deben identificarse utilizando el componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso básico de CustomMultiChildLayout", + "desc": [ + "【children】: Conjunto de componentes hijos 【List】", + "【delegate】: Delegado de diseño 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json new file mode 100644 index 00000000..11136463 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Disposition multi-enfants universelle", + "info": "Utilise une classe déléguée pour contrôler la disposition d'un ensemble de composants enfants. Les composants enfants doivent être identifiés à l'aide du composant LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Utilisation de base de CustomMultiChildLayout", + "desc": [ + "【children】 : Ensemble de composants enfants 【List】", + "【delegate】 : Délégué de disposition 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json new file mode 100644 index 00000000..8280c981 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Layout Multi-Figlio Generico", + "info": "Utilizza una classe delegata per controllare il layout di un insieme di componenti figli. I componenti figli devono essere identificati utilizzando il componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso di base di CustomMultiChildLayout", + "desc": [ + "【children】 : Insieme di componenti figli 【List】", + "【delegate】 : Delegato di layout 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json new file mode 100644 index 00000000..fe9199de --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "汎用マルチチャイルドレイアウト", + "info": "プロキシクラスを使用して子コンポーネントセットのレイアウトを制御します。子コンポーネントはLayoutIdコンポーネントで識別する必要があります。", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "CustomMultiChildLayoutの基本使用", + "desc": [ + "【children】 : 子コンポーネントセット 【List】", + "【delegate】 : レイアウトプロキシ 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json new file mode 100644 index 00000000..c21b9496 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "일반 다중 자식 레이아웃", + "info": "프록시 클래스를 사용하여 자식 위젯 집합의 레이아웃을 제어하며, 자식 위젯은 LayoutId 위젯으로 식별되어야 합니다.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "CustomMultiChildLayout 기본 사용", + "desc": [ + "【children】 : 자식 위젯 집합 【List】", + "【delegate】 : 레이아웃 프록시 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json new file mode 100644 index 00000000..09a840f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Layout Multi-Filho Personalizado", + "info": "Usa uma classe delegada para controlar o layout de um conjunto de componentes filhos, os componentes filhos devem ser identificados usando o componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso Básico do CustomMultiChildLayout", + "desc": [ + "【children】 : Conjunto de componentes filhos 【List】", + "【delegate】 : Delegado de layout 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json new file mode 100644 index 00000000..ad443c2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Универсальная компоновка с несколькими дочерними элементами", + "info": "Использует класс-делегат для управления компоновкой набора дочерних элементов, дочерние элементы должны быть идентифицированы с помощью компонента LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Основное использование CustomMultiChildLayout", + "desc": [ + "【children】 : Набор дочерних элементов 【List】", + "【delegate】 : Делегат компоновки 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json new file mode 100644 index 00000000..20f89055 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "通用多子布局", + "info": "使用一个代理类对子组件集进行布局控制,子组件必须使用LayoutId组件进行标识。", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "CustomMultiChildLayout基本使用", + "desc": [ + "【children】 : 子组件集 【List】", + "【delegate】 : 布局代理 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart new file mode 100644 index 00000000..136fdf64 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/6 +/// contact me by email 1981462002@qq.com + + + +class CustomMultiChildLayoutNode1 extends StatelessWidget { + const CustomMultiChildLayoutNode1({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: 300, + height: 150, + color: Colors.grey.withAlpha(33), + child: CustomMultiChildLayout( + delegate: CornerCustomMultiChildLayout( + padding:const EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5), + ), + children: [ + LayoutId(id: CornerType.topLeft, child: const Box50(Colors.red)), + LayoutId(id: CornerType.topRight, child: const Box50(Colors.yellow)), + LayoutId(id: CornerType.bottomLeft, child: const Box50(Colors.blue)), + LayoutId(id: CornerType.bottomRight, child: const Box50(Colors.green)), + ], + ), + ); + } +} + +// 50 颜色盒 +class Box50 extends StatelessWidget { + final Color color; + const Box50(this.color, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: 50, + height: 50, + color: color, + ); + } +} + + +enum CornerType{ + topLeft, + topRight, + bottomLeft, + bottomRight +} + + +class CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{ + final EdgeInsets padding; + + CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero}); + + @override + void performLayout(Size size) { + if (hasChild(CornerType.topLeft)) { + layoutChild(CornerType.topLeft, BoxConstraints.loose(size)); + positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top)); + } + if (hasChild(CornerType.topRight)) { + var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size)); + positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top)); + } + if (hasChild(CornerType.bottomLeft)) { + var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size)); + positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom)); + } + if (hasChild(CornerType.bottomRight)) { + var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size)); + positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom)); + } + } + + @override + bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding; + +} + diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json new file mode 100644 index 00000000..fa3418e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Flexibles Layout", + "info": "Übergeordnete Klasse von Row und Column, die leistungsstärkste Layout-Methode in Flutter. Kann mehrere Komponenten aufnehmen und kann mit Spacer, Expended, Flexible Komponenten für flexibles Layout verwendet werden", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Ausrichtung von Flex", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【direction】 : Richtung 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Hauptachsenausrichtung von Flex", + "desc": [ + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Kreuzachsenausrichtung von Flex", + "desc": [ + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Vertikale Richtungsreihenfolge von Flex", + "desc": [ + "【verticalDirection】 : Vertikale Richtungsreihenfolge 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Horizontale Richtungsreihenfolge von Flex", + "desc": [ + "【textDirection】 : Horizontale Richtungsreihenfolge 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json new file mode 100644 index 00000000..75a4dfa9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Flex Layout", + "info": "The parent class of Row and Column, the most powerful layout method in Flutter. It can accommodate multiple components and can be used in conjunction with Spacer, Expended, and Flexible components for flexible layout.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flex Direction", + "desc": [ + "【children】: Component list 【List】", + "【direction】: Direction 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex Main Axis Alignment", + "desc": [ + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex Cross Axis Alignment", + "desc": [ + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex Vertical Direction", + "desc": [ + "【verticalDirection】: Vertical direction 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex Horizontal Direction", + "desc": [ + "【textDirection】: Horizontal direction 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json new file mode 100644 index 00000000..1936f39c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Diseño Flexible", + "info": "Clase padre de Row y Column, el método de diseño más potente en Flutter. Puede contener múltiples componentes y se puede usar con los componentes Spacer, Expended y Flexible para un diseño flexible.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Dirección de disposición de Flex", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【direction】 : Dirección 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alineación del eje principal de Flex", + "desc": [ + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alineación del eje transversal de Flex", + "desc": [ + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Orden de dirección vertical de Flex", + "desc": [ + "【verticalDirection】 : Orden de dirección vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Orden de dirección horizontal de Flex", + "desc": [ + "【textDirection】 : Orden de dirección horizontal 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json new file mode 100644 index 00000000..0a6f6f78 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Disposition flexible", + "info": "Classe parente de Row et Column, la méthode de disposition la plus puissante dans Flutter. Peut contenir plusieurs composants, peut être utilisé avec les composants Spacer, Expended, Flexible pour une disposition flexible", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direction de disposition de Flex", + "desc": [ + "【children】 : Liste des composants 【List】", + "【direction】 : Direction 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alignement de l'axe principal de Flex", + "desc": [ + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alignement de l'axe transversal de Flex", + "desc": [ + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordre de direction vertical de Flex", + "desc": [ + "【verticalDirection】 : Ordre de direction vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordre de direction horizontale de Flex", + "desc": [ + "【textDirection】 : Ordre de direction horizontale 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json new file mode 100644 index 00000000..a38b4033 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Layout Flessibile", + "info": "Classe genitore di Row e Column, il metodo di layout più potente in Flutter. Può contenere più componenti e può essere utilizzato con i componenti Spacer, Expended e Flexible per un layout flessibile", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direzione di disposizione di Flex", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【direction】 : Direzione 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Allineamento dell'asse principale di Flex", + "desc": [ + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Allineamento dell'asse trasversale di Flex", + "desc": [ + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordine della direzione verticale di Flex", + "desc": [ + "【verticalDirection】 : Ordine della direzione verticale 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordine della direzione orizzontale di Flex", + "desc": [ + "【textDirection】 : Ordine della direzione orizzontale 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json new file mode 100644 index 00000000..37e83a2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "フレックスレイアウト", + "info": "RowとColumnの親クラス、Flutterで最も強力なレイアウト方法。複数のコンポーネントを収容でき、Spacer、Expended、Flexibleコンポーネントと連携して柔軟なレイアウトを実現できます", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flexの配置方向", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【direction】 : 方向 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex主軸の整列方法", + "desc": [ + "【mainAxisAlignment】 : 主軸整列 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex交差軸の整列方法", + "desc": [ + "【crossAxisAlignment】 : 交差軸整列 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex垂直方向の順序", + "desc": [ + "【verticalDirection】 : 垂直方向の順序 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex水平方向の順序", + "desc": [ + "【textDirection】 : 水平方向の順序 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json new file mode 100644 index 00000000..a0c89888 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "유연한 레이아웃", + "info": "Row와 Column의 상위 클래스, Flutter에서 가장 강력한 레이아웃 방식. 여러 컴포넌트를 수용할 수 있으며, Spacer, Expended, Flexible 컴포넌트와 함께 사용하여 유연한 레이아웃을 구성할 수 있습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flex의 배치 방향", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【direction】 : 방향 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex 주축 정렬 방식", + "desc": [ + "【mainAxisAlignment】 : 주축 정렬 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex 교차축 정렬 방식", + "desc": [ + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex 수직 방향 순서", + "desc": [ + "【verticalDirection】 : 수직 방향 순서 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex 수평 방향 순서", + "desc": [ + "【textDirection】 : 수평 방향 순서 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json new file mode 100644 index 00000000..022b95f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Layout Flexível", + "info": "Classe pai de Row e Column, o método de layout mais poderoso no Flutter. Pode conter vários componentes e pode ser usado em conjunto com os componentes Spacer, Expended e Flexible para um layout flexível", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direção de disposição do Flex", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【direction】 : Direção 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alinhamento do eixo principal do Flex", + "desc": [ + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alinhamento do eixo cruzado do Flex", + "desc": [ + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordem vertical do Flex", + "desc": [ + "【verticalDirection】 : Ordem vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordem horizontal do Flex", + "desc": [ + "【textDirection】 : Ordem horizontal 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json new file mode 100644 index 00000000..4eeff29d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Гибкий макет", + "info": "Родительский класс для Row и Column, самый мощный способ компоновки во Flutter. Может содержать несколько компонентов, может использоваться вместе с компонентами Spacer, Expended, Flexible для гибкой компоновки", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Направление расположения Flex", + "desc": [ + "【children】 : Список компонентов 【List】", + "【direction】 : Направление 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Выравнивание по главной оси Flex", + "desc": [ + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Выравнивание по поперечной оси Flex", + "desc": [ + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Порядок по вертикали Flex", + "desc": [ + "【verticalDirection】 : Порядок по вертикали 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Порядок по горизонтали Flex", + "desc": [ + "【textDirection】 : Порядок по горизонтали 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json new file mode 100644 index 00000000..f4dc4817 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "弹性布局", + "info": "Row和Column的父类,Flutter中最强大的布局方式。可容纳多个组件,可与Spacer、Expended、Flexible组件联用进行灵活布局", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flex的排布方向", + "desc": [ + "【children】 : 组件列表 【List】", + "【direction】 : 方向 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex主轴对齐方式", + "desc": [ + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex交叉轴对齐方式", + "desc": [ + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex垂直方向顺序", + "desc": [ + "【verticalDirection】 : 垂直方向顺序 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex水平方向顺序", + "desc": [ + "【textDirection】 : 水平方向顺序 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart new file mode 100644 index 00000000..06c2d13f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class FlexNode1 extends StatelessWidget { + const FlexNode1({super.key}); + + static TextStyle textStyle = + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); + + Widget get blueBox => Container( + alignment: Alignment.center, + color: Colors.blue, + height: 20, + width: 30, + child: Text('1', style: textStyle), + ); + + Widget get redBox => Container( + alignment: Alignment.center, + color: Colors.red, + height: 30, + width: 40, + child: Text('2', style: textStyle), + ); + + Widget get greenBox => Container( + alignment: Alignment.center, + color: Colors.green, + height: 20, + width: 20, + child: Text('3', style: textStyle), + ); + + @override + Widget build(BuildContext context) { + return Wrap( + children: Axis.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 80, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget _buildItem(mode) => Flex( + direction: mode, + children: [ + blueBox, redBox, greenBox + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart new file mode 100644 index 00000000..e5f0b0f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class FlexNode2 extends StatelessWidget { + const FlexNode2({super.key}); + + static TextStyle textStyle = + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); + + Widget get blueBox => Container( + alignment: Alignment.center, + color: Colors.blue, + height: 20, + width: 30, + child: Text('1', style: textStyle), + ); + + Widget get redBox => Container( + alignment: Alignment.center, + color: Colors.red, + height: 30, + width: 40, + child: Text('2', style: textStyle), + ); + + Widget get greenBox => Container( + alignment: Alignment.center, + color: Colors.green, + height: 20, + width: 20, + child: Text('3', style: textStyle), + ); + + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 5, + children: MainAxisAlignment.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 80, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget _buildItem(mode) => Flex( + direction: Axis.horizontal, + mainAxisAlignment: mode, + children: [ + blueBox, redBox, greenBox + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart new file mode 100644 index 00000000..417772e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class FlexNode3 extends StatelessWidget { + const FlexNode3({super.key}); + + static TextStyle textStyle = + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); + + Widget get blueBox => Container( + alignment: Alignment.center, + color: Colors.blue, + height: 20, + width: 30, + child: Text('1', style: textStyle), + ); + + Widget get redBox => Container( + alignment: Alignment.center, + color: Colors.red, + height: 30, + width: 40, + child: Text('2', style: textStyle), + ); + + Widget get greenBox => Container( + alignment: Alignment.center, + color: Colors.green, + height: 20, + width: 20, + child: Text('3', style: textStyle), + ); + + + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 5, + children: CrossAxisAlignment.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 80, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget _buildItem(mode) => Flex( + direction: Axis.horizontal, + crossAxisAlignment: mode, + textBaseline: TextBaseline.alphabetic, + children: [ + blueBox, redBox, greenBox + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart new file mode 100644 index 00000000..154f280f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class FlexNode4 extends StatelessWidget { + const FlexNode4({super.key}); + + static TextStyle textStyle = + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); + + Widget get blueBox => Container( + alignment: Alignment.center, + color: Colors.blue, + height: 20, + width: 30, + child: Text('1', style: textStyle), + ); + + Widget get redBox => Container( + alignment: Alignment.center, + color: Colors.red, + height: 30, + width: 40, + child: Text('2', style: textStyle), + ); + + Widget get greenBox => Container( + alignment: Alignment.center, + color: Colors.green, + height: 20, + width: 20, + child: Text('3', style: textStyle), + ); + + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 5, + children: VerticalDirection.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 80, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget _buildItem(mode) => Flex( + direction: Axis.vertical, + verticalDirection: mode, + children: [blueBox, redBox, greenBox], + ); +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart new file mode 100644 index 00000000..39e35fc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class FlexNode5 extends StatelessWidget { + const FlexNode5({super.key}); + + static TextStyle textStyle = + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); + + Widget get blueBox => Container( + alignment: Alignment.center, + color: Colors.blue, + height: 20, + width: 30, + child: Text('1', style: textStyle), + ); + + Widget get redBox => Container( + alignment: Alignment.center, + color: Colors.red, + height: 30, + width: 40, + child: Text('2', style: textStyle), + ); + + Widget get greenBox => Container( + alignment: Alignment.center, + color: Colors.green, + height: 20, + width: 20, + child: Text('3', style: textStyle), + ); + + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 5, + children: TextDirection.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 80, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget _buildItem(mode) => Flex( + direction: Axis.horizontal, + textDirection: mode, + children: [blueBox, redBox, greenBox], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json new file mode 100644 index 00000000..9b39ec33 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Fließendes Layout", + "info": "Kann mehrere Komponenten aufnehmen, erfordert die Festlegung eines Delegaten für die Anordnung, ermöglicht eine hochgradige Anpassung der Komponentenanordnung und erreicht Effekte, die mit normalen Layouts nicht möglich sind. Der König der Layouts, zu Recht.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Runde Anordnung mit Flow", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【delegate】 : Delegat 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Runde Anordnung mit Flow und Animation", + "desc": [ + "Erzielt Effekte durch die Änderung der Position umliegender Komponenten mittels Animation" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json new file mode 100644 index 00000000..890475c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Flow Layout", + "info": "Can accommodate multiple components, requires custom arrangement agents, allows high customization of component arrangement, achieving effects that ordinary layouts cannot. The king of layouts, well-deserved.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow Circular Arrangement", + "desc": [ + "【children】: Component list 【List】", + "【delegate】: Agent 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow Circular with Animation", + "desc": [ + "Achieve effects by changing the position of surrounding components through animation" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json new file mode 100644 index 00000000..aa0a65f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Diseño de flujo", + "info": "Puede contener múltiples componentes, requiere que especifiques un delegado para la disposición, permite una alta personalización en la distribución de los componentes, logrando efectos que los diseños comunes no pueden alcanzar. El rey de los diseños, sin duda.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposición circular de Flow", + "desc": [ + "【children】: Lista de componentes 【List】", + "【delegate】: Delegado 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinación de Flow circular con animación", + "desc": [ + "Logra el efecto cambiando la posición de los componentes circundantes a través de la animación" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json new file mode 100644 index 00000000..c7bbb208 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Disposition fluide", + "info": "Peut contenir plusieurs composants, nécessite de définir un délégué pour l'agencement, permet une personnalisation élevée de l'agencement des composants, atteignant des effets impossibles avec des dispositions ordinaires. Le roi des dispositions, sans aucun doute.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposition circulaire Flow", + "desc": [ + "【children】 : Liste des composants 【List】", + "【delegate】 : Délégué 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinaison de Flow circulaire et animation", + "desc": [ + "Modifier la position des composants environnants via une animation pour obtenir l'effet" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json new file mode 100644 index 00000000..1bb53fc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Layout di Flusso", + "info": "Può contenere più componenti, richiede la definizione di un delegato per la disposizione, permette un alto livello di personalizzazione della disposizione dei componenti, raggiungendo effetti che i layout comuni non possono ottenere. Il re dei layout, a pieno titolo.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposizione Circolare di Flow", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【delegate】 : Delegato 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinazione di Flow Circolare e Animazione", + "desc": [ + "Modifica la posizione dei componenti circostanti attraverso l'animazione per ottenere l'effetto desiderato" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json new file mode 100644 index 00000000..37f10f4c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "フローレイアウト", + "info": "複数のコンポーネントを収容でき、自身で配置のプロキシを指定する必要があります。コンポーネントの配置を高度にカスタマイズでき、通常のレイアウトでは実現できない効果を実現します。レイアウトの王者、その名にふさわしい。", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow円形配置", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【delegate】 : プロキシ 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow円形とアニメーションの組み合わせ", + "desc": [ + "アニメーションを使用して周囲のコンポーネントの位置を変更することで効果を実現" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json new file mode 100644 index 00000000..ae91c33a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "플로우 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 배치를 위한 대리자를 직접 지정해야 합니다. 컴포넌트 배치를 고도로 커스터마이징할 수 있어 일반 레이아웃으로는 달성할 수 없는 효과를 구현할 수 있습니다. 레이아웃의 왕, 그 이름에 걸맞습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow 원형 배치", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【delegate】 : 대리자 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow 원형과 애니메이션 결합", + "desc": [ + "애니메이션을 통해 주변 컴포넌트의 위치를 변경하여 효과를 구현" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json new file mode 100644 index 00000000..c7149aff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Layout de Fluxo", + "info": "Pode acomodar vários componentes, é necessário definir um agente de disposição, permitindo uma alta personalização da disposição dos componentes, alcançando efeitos que layouts comuns não conseguem. O rei dos layouts, sem dúvida.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposição Circular do Flow", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【delegate】 : Agente 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinação de Flow Circular com Animação", + "desc": [ + "Alterar a posição dos componentes ao redor através de animação para alcançar o efeito" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json new file mode 100644 index 00000000..b280e78f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Макет потока", + "info": "Может вмещать несколько компонентов, требует самостоятельного определения прокси для размещения, позволяет высоко настраивать расположение компонентов, достигая эффектов, недоступных для обычных макетов. Безусловный король макетов.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Круговое расположение Flow", + "desc": [ + "【children】 : Список компонентов 【List】", + "【delegate】 : Прокси 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Круговое расположение Flow с анимацией", + "desc": [ + "Достижение эффекта путем изменения положения окружающих компонентов с помощью анимации" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json new file mode 100644 index 00000000..d448bc13 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "流动布局", + "info": "可容纳多个组件, 需要自己制定排布的代理,可以高强度自定义组件的排布,实现普通布局无法达到的效果。布局王者,当之无愧。", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow圆形排布", + "desc": [ + "【children】 : 组件列表 【List】", + "【delegate】 : 代理 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow圆形与动画结合", + "desc": [ + "通过动画来更改周围组件的位置实现效果" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart new file mode 100644 index 00000000..dca7b68e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart @@ -0,0 +1,54 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class FlowNode1 extends StatelessWidget { + const FlowNode1({super.key}); + + List get data => List.generate( + 16, + (index) => index.isEven + ? "assets/images/icon_head.webp" + : "assets/images/wy_300x200.webp"); + + @override + Widget build(BuildContext context) { + return Container( + width: 300, + height: 300, + alignment: Alignment.center, + child: Flow( + delegate: _CircleFlowDelegate(), + children: data + .map((e) => CircleAvatar(backgroundImage: AssetImage(e))) + .toList(), + ), + ); + } +} + +class _CircleFlowDelegate extends FlowDelegate { + + @override //绘制孩子的方法 + void paintChildren(FlowPaintingContext context) { + final double radius = context.size.shortestSide / 2; + final int count = context.childCount; + final double perRad = 2 * pi / count; + for (int i = 0; i < count; i++) { + final Size size = context.getChildSize(i) ?? Size.zero; + final double offsetX = + (radius - size.width / 2) * cos(i * perRad) + radius; + final double offsetY = + (radius - size.height / 2) * sin(i * perRad) + radius; + context.paintChild(i, + transform: Matrix4.translationValues( + offsetX - size.width / 2, offsetY - size.height / 2, 0.0)); + } + } + + @override + bool shouldRepaint(FlowDelegate oldDelegate) => false; +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart new file mode 100644 index 00000000..4dc644f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart @@ -0,0 +1,100 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class FlowNode02 extends StatefulWidget { + const FlowNode02({ + super.key, + }); + + @override + State createState() => _FlowNode02State(); +} + +class _FlowNode02State extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + double _rad = 0.0; + bool _closed = true; + + List get data => List.generate( + 16, + (index) => index.isEven + ? "assets/images/icon_head.webp" + : "assets/images/wy_300x200.webp"); + + @override + void initState() { + _controller = AnimationController( + duration: const Duration(milliseconds: 1000), + vsync: this, + ) + ..addListener(() => setState( + () => _rad = (_closed ? (_controller.value) : 1 - _controller.value))) + ..addStatusListener((status) { + if (status == AnimationStatus.completed) { + _closed = !_closed; + } + }); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Flow( + delegate: _BurstFlowDelegate(_rad), + children: [ + ...data.map((e) => CircleAvatar(backgroundImage: AssetImage(e))), + InkWell( + onTap: () { + _controller.reset(); + _controller.forward(); + }, + child: const CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp'), + )) + ], + ); + } +} + +class _BurstFlowDelegate extends FlowDelegate { + final double rad; + + _BurstFlowDelegate(this.rad); + + @override //绘制孩子的方法 + void paintChildren(FlowPaintingContext context) { + double radius = context.size.shortestSide / 2; + final int count = context.childCount - 1; + final double perRad = 2 * pi / count; + for (int i = 0; i < count; i++) { + Size size = context.getChildSize(i) ?? Size.zero; + final double offsetX = + rad * (radius - size.width / 2) * cos(i * perRad) + radius; + final double offsetY = + rad * (radius - size.height / 2) * sin(i * perRad) + radius; + context.paintChild(i, + transform: Matrix4.translationValues( + offsetX - size.width / 2, offsetY - size.height / 2, 0.0)); + } + + Size size = context.getChildSize(context.childCount - 1) ?? Size.zero; + + context.paintChild(context.childCount - 1, + transform: Matrix4.translationValues( + radius - size.width / 2, radius - size.height / 2, 0.0)); + } + + @override + bool shouldRepaint(_BurstFlowDelegate oldDelegate) => oldDelegate.rad != rad; +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json new file mode 100644 index 00000000..f4efeef8 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Indexierter Stapel", + "info": "Unterklasse der Stack-Komponente, kann mehrere Komponenten stapeln und durch den Index die anzuzeigende Komponente angeben, die anderen werden ausgeblendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IndexedStack", + "desc": [ + "【children】 : Liste der Unterkomponenten 【Lis】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【index】 : Aktuell angezeigte Komponente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json new file mode 100644 index 00000000..e25fb5f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Indexed Stack", + "info": "A subclass of the Stack component that can stack multiple components and specify the index of the component to be displayed, while the rest are hidden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IndexedStack", + "desc": [ + "【children】: List of child components 【List】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【index】: Currently displayed component 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json new file mode 100644 index 00000000..48b4714a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pila indexada", + "info": "Subclase del componente Stack, puede apilar múltiples componentes y especificar el índice del componente que se mostrará a través del índice, el resto se ocultará.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IndexedStack", + "desc": [ + "【children】 : Lista de componentes hijos 【Lis】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【index】 : Componente actualmente visible 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json new file mode 100644 index 00000000..8eb40e30 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Empilement indexé", + "info": "Sous-classe du composant Stack, permet d'empiler plusieurs composants et de spécifier l'index du composant à afficher via l'index, les autres seront masqués.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IndexedStack", + "desc": [ + "【children】 : Liste des composants enfants 【Lis】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【index】 : Composant actuellement affiché 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json new file mode 100644 index 00000000..b153327d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pila indicizzata", + "info": "Sottoclasse del componente Stack, può impilare più componenti e specificare l'indice del componente da visualizzare tramite index, gli altri verranno nascosti.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IndexedStack", + "desc": [ + "【children】 : Lista dei componenti figli 【Lis】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【index】 : Componente attualmente visualizzato 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json new file mode 100644 index 00000000..74da171b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "インデックススタック", + "info": "Stackコンポーネントのサブクラスで、複数のコンポーネントをスタックし、indexを指定して表示するコンポーネントを指定できます。それ以外のコンポーネントは非表示になります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStackの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【Lis】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【index】 : 現在表示されているコンポーネント 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json new file mode 100644 index 00000000..6352262c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "인덱스 스택", + "info": "Stack 컴포넌트의 하위 클래스로, 여러 컴포넌트를 쌓아 놓고 index를 통해 표시할 컴포넌트의 인덱스를 지정할 수 있으며, 나머지는 숨겨집니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStack 기본 사용", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【Lis】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【index】 : 현재 표시되는 컴포넌트 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json new file mode 100644 index 00000000..f785b891 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pilha Indexada", + "info": "Subclasse do componente Stack, pode empilhar vários componentes e especificar o índice do componente a ser exibido através do index, os restantes serão ocultados.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do IndexedStack", + "desc": [ + "【children】 : Lista de componentes filhos 【Lis】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【index】 : Componente atualmente exibido 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json new file mode 100644 index 00000000..bb8625ec --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Индексированный стек", + "info": "Подкласс компонента Stack, который позволяет складывать несколько компонентов и указывать индекс отображаемого компонента через index, остальные будут скрыты.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IndexedStack", + "desc": [ + "【children】 : Список дочерних компонентов 【Lis】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【index】 : Текущий отображаемый компонент 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json new file mode 100644 index 00000000..c3d9fe37 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "索引堆叠", + "info": "Stack组件的子类,可以堆叠多个组件,并通过index来指定展示的组件索引,其余的会被隐藏。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStack基本使用", + "desc": [ + "【children】 : 子组件列表 【Lis】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【index】 : 当前显示组件 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart new file mode 100644 index 00000000..aa33f43c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class IndexedStackNode01 extends StatefulWidget { + const IndexedStackNode01({Key? key}) : super(key: key); + + @override + State createState() => _IndexedStackNode01State(); +} + +class _IndexedStackNode01State extends State { + int _index = 1; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + width: 200, + height: 100, + color: Colors.grey.withAlpha(33), + child: IndexedStack( + index: _index, + children: [ + Container( + color: Colors.red, + width: 80, + height: 80 + ), + Positioned( + bottom: 10, + right: 10, + child: Container( + color: Colors.blue, + width: 80, + height: 80, + ), + ) + ], + ), + ), + ], + ); + } + + Widget _buildSwitch() => Switch( + value: _index == 0, + onChanged: (v) => setState(() => _index = v ? 0 : 1), + ); +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json new file mode 100644 index 00000000..17a86062 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Listenkörper", + "info": "Ordnet mehrere Unterkomponenten entlang einer Achse an, hat wenige einstellbare Attribute und wird selten verwendet, stattdessen wird meist ListView bevorzugt.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListView", + "desc": [ + "【mainAxis】: Hauptachsenrichtung 【Axis】", + "【reverse】: Umgekehrt oder nicht 【bool】", + "【children】: Sammlung von Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json new file mode 100644 index 00000000..33f49ae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "List Body", + "info": "Arranges several child components along the axis, with few properties that can be set. It is rarely used, and ListView is generally chosen instead.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListView", + "desc": [ + "【mainAxis】: Main axis direction 【Axis】", + "【reverse】: Whether to reverse 【bool】", + "【children】: Child component collection 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json new file mode 100644 index 00000000..11dc24b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Cuerpo de la lista", + "info": "Organiza varios subcomponentes a lo largo de un eje, con pocas propiedades configurables, generalmente se usa poco y se prefiere usar ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListView", + "desc": [ + "【mainAxis】 : Dirección del eje principal 【Axis】", + "【reverse】: Si es inverso 【bool】", + "【children】: Conjunto de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json new file mode 100644 index 00000000..8627f731 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corps de liste", + "info": "Dispose plusieurs sous-composants selon un axe, avec peu de propriétés configurables, rarement utilisé, on préfère généralement utiliser ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListView", + "desc": [ + "【mainAxis】 : Direction de l'axe principal 【Axis】", + "【reverse】: Inverser ou non 【bool】", + "【children】: Ensemble de sous-composants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json new file mode 100644 index 00000000..0034881b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corpo della lista", + "info": "Dispone diversi componenti figli lungo un asse, con poche proprietà configurabili. Viene utilizzato raramente, preferendo invece l'uso di ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListView", + "desc": [ + "【mainAxis】 : Direzione dell'asse principale 【Axis】", + "【reverse】: Inversione 【bool】", + "【children】: Insieme di componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json new file mode 100644 index 00000000..988ec58b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "リストボディ", + "info": "複数の子コンポーネントを軸方向に並べ替えます。設定可能な属性は少なく、通常はあまり使用されず、代わりにListViewが選択されます。", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListViewの基本的な使用", + "desc": [ + "【mainAxis】 : 主軸方向 【Axis】", + "【reverse】: 逆方向かどうか 【bool】", + "【children】: 子コンポーネント集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json new file mode 100644 index 00000000..53f44f10 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "리스트 바디", + "info": "여러 하위 컴포넌트를 축 방향으로 배열하며, 설정 가능한 속성이 적어 일반적으로 잘 사용되지 않고, 대신 ListView를 선택하여 사용합니다.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView의 기본 사용법", + "desc": [ + "【mainAxis】 : 주축 방향 【Axis】", + "【reverse】: 역방향 여부 【bool】", + "【children】: 하위 컴포넌트 집합 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json new file mode 100644 index 00000000..0d9afb7f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corpo da Lista", + "info": "Organiza vários subcomponentes ao longo de um eixo, com poucas propriedades configuráveis, geralmente pouco utilizado, optando-se por usar ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ListView", + "desc": [ + "【mainAxis】 : Direção do eixo principal 【Axis】", + "【reverse】: Se é invertido 【bool】", + "【children】: Conjunto de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json new file mode 100644 index 00000000..527c1623 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Тело списка", + "info": "Располагает несколько дочерних компонентов по оси, имеет мало настраиваемых свойств, обычно редко используется, вместо этого выбирают ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListView", + "desc": [ + "【mainAxis】 : Направление основной оси 【Axis】", + "【reverse】: Обратное направление 【bool】", + "【children】: Набор дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json new file mode 100644 index 00000000..f870d8fe --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "列表体", + "info": "将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListView。", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView的基本使用", + "desc": [ + "【mainAxis】 : 主轴方向 【Axis】", + "【reverse】: 是否反向 【bool】", + "【children】: 子组件集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart new file mode 100644 index 00000000..1529b12a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/2 +/// contact me by email 1981462002@qq.com + + +class ListBodyDemo extends StatelessWidget { + const ListBodyDemo({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: ListView( + children: [ + ListBody( + mainAxis: Axis.vertical, + reverse: false, + children: [ + Container(color: Colors.red, height: 50.0,), + Container(color: Colors.orange, height: 50.0,), + Container(color: Colors.yellow, height: 50.0,), + ], + ), + Container(color: Colors.green, height: 80.0,), + ListBody( + mainAxis: Axis.vertical, + reverse: false, + children: [ + Container(color: Colors.blue, height: 50.0,), + Container(color: Colors.indigo, height: 50.0,), + Container(color: Colors.purple, height: 50.0,), + ], + ) + ] + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json new file mode 100644 index 00000000..1ac51904 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Verschachtelter Scroll-Viewport", + "info": "Ein in NestedScrollView verwendeter Viewport, der ein SliverOverlapAbsorberHandle enthält und es benachrichtigt, wenn der Viewport sein Layout neu berechnen muss. Zum Beispiel, wenn es gescrollt wird.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in NestedScrollViewViewport", + "desc": [ + "【offset】 : *Versatz 【ViewportOffset】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【crossAxisDirection】 : Querachsenrichtung 【AxisDirection】", + "【slivers】 : Unterkomponenten 【List】", + "【clipBehavior】 : Abschneideverhalten 【Clip】", + "【anchor】 : Ankerpunkt 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json new file mode 100644 index 00000000..6ee55a66 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Nested Scroll Viewport", + "info": "A viewport used in NestedScrollView, which holds a SliverOverlapAbsorberHandle and notifies it when the viewport needs to recalculate its layout. For example, when scrolling it.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to NestedScrollViewViewport", + "desc": [ + "【offset】 : *Offset 【ViewportOffset】", + "【handle】 : *Handle 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : Axis Direction 【AxisDirection】", + "【crossAxisDirection】 : Cross Axis Direction 【AxisDirection】", + "【slivers】 : Child Components 【List】", + "【clipBehavior】 : Clip Behavior 【Clip】", + "【anchor】 : Anchor 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json new file mode 100644 index 00000000..139e1c8c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Ventana de desplazamiento anidado", + "info": "Ventana utilizada en NestedScrollView que contiene un SliverOverlapAbsorberHandle y lo notifica cuando la ventana necesita recalcular su diseño. Por ejemplo, cuando se desplaza.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a NestedScrollViewViewport", + "desc": [ + "【offset】 : *desplazamiento 【ViewportOffset】", + "【handle】 : *manejador 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : dirección del eje 【AxisDirection】", + "【crossAxisDirection】 : dirección del eje cruzado 【AxisDirection】", + "【slivers】 : componentes hijos 【List】", + "【clipBehavior】 : comportamiento de recorte 【Clip】", + "【anchor】 : punto de anclaje 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json new file mode 100644 index 00000000..89464bb1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Vue de défilement imbriquée", + "info": "Une vue utilisée dans NestedScrollView, qui détient un SliverOverlapAbsorberHandle et le notifie lorsque la vue a besoin de recalculer sa disposition. Par exemple, lors du défilement.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à NestedScrollViewViewport", + "desc": [ + "【offset】 : *décalage 【ViewportOffset】", + "【handle】 : *gestionnaire 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direction de l'axe 【AxisDirection】", + "【crossAxisDirection】 : direction de l'axe croisé 【AxisDirection】", + "【slivers】 : composants enfants 【List】", + "【clipBehavior】 : comportement de découpage 【Clip】", + "【anchor】 : point d'ancrage 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json new file mode 100644 index 00000000..8aebc164 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Vista scorrevole annidata", + "info": "Vista utilizzata in NestedScrollView, che detiene SliverOverlapAbsorberHandle e lo notifica quando la vista necessita di ricalcolare il layout. Ad esempio, quando viene scorsa.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a NestedScrollViewViewport", + "desc": [ + "【offset】 : *offset 【ViewportOffset】", + "【handle】 : *gestore 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direzione dell'asse 【AxisDirection】", + "【crossAxisDirection】 : direzione dell'asse incrociato 【AxisDirection】", + "【slivers】 : componenti figli 【List】", + "【clipBehavior】 : comportamento di ritaglio 【Clip】", + "【anchor】 : punto di ancoraggio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json new file mode 100644 index 00000000..3d54dbd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "ネストされたスクロールビューポート", + "info": "NestedScrollView で使用されるビューポートで、このビューポートは SliverOverlapAbsorberHandle を保持し、ビューポートがレイアウトを再計算する必要があるときに通知します。例えば、スクロールするときなどです。", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport の紹介", + "desc": [ + "【offset】 : *オフセット 【ViewportOffset】", + "【handle】 : *ハンドル 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【crossAxisDirection】 : 交差軸方向 【AxisDirection】", + "【slivers】 : 子コンポーネント 【List】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【anchor】 : アンカー 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json new file mode 100644 index 00000000..832a8215 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "중첩 스크롤 뷰포트", + "info": "NestedScrollView에서 사용되는 뷰포트로, 이 뷰포트는 SliverOverlapAbsorberHandle을 보유하고 있으며, 뷰포트가 레이아웃을 다시 계산해야 할 때 이를 알립니다. 예를 들어, 스크롤할 때.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 소개", + "desc": [ + "【offset】 : *오프셋 【ViewportOffset】", + "【handle】 : *핸들러 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【crossAxisDirection】 : 교차 축 방향 【AxisDirection】", + "【slivers】 : 자식 위젯 【List】", + "【clipBehavior】 : 클립 동작 【Clip】", + "【anchor】 : 앵커 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json new file mode 100644 index 00000000..972d7304 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Porto de Rolagem Aninhado", + "info": "Porto utilizado no NestedScrollView, que detém o SliverOverlapAbsorberHandle e notifica-o quando o porto precisa recalcular o layout. Por exemplo, quando é rolado.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao NestedScrollViewViewport", + "desc": [ + "【offset】 : *deslocamento 【ViewportOffset】", + "【handle】 : *manipulador 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direção do eixo 【AxisDirection】", + "【crossAxisDirection】 : direção do eixo cruzado 【AxisDirection】", + "【slivers】 : componentes filhos 【List】", + "【clipBehavior】 : comportamento de corte 【Clip】", + "【anchor】 : âncora 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json new file mode 100644 index 00000000..c3d2ff60 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Вложенный скроллируемый вид", + "info": "Вид, используемый в NestedScrollView, который содержит SliverOverlapAbsorberHandle и уведомляет его, когда вид требует пересчета макета. Например, при его прокрутке.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Описание NestedScrollViewViewport", + "desc": [ + "【offset】 : *смещение 【ViewportOffset】", + "【handle】 : *обработчик 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : направление оси 【AxisDirection】", + "【crossAxisDirection】 : направление поперечной оси 【AxisDirection】", + "【slivers】 : дочерние компоненты 【List】", + "【clipBehavior】 : поведение обрезки 【Clip】", + "【anchor】 : якорь 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json new file mode 100644 index 00000000..ef14cc74 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "嵌套滑动视口", + "info": "在 NestedScrollView 中使用的视口,该视口持有 SliverOverlapAbsorberHandle,会在视口需要重新计算布局时通知它。例如,当滚动它时。", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 介绍", + "desc": [ + "【offset】 : *偏移 【ViewportOffset】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【crossAxisDirection】 : 交叉轴向 【AxisDirection】", + "【slivers】 : 子组件 【List】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【anchor】 : 锚点 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart new file mode 100644 index 00000000..5da8f860 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class NestedScrollViewViewportDemo extends StatelessWidget { + const NestedScrollViewViewportDemo({Key? key}) : super(key: key); + + final String info = + 'NestedScrollViewViewport 在源码中只有一处使用:' + '_NestedScrollViewCustomScrollView 继承自 CustomScrollView,复写了 buildViewport 方法,返回 NestedScrollViewViewport 。' + '而 NestedScrollView 构建时使用了 _NestedScrollViewCustomScrollView,也就是 NestedScrollView 的视口依赖于 NestedScrollViewViewport。' + 'NestedScrollViewViewport 的特点是持有 SliverOverlapAbsorberHandle 类对象 handle,源码中该 handle 在 NestedScrollViewState 中初始化。' + '可通过上下文获取,用于 SliverOverlapAbsorber/SliverOverlapInjector 组件,使用详见相关组件。'; + + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json new file mode 100644 index 00000000..2152ab6f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "RichText", + "info": "Eine RichText-Komponente, die verschiedene Textstile oder verschiedene Komponenten aufnehmen kann und weit verbreitet ist.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RichText", + "desc": [ + "【text】: Text 【TextSpan】", + " Andere Eigenschaften sind identisch mit Text, siehe dazu." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText enthält andere Komponenten", + "desc": [ + "Verwenden Sie WidgetSpan, um normale Komponenten zu tragen, als Inhalt von RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json new file mode 100644 index 00000000..d8ed9ff9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Rich Text", + "info": "A rich text component that can accommodate various text styles or various components, widely used.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RichText", + "desc": [ + "【text】: text 【TextSpan】", + " Other properties are the same as Text, see it for details." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contains Other Components", + "desc": [ + "Use WidgetSpan to carry ordinary components as the content of RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json new file mode 100644 index 00000000..c0d3ccfd --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texto enriquecido", + "info": "Componente de texto enriquecido que puede contener varios estilos de texto o varios componentes, ampliamente utilizado.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RichText", + "desc": [ + "【text】 : texto 【TextSpan】", + " Otras propiedades son las mismas que Text, consulte para más detalles." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText contiene otros componentes", + "desc": [ + "Usa WidgetSpan para contener componentes comunes como contenido de RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json new file mode 100644 index 00000000..7af0eae1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texte enrichi", + "info": "Un composant de texte enrichi qui peut contenir divers styles de texte ou divers composants, largement utilisé.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RichText", + "desc": [ + "【text】 : texte 【TextSpan】", + " Les autres propriétés sont les mêmes que Text, voir pour plus de détails." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText contenant d'autres composants", + "desc": [ + "Utilisez WidgetSpan pour contenir des composants ordinaires, en tant que contenu de RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json new file mode 100644 index 00000000..ffcd0345 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Testo Arricchito", + "info": "Un componente di testo arricchito che può contenere vari stili di testo o vari componenti, ampiamente utilizzato.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RichText", + "desc": [ + "【text】: testo 【TextSpan】", + " Altre proprietà sono le stesse di Text, vedi dettagli." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contiene Altri Componenti", + "desc": [ + "Utilizza WidgetSpan per contenere componenti comuni, come contenuto di RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json new file mode 100644 index 00000000..813973ee --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "リッチテキスト", + "info": "さまざまなテキストスタイルやコンポーネントを包含できるリッチテキストコンポーネントで、広く使用されています。", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichTextの基本的な使用", + "desc": [ + "【text】 : テキスト 【TextSpan】", + " 他のプロパティはTextと同じです。詳細はそちらを参照してください。" + ] + }, + { + "file": "node2_widget.dart", + "name": "RichTextに他のコンポーネントを含める", + "desc": [ + "WidgetSpanを使用して通常のコンポーネントをリッチテキストの内容として含める" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json new file mode 100644 index 00000000..834b5ad3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "리치 텍스트", + "info": "다양한 텍스트 스타일이나 다양한 컴포넌트를 포함할 수 있는 리치 텍스트 컴포넌트로, 널리 사용됩니다.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichText 기본 사용", + "desc": [ + "【text】 : 텍스트 【TextSpan】", + " 다른 속성은 Text와 동일하며, 자세한 내용은 해당 항목을 참조하세요." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText에 다른 컴포넌트 포함", + "desc": [ + "WidgetSpan을 사용하여 일반 컴포넌트를 포함하고, 이를 RichText의 내용으로 사용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json new file mode 100644 index 00000000..018135f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texto Rico", + "info": "Um componente de texto rico que pode acomodar vários estilos de texto ou vários componentes, amplamente utilizado.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RichText", + "desc": [ + "【text】 : texto 【TextSpan】", + " Outras propriedades são as mesmas que Text, consulte para mais detalhes." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contendo Outros Componentes", + "desc": [ + "Use WidgetSpan para suportar componentes comuns como conteúdo do RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json new file mode 100644 index 00000000..f9f07836 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Форматированный текст", + "info": "Компонент форматированного текста, который может содержать различные стили текста или компоненты, широко применяется.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RichText", + "desc": [ + "【text】 : текст 【TextSpan】", + " Другие свойства такие же, как у Text, подробнее см. там." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText содержит другие компоненты", + "desc": [ + "Используйте WidgetSpan для размещения обычных компонентов в качестве содержимого RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json new file mode 100644 index 00000000..6f1447ba --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "富文本", + "info": "可以容纳多种文字样式或各种组件的富文本组件,应用较为广泛。", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichText基本使用", + "desc": [ + "【text】 : 文字 【TextSpan】", + " 其他属性与Text相同,详见之。" + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText包含其他组件", + "desc": [ + "使用WidgetSpan来承载普通组件,作为RichText的内容" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart new file mode 100644 index 00000000..7e24b821 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +import '../../utils/color_utils.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomRichText extends StatelessWidget { + const CustomRichText({Key? key}) : super(key: key); + + final str = " 发光强度简称光强,国际单位是(坎德拉)简写cd。" + "1cd是指光源在指定方向的单位立体角内发出的光通量。" + "光源辐射是均匀时,则光强为I=F/Ω,Ω为立体角,单位为球面度(sr),F为光通量," + "单位是流明,对于点光源由I=F/4π 。光亮度是表示发光面明亮程度的," + "指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比," + "单位是坎德拉/平方米。对于一个漫散射面,尽管各个方向的光强和光通量不同," + "但各个方向的亮度都是相等的。电视机的荧光屏就是近似于这样的漫散射面," + "所以从各个方向上观看图像,都有相同的亮度感。"; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only( + left: 10.0, + right: 10, + ), + child: RichText( + text: TextSpan( + children: str + .split("") + .map((str) => TextSpan( + text: str, + style: TextStyle( + fontSize: 14, color: ColorUtils.randomColor()))) + .toList())), + ); + } +} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart similarity index 84% rename from packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart index 0942ca22..dc9c9320 100644 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 101, -// "name": 'RichText包含其他组件', -// "priority": 2, -// "subtitle": -// "使用WidgetSpan来承载普通组件,作为RichText的内容", -// } + class RichTextWithWidget extends StatelessWidget { const RichTextWithWidget({Key? key}) : super(key: key); @@ -42,7 +35,7 @@ class RichTextWithWidget extends StatelessWidget { style: TextStyle(color: Colors.orange, fontSize: 16), ), const TextSpan( - text: 'https://github_model.com/toly1994328', + text: 'https://github.com/toly1994328', style: TextStyle( color: Colors.blue, fontSize: 18, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json new file mode 100644 index 00000000..fbca374e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Zeilenlayout", + "info": "Ein Flex-Layout mit horizontaler Ausrichtung, das mehrere Komponenten aufnehmen kann. Alle anderen Eigenschaften sind identisch, siehe Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Row", + "desc": [ + "【children】: Komponentenliste 【List】", + "【mainAxisAlignment】: Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】: Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】: Textbaseline 【TextBaseline】", + "【verticalDirection】: Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】: Hauptachsengröße 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json new file mode 100644 index 00000000..21e94e2e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Row Layout", + "info": "A Flex layout with a horizontal arrangement direction that can accommodate multiple components. All other properties are the same, see Flex for details.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Row", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json new file mode 100644 index 00000000..d52d0480 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Disposición de fila", + "info": "Disposición Flex con dirección horizontal, puede contener múltiples componentes. Todas las demás propiedades son iguales, consulte Flex para más detalles.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Row", + "desc": [ + "【children】: Lista de componentes 【List】", + "【mainAxisAlignment】: Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】: Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】: Línea base del texto 【TextBaseline】", + "【verticalDirection】: Dirección vertical 【VerticalDirection】", + "【mainAxisSize】: Tamaño del eje principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json new file mode 100644 index 00000000..d663af76 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Disposition en ligne", + "info": "Une disposition Flex avec une orientation horizontale, capable de contenir plusieurs composants. Toutes les autres propriétés sont identiques, voir Flex pour plus de détails.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Row", + "desc": [ + "【children】 : Liste des composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe secondaire 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json new file mode 100644 index 00000000..1bcf1ed4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Layout a righe", + "info": "Layout Flex con direzione orizzontale, può contenere più componenti. Tutte le altre proprietà sono le stesse, vedi Flex per i dettagli.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Row", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json new file mode 100644 index 00000000..4330b887 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "行レイアウト", + "info": "レイアウト方向が横向きのFlexレイアウトで、複数のコンポーネントを収容できます。他の属性はすべて同じです。詳細はFlexを参照してください。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Rowの基本使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸のサイズ 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json new file mode 100644 index 00000000..6ee04586 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "행 레이아웃", + "info": "배치 방향이 가로인 Flex 레이아웃으로, 여러 컴포넌트를 수용할 수 있습니다. 다른 속성은 모두 동일하며, 자세한 내용은 Flex를 참조하세요.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Row 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【mainAxisAlignment】 : 주축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 수직 방향 【VerticalDirection】", + "【mainAxisSize】 : 주축 크기 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json new file mode 100644 index 00000000..0dfd304b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Layout de Linha", + "info": "Um layout Flex com direção de disposição horizontal, que pode acomodar vários componentes. Todas as outras propriedades são as mesmas, consulte Flex para mais detalhes.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Row", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo transversal 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json new file mode 100644 index 00000000..5f557d63 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Строка", + "info": "Горизонтальная компоновка Flex, которая может содержать несколько компонентов. Все остальные свойства такие же, как у Flex. Подробнее см. Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Row", + "desc": [ + "【children】: Список компонентов 【List】", + "【mainAxisAlignment】: Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】: Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】: Базовая линия текста 【TextBaseline】", + "【verticalDirection】: Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】: Размер главной оси 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json new file mode 100644 index 00000000..0221c6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "行布局", + "info": "排布方向为横向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Row基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart new file mode 100644 index 00000000..dc090a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + + +class CustomRow extends StatelessWidget { + const CustomRow({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 70, + color: const Color(0x4484FFFF), + child: Row( + children: const [ + Padding( + child: Icon( + Icons.add_location, + size: 30, + color: Colors.pink, + ), + padding: EdgeInsets.only(left: 25, right: 20), + ), + Expanded( + child: Text( + "附近", + style: TextStyle(fontSize: 18), + ), + ), + Padding( + child: Icon(Icons.keyboard_arrow_right, color: Colors.black38), + padding: EdgeInsets.only(right: 25), + ), + ], + )); + } +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json new file mode 100644 index 00000000..2e5a4eec --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Schrumpfende Umhüllungsansicht", + "info": "Beziehung zur shrinkWrap-Eigenschaft von ScrollView. Die ShrinkWrappingViewport passt ihre Größe auf der Hauptachse an ihre untergeordneten Knoten an und wird verwendet, wenn keine Randbeschränkungen vorhanden sind.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in NestedScrollViewViewport", + "desc": [ + "【offset】 : *Versatz 【ViewportOffset】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【crossAxisDirection】 : Kreuzachsenrichtung 【AxisDirection】", + "【slivers】 : Untergeordnete Komponenten 【List】", + "【clipBehavior】 : Beschneidungsverhalten 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json new file mode 100644 index 00000000..ca49de6b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Shrink Wrap Viewport", + "info": "Related to the shrinkWrap property of ScrollView. ShrinkWrappingViewport adjusts its size on the main axis to fit its children, used when there are no boundary constraints.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to NestedScrollViewViewport", + "desc": [ + "【offset】: *offset 【ViewportOffset】", + "【axisDirection】: Axis direction 【AxisDirection】", + "【crossAxisDirection】: Cross axis direction 【AxisDirection】", + "【slivers】: Child components 【List】", + "【clipBehavior】: Clip behavior 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json new file mode 100644 index 00000000..fae42a2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista de Envoltura Reducida", + "info": "Relación con la propiedad shrinkWrap de ScrollView. ShrinkWrappingViewport ajusta su tamaño en el eje principal para adaptarse a sus nodos hijos, utilizado en ausencia de restricciones de límites.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a NestedScrollViewViewport", + "desc": [ + "【offset】 : *desplazamiento 【ViewportOffset】", + "【axisDirection】 : dirección del eje 【AxisDirection】", + "【crossAxisDirection】 : dirección del eje cruzado 【AxisDirection】", + "【slivers】 : componentes hijos 【List】", + "【clipBehavior】 : comportamiento de recorte 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json new file mode 100644 index 00000000..3e91e0aa --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vue enveloppante rétrécissante", + "info": "Lié à la propriété shrinkWrap de ScrollView. ShrinkWrappingViewport ajuste sa taille sur l'axe principal pour s'adapter à ses enfants, utilisé en l'absence de contraintes de limites.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à NestedScrollViewViewport", + "desc": [ + "【offset】 : *décalage 【ViewportOffset】", + "【axisDirection】 : direction de l'axe 【AxisDirection】", + "【crossAxisDirection】 : direction de l'axe croisé 【AxisDirection】", + "【slivers】 : composants enfants 【List】", + "【clipBehavior】 : comportement de découpage 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json new file mode 100644 index 00000000..51a691a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista di avvolgimento a contrazione", + "info": "Relazione con la proprietà shrinkWrap di ScrollView. ShrinkWrappingViewport ridimensiona se stesso sull'asse principale per adattarsi ai suoi figli, utilizzato in assenza di vincoli di confine.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a NestedScrollViewViewport", + "desc": [ + "【offset】 : *offset 【ViewportOffset】", + "【axisDirection】 : direzione dell'asse 【AxisDirection】", + "【crossAxisDirection】 : direzione dell'asse incrociato 【AxisDirection】", + "【slivers】 : componenti figli 【List】", + "【clipBehavior】 : comportamento di ritaglio 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json new file mode 100644 index 00000000..a2ed4d80 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "収縮ラッピングビューポート", + "info": "ScrollViewのshrinkWrap属性との関連性。ShrinkWrappingViewportは、主軸上で自身のサイズを子ノードに合わせて調整し、境界制約がない場合に使用されます。", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 紹介", + "desc": [ + "【offset】 : *オフセット 【ViewportOffset】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【crossAxisDirection】 : 交差軸方向 【AxisDirection】", + "【slivers】 : 子コンポーネント 【List】", + "【clipBehavior】 : クリップ動作 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json new file mode 100644 index 00000000..f5992c13 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "축소 래핑 뷰포트", + "info": "ScrollView의 shrinkWrap 속성과의 관계. ShrinkWrappingViewport는 주축에서 자식 노드에 맞게 크기를 조정하며, 경계 제약이 없는 경우에 사용됩니다.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 소개", + "desc": [ + "【offset】 : *오프셋 【ViewportOffset】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【crossAxisDirection】 : 교차 축 방향 【AxisDirection】", + "【slivers】 : 자식 위젯 【List】", + "【clipBehavior】 : 클립 동작 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json new file mode 100644 index 00000000..6873fd27 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista de Envolvimento de Redução", + "info": "Associado à propriedade shrinkWrap do ScrollView. O ShrinkWrappingViewport ajusta o seu tamanho no eixo principal para se adaptar aos seus filhos, usado em casos sem restrições de limite.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao NestedScrollViewViewport", + "desc": [ + "【offset】 : *deslocamento 【ViewportOffset】", + "【axisDirection】 : direção do eixo 【AxisDirection】", + "【crossAxisDirection】 : direção do eixo cruzado 【AxisDirection】", + "【slivers】 : componentes filhos 【List】", + "【clipBehavior】 : comportamento de corte 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json new file mode 100644 index 00000000..71edc861 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Сжимающаяся оболочка Viewport", + "info": "Связь с атрибутом shrinkWrap ScrollView. ShrinkWrappingViewport регулирует свой размер по основной оси, чтобы соответствовать своим дочерним элементам, используется при отсутствии ограничений.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в NestedScrollViewViewport", + "desc": [ + "【offset】 : *смещение 【ViewportOffset】", + "【axisDirection】 : направление оси 【AxisDirection】", + "【crossAxisDirection】 : направление поперечной оси 【AxisDirection】", + "【slivers】 : дочерние компоненты 【List】", + "【clipBehavior】 : поведение обрезки 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json new file mode 100644 index 00000000..0939d13f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "收缩包围视图", + "info": "和 ScrollView 的 shrinkWrap 属性之间关联。ShrinkWrappingViewport 在主轴上调整自身的大小以适应它的子节点,在无边界约束的情况下使用。", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 介绍", + "desc": [ + "【offset】 : *偏移 【ViewportOffset】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【crossAxisDirection】 : 交叉轴向 【AxisDirection】", + "【slivers】 : 子组件 【List】", + "【clipBehavior】 : 裁剪行为 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart new file mode 100644 index 00000000..152e603f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ShrinkWrappingViewportDemo extends StatelessWidget { + + const ShrinkWrappingViewportDemo({Key? key}) : super(key: key); + + final String info = + 'ShrinkWrappingViewport 在源码中只有一处使用:' + '在 ScrollView 中如果 shrinkWrap 为 true,会使用 ShrinkWrappingViewport,该属性在其子类 ListView、GridView、CustomScrollView 中可指定。' + '如果 shrinkWrap 为 false,视口会使用 Viewport,此时,视图区域将会沿滑动方向尽可能延伸。在无边界约束的情况下,shrinkWrap 需要是 true。' + '另外 ShrinkWrappingViewport 使用比较昂贵,因为滑动时需要重新计算滑动视图的尺寸。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json new file mode 100644 index 00000000..916acaba --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Stapellayout", + "info": "Kann mehrere Komponenten aufnehmen, Unterkomponenten werden gestapelt platziert, wobei die letzte oben liegt. Verfügt über eine alignment-Eigenschaft, die in Kombination mit der Positioned-Komponente verwendet werden kann, um eine präzise Positionierung zu erreichen.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Stack", + "desc": [ + "【children】: Komponentenliste 【List】", + "【textDirection】: Ausrichtung der Kinder 【MainAxisAlignment】", + "【alignment】: Ausrichtungsmethode 【AlignmentGeometry】", + "【overflow】: Überlaufmodus 【Overflow】", + "【fit】: Anpassungsmodus 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Kombinierte Verwendung von Stack und Positioned", + "desc": [ + "Die Positioned-Komponente kann nur innerhalb eines Stacks verwendet werden und ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json new file mode 100644 index 00000000..27bd446e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Stack Layout", + "info": "Can accommodate multiple components, arranging child components in a stacked manner, with the latter on top. Has the alignment property, which can be used in conjunction with the Positioned component for precise positioning.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Stack", + "desc": [ + "【children】: Component list 【List】", + "【textDirection】: Child arrangement direction 【MainAxisAlignment】", + "【alignment】: Alignment method 【AlignmentGeometry】", + "【overflow】: Overflow mode 【Overflow】", + "【fit】: Fit mode 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Combined Usage of Stack and Positioned", + "desc": [ + "The Positioned component can only be used within a Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json new file mode 100644 index 00000000..d3df9093 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Diseño apilado", + "info": "Puede contener múltiples componentes, colocando los componentes hijos de manera apilada, el último encima. Tiene la propiedad de alineación, que se puede usar junto con el componente Positioned para un posicionamiento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Stack", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【textDirection】 : Dirección de disposición de los hijos 【MainAxisAlignment】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】", + "【overflow】 : Modo de desbordamiento 【Overflow】", + "【fit】 : Modo de ajuste 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso combinado de Stack y Positioned", + "desc": [ + "El componente Positioned solo se puede usar en Stack, y se puede especificar la distancia desde la parte superior, izquierda, derecha e inferior para colocar un componente con precisión." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json new file mode 100644 index 00000000..90c39694 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Disposition en pile", + "info": "Peut contenir plusieurs composants, disposant les composants enfants de manière empilée, le dernier étant au-dessus. Possède une propriété d'alignement, pouvant être utilisée conjointement avec le composant Positioned pour un positionnement précis.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Stack", + "desc": [ + "【children】 : Liste des composants 【List】", + "【textDirection】 : Direction de disposition des enfants 【MainAxisAlignment】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】", + "【overflow】 : Mode de débordement 【Overflow】", + "【fit】 : Mode d'adaptation 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Utilisation combinée de Stack et Positioned", + "desc": [ + "Le composant Positioned ne peut être utilisé qu'avec Stack, permettant de positionner précisément un composant en spécifiant les distances en haut, bas, gauche et droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json new file mode 100644 index 00000000..06457d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Layout a Pila", + "info": "Può contenere più componenti, disposti in modo sovrapposto, con il successivo sopra il precedente. Possiede la proprietà alignment, che può essere utilizzata in combinazione con il componente Positioned per un posizionamento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Stack", + "desc": [ + "【children】: Lista di componenti 【List】", + "【textDirection】: Direzione di disposizione dei figli 【MainAxisAlignment】", + "【alignment】: Modalità di allineamento 【AlignmentGeometry】", + "【overflow】: Modalità di overflow 【Overflow】", + "【fit】: Modalità di adattamento 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso Combinato di Stack e Positioned", + "desc": [ + "Il componente Positioned può essere utilizzato solo con Stack, consentendo di specificare le distanze da sinistra, alto, destra e basso per posizionare con precisione un componente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json new file mode 100644 index 00000000..f9d78655 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "スタックレイアウト", + "info": "複数のコンポーネントを収容でき、子コンポーネントをスタック方式で配置し、後者が上に来ます。alignment属性を持ち、Positionedコンポーネントと組み合わせて使用することで、正確な位置指定が可能です。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stackの基本的な使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【textDirection】 : 子要素の配置方向 【MainAxisAlignment】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【overflow】 : オーバーフローモード 【Overflow】", + "【fit】 : フィットモード 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "StackとPositionedの組み合わせ使用", + "desc": [ + "PositionedコンポーネントはStack内でのみ使用でき、左上右下の距離を指定して特定のコンポーネントを正確に配置できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json new file mode 100644 index 00000000..a8299959 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "스택 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 자식 컴포넌트를 겹쳐서 배치합니다. 후자가 위에 위치합니다. alignment 속성을 가지고 있으며, Positioned 컴포넌트와 함께 사용하여 정확한 위치를 지정할 수 있습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stack 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【textDirection】 : 자식 배치 방향 【MainAxisAlignment】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【overflow】 : 오버플로우 모드 【Overflow】", + "【fit】 : 적응 모드 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Stack과 Positioned 함께 사용", + "desc": [ + "Positioned 컴포넌트는 Stack에서만 사용할 수 있으며, 특정 컴포넌트의 위치를 정확히 배치하기 위해 상하좌우 거리를 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json new file mode 100644 index 00000000..c06bc8b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Layout Empilhado", + "info": "Pode acomodar vários componentes, dispondo os subcomponentes de forma empilhada, com o último ficando por cima. Possui a propriedade alignment, que pode ser usada em conjunto com o componente Positioned para um posicionamento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Stack", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【textDirection】 : Direção de disposição dos filhos 【MainAxisAlignment】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【overflow】 : Modo de overflow 【Overflow】", + "【fit】 : Modo de ajuste 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso Combinado do Stack e Positioned", + "desc": [ + "O componente Positioned só pode ser usado dentro de um Stack, permitindo especificar as distâncias de topo, esquerda, direita e inferior para posicionar um componente com precisão." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json new file mode 100644 index 00000000..9edd87b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Стек", + "info": "Может содержать несколько компонентов, располагая дочерние компоненты в стеке, последний сверху. Имеет свойство alignment, которое можно использовать вместе с компонентом Positioned для точного позиционирования.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Stack", + "desc": [ + "【children】: Список компонентов 【List】", + "【textDirection】: Направление расположения детей 【MainAxisAlignment】", + "【alignment】: Способ выравнивания 【AlignmentGeometry】", + "【overflow】: Режим переполнения 【Overflow】", + "【fit】: Режим адаптации 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Использование Stack и Positioned вместе", + "desc": [ + "Компонент Positioned может использоваться только в Stack, позволяя точно размещать компонент, задавая расстояния сверху, слева, справа и снизу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json new file mode 100644 index 00000000..db057f07 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "堆叠布局", + "info": "可容纳多个组件,以堆叠的方式摆放子组件,后者居上。拥有alignment属性,可与Positioned组件联合使用,精确定位。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stack基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【textDirection】 : 孩子排布方向 【MainAxisAlignment】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【overflow】 : 溢出模式 【Overflow】", + "【fit】 : 适应模式 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Stack和Positioned结合使用", + "desc": [ + "Positioned组件只能用与Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart new file mode 100644 index 00000000..8304e309 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomStack extends StatelessWidget { + const CustomStack({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Widget yellowBox = Container( + color: Colors.yellow, + height: 100, + width: 100, + ); + + Widget redBox = Container( + color: Colors.red, + height: 90, + width: 90, + ); + + Widget greenBox = Container( + color: Colors.green, + height: 80, + width: 80, + ); + + Widget cyanBox = Container( + color: Colors.cyanAccent, + height: 70, + width: 70, + ); + + return Container( + width: 200, + height: 120, + color: Colors.grey.withAlpha(33), + child: Stack( + textDirection: TextDirection.rtl, + fit: StackFit.loose, + alignment: Alignment.topRight, + // overflow: Overflow.clip, // 1.22.0 被去除 + children: [yellowBox, redBox, greenBox, cyanBox], + ), + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart similarity index 78% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart index c4a3985e..6ed8b5f0 100644 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 97, -// "name": 'Stack和Positioned结合使用', -// "priority": 2, -// "subtitle": -// "Positioned组件只能用与Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", -// } + class PositionedStack extends StatelessWidget { const PositionedStack({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json new file mode 100644 index 00000000..eda5bea8 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Ansichtsfenster-Komponente", + "info": "Wird normalerweise verwendet, um ein Ansichtsfenster für eine Scroll-Ansicht bereitzustellen, wobei nur die angezeigten und vorab geladenen Teile erstellt werden. Es kann die Länge des Vorladens, die Scroll-Achse usw. angegeben werden. Es ist eine der Kernimplementationskomponenten von ScrollView und wird im Allgemeinen nicht direkt verwendet.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Viewport", + "desc": [ + "【offset】: *Ansichtsfenster-Verschiebung 【ViewportOffset】", + "【cacheExtentStyle】: Vorladetyp 【CacheExtentStyle】", + "【cacheExtent】: Vorlademenge 【double】", + "【axisDirection】: Scrollrichtung 【AxisDirection】", + "【slivers】: Untergeordnete Sliver-Komponentensammlung 【List】", + "【anchor】: Ankerpunkt 【double】", + "Sie können diesen Code ausführen, um den Aufbau von ColorItem zu überprüfen, 128 Farbbalken werden nicht alle auf einmal erstellt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json new file mode 100644 index 00000000..4fa1c0a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Viewport Component", + "info": "Typically used to provide a viewport for a scrolling view, only building the displayed and preloaded parts. The preload length, scrolling axis, etc., can be specified. It is one of the core implementation components of ScrollView and is generally not used directly.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Viewport", + "desc": [ + "【offset】: *Viewport offset 【ViewportOffset】", + "【cacheExtentStyle】: Preload type 【CacheExtentStyle】", + "【cacheExtent】: Preload amount 【double】", + "【axisDirection】: Scrolling direction 【AxisDirection】", + "【slivers】: Child Sliver component set 【List】", + "【anchor】: Anchor point 【double】", + "You can run this code to see how the ColorItem is constructed, the 128 color bars are not all constructed at once." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json new file mode 100644 index 00000000..d10d5ef9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente de ventana gráfica", + "info": "Normalmente se utiliza para proporcionar una ventana gráfica a las vistas deslizantes, construyendo solo las partes visibles y precargadas. Se puede especificar la longitud de precarga, la dirección de deslizamiento, etc. Es uno de los componentes centrales de la implementación de ScrollView y generalmente no se utiliza directamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Viewport", + "desc": [ + "【offset】: *Desplazamiento de la ventana gráfica 【ViewportOffset】", + "【cacheExtentStyle】: Tipo de precarga 【CacheExtentStyle】", + "【cacheExtent】: Cantidad de precarga 【double】", + "【axisDirection】: Dirección de deslizamiento 【AxisDirection】", + "【slivers】: Conjunto de componentes Sliver hijos 【List】", + "【anchor】: Punto de anclaje 【double】", + "Puedes ejecutar este código para ver cómo se construye ColorItem, las 128 barras de color no se construyen todas a la vez." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json new file mode 100644 index 00000000..b78da72e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Composant de fenêtre", + "info": "Généralement utilisé pour fournir une fenêtre à une vue défilante, ne construit que les parties affichées et préchargées. Peut spécifier la longueur de préchargement, l'axe de défilement, etc. Est l'un des composants de base de l'implémentation de ScrollView, généralement non utilisé directement.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Viewport", + "desc": [ + "【offset】 : *Décalage de la fenêtre 【ViewportOffset】", + "【cacheExtentStyle】: Type de préchargement 【CacheExtentStyle】", + "【cacheExtent】: Quantité de préchargement 【double】", + "【axisDirection】: Direction de défilement 【AxisDirection】", + "【slivers】: Ensemble de composants Sliver enfants 【List】", + "【anchor】: Point d'ancrage 【double】", + "Vous pouvez exécuter ce code pour voir la construction de ColorItem, les 128 barres de couleur ne sont pas toutes construites en une seule fois." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json new file mode 100644 index 00000000..71dd37f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente Viewport", + "info": "Utilizzato solitamente per fornire una finestra di visualizzazione per le viste scorrevoli, costruendo solo le parti visibili e precaricate. È possibile specificare la lunghezza del precaricamento, l'asse di scorrimento, ecc. È uno dei componenti di implementazione centrale di ScrollView e generalmente non viene utilizzato direttamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Viewport", + "desc": [ + "【offset】 : *Offset della finestra di visualizzazione 【ViewportOffset】", + "【cacheExtentStyle】: Tipo di precaricamento 【CacheExtentStyle】", + "【cacheExtent】: Quantità di precaricamento 【double】", + "【axisDirection】: Direzione di scorrimento 【AxisDirection】", + "【slivers】: Insieme di componenti Sliver figli 【List】", + "【anchor】: Punto di ancoraggio 【double】", + "Puoi eseguire questi codici per vedere come viene costruito ColorItem, i 128 barre di colore non vengono costruiti tutti in una volta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json new file mode 100644 index 00000000..99b72394 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "ビューポートコンポーネント", + "info": "通常、スライドビューのビューポートを提供するために使用され、表示およびプリロードされる部分のみを構築します。プリロードの長さ、スライド軸などを指定できます。ScrollViewのコア実装コンポーネントの1つであり、通常は直接使用しません。", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewportの基本的な使用法", + "desc": [ + "【offset】 : *ビューポートオフセット 【ViewportOffset】", + "【cacheExtentStyle】: プリロードタイプ 【CacheExtentStyle】", + "【cacheExtent】: プリロード量 【double】", + "【axisDirection】: スライド方向 【AxisDirection】", + "【slivers】: 子Sliverコンポーネントセット 【List】", + "【anchor】: アンカー 【double】", + "これらのコードを実行して、ColorItemの構築状況を確認できます。128のカラーバーは一度にすべて構築されません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json new file mode 100644 index 00000000..d480441a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "뷰포트 컴포넌트", + "info": "일반적으로 스크롤 뷰에 뷰포트를 제공하기 위해 사용되며, 표시 및 미리 로드할 부분만 구성합니다. 미리 로드할 길이, 스크롤 방향 등을 지정할 수 있습니다. ScrollView의 핵심 구현 컴포넌트 중 하나로, 일반적으로 직접 사용하지 않습니다.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewport의 기본 사용", + "desc": [ + "【offset】 : *뷰포트 오프셋 【ViewportOffset】", + "【cacheExtentStyle】: 미리 로드 유형 【CacheExtentStyle】", + "【cacheExtent】: 미리 로드량 【double】", + "【axisDirection】: 스크롤 방향 【AxisDirection】", + "【slivers】: 하위 Sliver 컴포넌트 집합 【List】", + "【anchor】: 앵커 【double】", + "이 코드를 실행하여 ColorItem의 구성을 확인할 수 있으며, 128개의 색상 바가 한 번에 모두 구성되지는 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json new file mode 100644 index 00000000..6ba04fed --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente de Viewport", + "info": "Normalmente usado para fornecer uma viewport para uma vista deslizante, construindo apenas as partes exibidas e pré-carregadas. Pode especificar o comprimento do pré-carregamento, o eixo de deslizamento, etc. É um dos componentes principais de implementação do ScrollView, geralmente não é usado diretamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Viewport", + "desc": [ + "【offset】 : *Deslocamento da viewport 【ViewportOffset】", + "【cacheExtentStyle】: Tipo de pré-carregamento 【CacheExtentStyle】", + "【cacheExtent】: Quantidade de pré-carregamento 【double】", + "【axisDirection】: Direção de deslizamento 【AxisDirection】", + "【slivers】: Conjunto de componentes Sliver filhos 【List】", + "【anchor】: Ponto de ancoragem 【double】", + "Pode executar este código para verificar a construção do ColorItem, as 128 barras de cores não são construídas todas de uma vez." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json new file mode 100644 index 00000000..189f1014 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Компонент Viewport", + "info": "Обычно используется для предоставления области просмотра для прокручиваемого вида, строя только отображаемые и предварительно загружаемые части. Можно указать длину предварительной загрузки, направление прокрутки и т.д. Это один из основных компонентов реализации ScrollView, обычно не используется напрямую.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Viewport", + "desc": [ + "【offset】: *Смещение области просмотра 【ViewportOffset】", + "【cacheExtentStyle】: Тип предварительной загрузки 【CacheExtentStyle】", + "【cacheExtent】: Объем предварительной загрузки 【double】", + "【axisDirection】: Направление прокрутки 【AxisDirection】", + "【slivers】: Набор дочерних компонентов Sliver 【List】", + "【anchor】: Точка привязки 【double】", + "Можно запустить этот код, чтобы увидеть, как строится ColorItem, 128 цветных полос не строятся все сразу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json new file mode 100644 index 00000000..1837dac2 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "视口组件", + "info": "通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewport的基本使用", + "desc": [ + "【offset】 : *视口偏移量 【ViewportOffset】", + "【cacheExtentStyle】: 预加载类型 【CacheExtentStyle】", + "【cacheExtent】: 预加载量 【double】", + "【axisDirection】: 滑动方向 【AxisDirection】", + "【slivers】: 子Sliver组件集 【List】", + "【anchor】: 锚点 【double】", + "可以运行这些代码,查看ColorItem的构建情况,128个色条并非一次性全部构建。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart new file mode 100644 index 00000000..6895cf2f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart @@ -0,0 +1,79 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +/// create by 张风捷特烈 on 2020/8/2 +/// contact me by email 1981462002@qq.com + + +class ViewportDemo extends StatelessWidget { + const ViewportDemo({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 250, + child: Scrollable( + axisDirection: AxisDirection.down, + physics: const BouncingScrollPhysics(), + dragStartBehavior: DragStartBehavior.start, + viewportBuilder: (ctx, position) => Viewport( + axisDirection: AxisDirection.down, + cacheExtent: 200, + anchor: 0, + cacheExtentStyle: CacheExtentStyle.pixel, + offset: position, + slivers: [_buildSliverList()], + ), + ), + ); + } + + Widget _buildSliverList() => SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) =>ColorItem(color: data[index],), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} + +class ColorItem extends StatefulWidget { + final Color color; + + const ColorItem({Key? key, required this.color}) : super(key: key); + + @override + _ColorItemState createState() => _ColorItemState(); +} + +class _ColorItemState extends State { + + @override + void initState() { + super.initState(); + print('-----initState----${colorString(widget.color)}-----------'); + } + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.only(top: 1), + alignment: Alignment.center, + width: 100, + height: 60, + color: widget.color, + child: Text( + colorString(widget.color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ]), + ), + ); + } + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json new file mode 100644 index 00000000..1fa4ebc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Wrap-Layout", + "info": "Kann mehrere Komponenten aufnehmen und sie in einer bestimmten Richtung anordnen. Es kann den Abstand zwischen den Kindern leicht verarbeiten und automatisch umbrechen, wenn die Grenze überschritten wird. Es hat Ausrichtungsmethoden für die Haupt- und Querachse und ist relativ flexibel.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Wrap", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【spacing】 : Abstand zwischen den Einträgen auf der Hauptachse 【double】", + "【runSpacing】 : Abstand zwischen den Einträgen auf der Querachse 【double】", + "【direction】 : Ausrichtung der Hauptachse 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Alignment-Eigenschaft von Wrap", + "desc": [ + "【alignment】 : Ausrichtung der Hauptachse 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "CrossAxisAlignment-Eigenschaft von Wrap", + "desc": [ + "【crossAxisAlignment】 : Ausrichtung der Querachse 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "TextDirection-Eigenschaft von Wrap", + "desc": [ + "【textDirection】 : Textrichtung 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "VerticalDirection-Eigenschaft von Wrap", + "desc": [ + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json new file mode 100644 index 00000000..65132c6b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Wrap Layout", + "info": "Can accommodate multiple components, arranged in a specified direction, and can easily handle the spacing between children. It can automatically wrap when out of bounds. It has flexible alignment methods for the main axis and cross axis.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Wrap", + "desc": [ + "【children】: Component list 【List】", + "【spacing】: Main axis spacing between items 【double】", + "【runSpacing】: Cross axis spacing between items 【double】", + "【direction】: Main axis alignment 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap's alignment Property", + "desc": [ + "【alignment】: Main axis alignment 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap's crossAxisAlignment Property", + "desc": [ + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap's textDirection Property", + "desc": [ + "【textDirection】: Text direction 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap's verticalDirection Property", + "desc": [ + "【verticalDirection】: Vertical direction 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json new file mode 100644 index 00000000..ab8d1052 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Disposición de envoltura", + "info": "Puede contener múltiples componentes, que se organizan en la dirección especificada, y puede manejar fácilmente el espaciado entre los hijos. Cuando se excede el límite, puede envolver automáticamente. Tiene métodos de alineación en el eje principal y el eje cruzado, lo que lo hace bastante flexible.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Wrap", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【spacing】 : Espaciado entre elementos en el eje principal 【double】", + "【runSpacing】 : Espaciado entre elementos en el eje cruzado 【double】", + "【direction】 : Alineación del eje principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propiedad alignment de Wrap", + "desc": [ + "【alignment】 : Alineación del eje principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propiedad crossAxisAlignment de Wrap", + "desc": [ + "【crossAxisAlignment】 : Alineación del eje cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propiedad textDirection de Wrap", + "desc": [ + "【textDirection】 : Dirección del texto 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propiedad verticalDirection de Wrap", + "desc": [ + "【verticalDirection】 : Dirección vertical 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json new file mode 100644 index 00000000..7b96706f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Disposition enveloppante", + "info": "Peut contenir plusieurs composants, disposés séquentiellement dans une direction spécifiée, peut facilement gérer l'espacement des enfants, et peut automatiquement passer à la ligne suivante en cas de débordement. Possède des méthodes d'alignement pour l'axe principal et l'axe transversal, offrant une grande flexibilité.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Wrap", + "desc": [ + "【children】 : Liste des composants 【List】", + "【spacing】 : Espacement des éléments sur l'axe principal 【double】", + "【runSpacing】 : Espacement des éléments sur l'axe transversal 【double】", + "【direction】 : Alignement de l'axe principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propriété alignment de Wrap", + "desc": [ + "【alignment】 : Alignement de l'axe principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propriété crossAxisAlignment de Wrap", + "desc": [ + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propriété textDirection de Wrap", + "desc": [ + "【textDirection】 : Direction du texte 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propriété verticalDirection de Wrap", + "desc": [ + "【verticalDirection】 : Direction verticale 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json new file mode 100644 index 00000000..d33ff5f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Layout a pacchetto", + "info": "Può contenere più componenti, disposti in sequenza secondo la direzione specificata, può gestire facilmente la spaziatura tra i figli e può andare a capo automaticamente quando si superano i limiti. Ha modalità di allineamento per l'asse principale e l'asse trasversale, è abbastanza flessibile.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Wrap", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【spacing】 : Spaziatura degli elementi sull'asse principale 【double】", + "【runSpacing】 : Spaziatura degli elementi sull'asse trasversale 【double】", + "【direction】 : Allineamento dell'asse principale 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Proprietà alignment di Wrap", + "desc": [ + "【alignment】 : Allineamento dell'asse principale 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Proprietà crossAxisAlignment di Wrap", + "desc": [ + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Proprietà textDirection di Wrap", + "desc": [ + "【textDirection】 : Direzione del testo 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Proprietà verticalDirection di Wrap", + "desc": [ + "【verticalDirection】 : Direzione verticale 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json new file mode 100644 index 00000000..50d7a744 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "ラップレイアウト", + "info": "複数のコンポーネントを収容でき、指定された方向に順番に配置し、子要素の間隔を簡単に処理できます。オーバーフロー時に自動的に折り返すことができます。主軸と交差軸の配置方法を持ち、比較的柔軟です。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrapの基本的な使い方", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【spacing】 : 主軸アイテム間隔 【double】", + "【runSpacing】 : 交差軸アイテム間隔 【double】", + "【direction】 : 主軸整列 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrapのalignment属性", + "desc": [ + "【alignment】 : 主軸整列 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "WrapのcrossAxisAlignment属性", + "desc": [ + "【crossAxisAlignment】 : 交差軸整列 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "WrapのtextDirection属性", + "desc": [ + "【textDirection】 : テキスト方向 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "WrapのverticalDirection属性", + "desc": [ + "【verticalDirection】 : 垂直方向 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json new file mode 100644 index 00000000..4765ca5d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "래핑 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 지정된 방향으로 순차적으로 배치할 수 있습니다. 자식 간의 간격을 쉽게 처리할 수 있으며, 경계를 벗어날 경우 자동으로 줄 바꿈이 가능합니다. 주축과 교차축 정렬 방식을 가지고 있어 유연성이 높습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrap의 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【spacing】 : 주축 항목 간격 【double】", + "【runSpacing】 : 교차축 항목 간격 【double】", + "【direction】 : 주축 정렬 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap의 alignment 속성", + "desc": [ + "【alignment】 : 주축 정렬 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap의 crossAxisAlignment 속성", + "desc": [ + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap의 textDirection 속성", + "desc": [ + "【textDirection】 : 텍스트 방향 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap의 verticalDirection 속성", + "desc": [ + "【verticalDirection】 : 수직 방향 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json new file mode 100644 index 00000000..f02fcbf7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Layout de Embalagem", + "info": "Pode acomodar vários componentes, dispostos sequencialmente na direção especificada, e pode facilmente lidar com o espaçamento entre os filhos. Quando ultrapassa o limite, pode quebrar automaticamente a linha. Possui métodos de alinhamento para o eixo principal e o eixo cruzado, sendo bastante flexível.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Wrap", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【spacing】 : Espaçamento entre itens no eixo principal 【double】", + "【runSpacing】 : Espaçamento entre itens no eixo cruzado 【double】", + "【direction】 : Alinhamento do eixo principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propriedade alignment do Wrap", + "desc": [ + "【alignment】 : Alinhamento do eixo principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propriedade crossAxisAlignment do Wrap", + "desc": [ + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propriedade textDirection do Wrap", + "desc": [ + "【textDirection】 : Direção do texto 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propriedade verticalDirection do Wrap", + "desc": [ + "【verticalDirection】 : Direção vertical 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json new file mode 100644 index 00000000..8422284a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Обёртка", + "info": "Может содержать несколько компонентов, которые располагаются в указанном направлении, легко управляет расстоянием между дочерними элементами, автоматически переносит строку при выходе за пределы. Имеет гибкие настройки выравнивания по основной и поперечной оси.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Wrap", + "desc": [ + "【children】 : Список компонентов 【List】", + "【spacing】 : Расстояние между элементами по основной оси 【double】", + "【runSpacing】 : Расстояние между элементами по поперечной оси 【double】", + "【direction】 : Выравнивание по основной оси 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Свойство alignment Wrap", + "desc": [ + "【alignment】 : Выравнивание по основной оси 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Свойство crossAxisAlignment Wrap", + "desc": [ + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Свойство textDirection Wrap", + "desc": [ + "【textDirection】 : Направление текста 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Свойство verticalDirection Wrap", + "desc": [ + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json new file mode 100644 index 00000000..98459ac5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "包裹布局", + "info": "可容纳多个组件,按照指定方向依次排布,可以很方便处理孩子的间距,当越界时可以自动换行。拥有主轴和交叉轴的对齐方式,比较灵活。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrap的基础用法", + "desc": [ + "【children】 : 组件列表 【List】", + "【spacing】 : 主轴条目间距 【double】", + "【runSpacing】 : 交叉轴条目间距 【double】", + "【direction】 : 主轴对齐 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap的alignment属性", + "desc": [ + "【alignment】 : 主轴对齐 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap的crossAxisAlignment属性", + "desc": [ + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap的textDirection属性", + "desc": [ + "【textDirection】 : 文字方向 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap的verticalDirection属性", + "desc": [ + "【verticalDirection】 : 竖直方向 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart new file mode 100644 index 00000000..9c725298 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class DirectionWrap extends StatelessWidget { + const DirectionWrap({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + children: Axis.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 100, + color: Colors.grey.withAlpha(33), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + Widget get yellowBox => Container( + color: Colors.yellow, + height: 30, + width: 50, + ); + + Widget get redBox => Container( + color: Colors.red, + height: 40, + width: 40, + ); + Widget get greenBox => Container( + color: Colors.green, + height: 40, + width: 20, + ); + Widget get blackBox => Container( + color: Colors.black, + height: 10, + width: 10, + ); + Widget get purpleBox => Container( + color: Colors.purple, + height: 20, + width: 20, + ); + Widget get orangeBox => Container( + color: Colors.orange, + height: 80, + width: 20, + ); + Widget get cyanBox => Container( + color: Colors.cyanAccent, + height: 10, + width: 20, + ); + + Widget _buildItem(mode) => Wrap( + direction: mode, + runSpacing: 10, + spacing: 10, + children: [ + yellowBox, redBox, greenBox, cyanBox, + blackBox, purpleBox, orangeBox, + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart new file mode 100644 index 00000000..0ed715cc --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class WrapAlignmentWrap extends StatelessWidget { + const WrapAlignmentWrap({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + children: WrapAlignment.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 100, + color: Colors.grey.withAlpha(88), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget get yellowBox => Container( + color: Colors.yellow, + height: 30, + width: 50, + ); + + Widget get redBox => Container( + color: Colors.red, + height: 40, + width: 40, + ); + Widget get greenBox => Container( + color: Colors.green, + height: 40, + width: 20, + ); + Widget get blackBox => Container( + color: Colors.black, + height: 10, + width: 10, + ); + Widget get purpleBox => Container( + color: Colors.purple, + height: 20, + width: 20, + ); + Widget get orangeBox => Container( + color: Colors.orange, + height: 80, + width: 20, + ); + Widget get cyanBox => Container( + color: Colors.cyanAccent, + height: 10, + width: 20, + ); + + Widget _buildItem(mode) => Wrap( + alignment: mode, + runSpacing: 10, + spacing: 10, + children: [ + yellowBox, redBox, + greenBox, cyanBox, + blackBox, purpleBox, + orangeBox, + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart new file mode 100644 index 00000000..58774bf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CrossAxisAlignmentWrap extends StatelessWidget { + const CrossAxisAlignmentWrap({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + children: WrapCrossAlignment.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 100, + color: Colors.grey.withAlpha(88), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget get yellowBox => Container( + color: Colors.yellow, + height: 30, + width: 50, + ); + + Widget get redBox => Container( + color: Colors.red, + height: 40, + width: 40, + ); + Widget get greenBox => Container( + color: Colors.green, + height: 40, + width: 20, + ); + Widget get blackBox => Container( + color: Colors.black, + height: 10, + width: 10, + ); + Widget get purpleBox => Container( + color: Colors.purple, + height: 20, + width: 20, + ); + Widget get orangeBox => Container( + color: Colors.orange, + height: 80, + width: 20, + ); + Widget get cyanBox => Container( + color: Colors.cyanAccent, + height: 10, + width: 20, + ); + + Widget _buildItem(mode) => Wrap( + crossAxisAlignment: mode, + runSpacing: 10, + spacing: 10, + children: [ + yellowBox, redBox, + greenBox, cyanBox, + blackBox, purpleBox, + orangeBox, + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart new file mode 100644 index 00000000..2aba4b94 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class TextDirectionWrap extends StatelessWidget { + const TextDirectionWrap({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + children: TextDirection.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 100, + color: Colors.grey.withAlpha(88), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget get yellowBox => Container( + color: Colors.yellow, + height: 30, + width: 50, + ); + + Widget get redBox => Container( + color: Colors.red, + height: 40, + width: 40, + ); + Widget get greenBox => Container( + color: Colors.green, + height: 40, + width: 20, + ); + Widget get blackBox => Container( + color: Colors.black, + height: 10, + width: 10, + ); + Widget get purpleBox => Container( + color: Colors.purple, + height: 20, + width: 20, + ); + Widget get orangeBox => Container( + color: Colors.orange, + height: 80, + width: 20, + ); + Widget get cyanBox => Container( + color: Colors.cyanAccent, + height: 10, + width: 20, + ); + + Widget _buildItem(mode) => Wrap( + textDirection: mode, + runSpacing: 10, + spacing: 10, + children: [ + yellowBox, redBox, greenBox, cyanBox, + blackBox, purpleBox, orangeBox, + ], + ); +} diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart new file mode 100644 index 00000000..9c981319 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class VerticalDirectionWrap extends StatelessWidget { + const VerticalDirectionWrap({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + children: VerticalDirection.values + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 160, + height: 100, + color: Colors.grey.withAlpha(88), + child: _buildItem(mode)), + Text(mode.toString().split('.')[1]) + ])) + .toList()); + } + + Widget get yellowBox => Container( + color: Colors.yellow, + height: 30, + width: 50, + ); + + Widget get redBox => Container( + color: Colors.red, + height: 40, + width: 40, + ); + Widget get greenBox => Container( + color: Colors.green, + height: 40, + width: 20, + ); + Widget get blackBox => Container( + color: Colors.black, + height: 10, + width: 10, + ); + Widget get purpleBox => Container( + color: Colors.purple, + height: 20, + width: 20, + ); + Widget get orangeBox => Container( + color: Colors.orange, + height: 80, + width: 20, + ); + Widget get cyanBox => Container( + color: Colors.cyanAccent, + height: 10, + width: 20, + ); + + Widget _buildItem(mode) => Wrap( + verticalDirection: mode, + direction: Axis.vertical, + runSpacing: 10, + spacing: 10, + children: [ + yellowBox, redBox, greenBox, cyanBox, + blackBox, purpleBox, orangeBox, + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json new file mode 100644 index 00000000..8571c8e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Fehler-Widget", + "info": "Ein Widget zur Anzeige einer Fehlermeldung, roter Hintergrund mit gelber Schrift, wird häufig während der Entwicklung gesehen, wird jedoch normalerweise nicht verwendet.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ErrorWidget", + "desc": [ + "Parameter: Angezeigte Nachricht 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json new file mode 100644 index 00000000..6f7a4a4d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Error Component", + "info": "A component used to display an error message, with a red background and yellow text, often seen during development, generally not used.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ErrorWidget", + "desc": [ + "Parameters: Display Message 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json new file mode 100644 index 00000000..d94a2a8d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget de Error", + "info": "Un componente utilizado para mostrar un mensaje de error, con fondo rojo y letras amarillas, se ve con frecuencia durante el desarrollo y generalmente no se utiliza.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ErrorWidget", + "desc": [ + "Parámetro de entrada: mensaje a mostrar 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json new file mode 100644 index 00000000..7ad1db59 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget d'erreur", + "info": "Un widget utilisé pour afficher un message d'erreur, fond rouge avec texte jaune, souvent vu pendant le développement, généralement non utilisé.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ErrorWidget", + "desc": [ + "Paramètre : message à afficher 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json new file mode 100644 index 00000000..cd33392c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget di Errore", + "info": "Componente utilizzato per visualizzare un messaggio di errore, sfondo rosso con testo giallo, spesso visto durante lo sviluppo, generalmente non utilizzato.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ErrorWidget", + "desc": [ + "Parametri : Messaggio da visualizzare 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json new file mode 100644 index 00000000..08edc507 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "エラーウィジェット", + "info": "エラーメッセージを表示するためのコンポーネントです。赤い背景に黄色い文字で表示され、開発中によく見かけますが、通常は使用しません。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidgetの基本使用", + "desc": [ + "引数 : 表示メッセージ 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json new file mode 100644 index 00000000..0e7f2aad --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "에러 위젯", + "info": "에러 메시지를 표시하는 위젯으로, 빨간 배경에 노란 글씨로 표시되며, 개발 과정에서 자주 보이지만 일반적으로 사용되지 않습니다.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidget 기본 사용법", + "desc": [ + "입력 매개변수 : 표시할 정보 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json new file mode 100644 index 00000000..eabf6328 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Componente de Erro", + "info": "Componente usado para exibir uma mensagem de erro, com fundo vermelho e texto amarelo, frequentemente visto durante o desenvolvimento, geralmente não é utilizado.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ErrorWidget", + "desc": [ + "Parâmetro: Mensagem a ser exibida 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json new file mode 100644 index 00000000..a17ca651 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Виджет ошибки", + "info": "Компонент для отображения сообщения об ошибке, красный фон с желтым текстом, часто встречается в процессе разработки, обычно не используется.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ErrorWidget", + "desc": [ + "Параметры: Отображаемое сообщение 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json new file mode 100644 index 00000000..f96ff1ac --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "错误组件", + "info": "用于显示一个错误信息的组件,红底黄字,在开发过程中经常看到,一般不使用。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidget基本使用", + "desc": [ + "入参 : 显示信息 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart b/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart new file mode 100644 index 00000000..55c38f3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class ErrorWidgetDemo extends StatelessWidget { + const ErrorWidgetDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ErrorWidget( + 'I am Error ErrorWidget\n' + 'But now, there has no error.' + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json new file mode 100644 index 00000000..106ca6ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Listenradansicht", + "info": "Ein Ansichtsfenster, das eine Liste von Kindern in einem zylindrischen Rad anzeigt. Es ist die zugrunde liegende Abhängigkeit von ListWheelScrollView und CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung von ListWheelViewport", + "desc": [ + "【itemExtent】 : Axiale Item-Größe 【double】", + "【offset】 : Ansichtsfenster-Versatz 【ViewportOffset】", + "【childDelegate】 : Kinderdelegat-Konstruktor 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Perspektivische Effekte von ListWheelViewport", + "desc": [ + "【perspective】 : Perspektivparameter 【double】", + "【squeeze】 : Quetschwert 【double】", + "【diameterRatio】 : Durchmesserverhältnis 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Vergrößerung von ListWheelViewport", + "desc": [ + "【useMagnifier】 : Ob vergrößert wird 【bool】", + "【magnification】 : Vergrößerungsverhältnis 【double】", + "【clipBehavior】 : Schneidverhalten 【Clip】", + "【renderChildrenOutsideViewport】 : Ob außerhalb des Sichtfelds gerendert wird 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Versatz und Transparenz", + "desc": [ + "【offAxisFraction】 : Achsenzentrum-Versatzverhältnis 【double】", + "【overAndUnderCenterOpacity】 : Transparenz außerhalb des Vergrößerers 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json new file mode 100644 index 00000000..ce02c9fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "List Wheel Viewport", + "info": "A viewport that displays a list of children on a cylindrical wheel, which is the underlying dependency of ListWheelScrollView and CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListWheelViewport", + "desc": [ + "【itemExtent】 : Axial item size 【double】", + "【offset】 : Viewport offset 【ViewportOffset】", + "【childDelegate】 : Child delegate constructor 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Perspective Effect of ListWheelViewport", + "desc": [ + "【perspective】 : Perspective parameter 【double】", + "【squeeze】 : Squeeze value 【double】", + "【diameterRatio】 : Diameter ratio 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Magnification of ListWheelViewport", + "desc": [ + "【useMagnifier】 : Whether to magnify 【bool】", + "【magnification】 : Magnification ratio 【double】", + "【clipBehavior】 : Clip behavior 【Clip】", + "【renderChildrenOutsideViewport】 : Whether to render children outside the viewport 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Offset and Opacity", + "desc": [ + "【offAxisFraction】 : Axis center offset ratio 【double】", + "【overAndUnderCenterOpacity】 : Opacity outside the magnifier 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json new file mode 100644 index 00000000..d90a4dcb --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vista de rueda de lista", + "info": "Una vista que muestra una lista de hijos en una rueda cilíndrica, es la dependencia subyacente de ListWheelScrollView y CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simple de ListWheelViewport", + "desc": [ + "【itemExtent】 : Tamaño del ítem en el eje 【double】", + "【offset】 : Desplazamiento de la vista 【ViewportOffset】", + "【childDelegate】 : Delegado de construcción de hijos 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Efecto de perspectiva en ListWheelViewport", + "desc": [ + "【perspective】 : Parámetro de perspectiva 【double】", + "【squeeze】 : Valor de compresión 【double】", + "【diameterRatio】 : Relación de diámetro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ampliación en ListWheelViewport", + "desc": [ + "【useMagnifier】 : Si se amplía 【bool】", + "【magnification】 : Proporción de ampliación 【double】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【renderChildrenOutsideViewport】 : Si se renderiza fuera de la vista 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Desplazamiento y opacidad", + "desc": [ + "【offAxisFraction】 : Relación de desplazamiento del centro del eje 【double】", + "【overAndUnderCenterOpacity】 : Opacidad fuera del amplificador 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json new file mode 100644 index 00000000..21e6c37f --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vue de roue de liste", + "info": "Une vue qui affiche une liste d'enfants sur une roue cylindrique, dépendance sous-jacente de ListWheelScrollView et CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple de ListWheelViewport", + "desc": [ + "【itemExtent】 : Taille de l'item axial 【double】", + "【offset】 : Décalage de la vue 【ViewportOffset】", + "【childDelegate】 : Constructeur de délégué enfant 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Effet de perspective de ListWheelViewport", + "desc": [ + "【perspective】 : Paramètre de perspective 【double】", + "【squeeze】 : Valeur de compression 【double】", + "【diameterRatio】 : Ratio de diamètre 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Agrandissement de ListWheelViewport", + "desc": [ + "【useMagnifier】 : Agrandir ou non 【bool】", + "【magnification】 : Taux d'agrandissement 【double】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【renderChildrenOutsideViewport】 : Rendu hors de la vue 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Décalage et opacité", + "desc": [ + "【offAxisFraction】 : Ratio de décalage du centre de l'axe 【double】", + "【overAndUnderCenterOpacity】 : Opacité en dehors de l'amplificateur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json new file mode 100644 index 00000000..aebbbc3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vista della ruota di scorrimento", + "info": "Una vista che visualizza un elenco di elementi in una ruota cilindrica, è la dipendenza sottostante di ListWheelScrollView e CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice di ListWheelViewport", + "desc": [ + "【itemExtent】 : Dimensione dell'elemento lungo l'asse 【double】", + "【offset】 : Offset della vista 【ViewportOffset】", + "【childDelegate】 : Delegato di costruzione dei figli 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Effetto prospettico di ListWheelViewport", + "desc": [ + "【perspective】 : Parametro di prospettiva 【double】", + "【squeeze】 : Valore di compressione 【double】", + "【diameterRatio】 : Rapporto del diametro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ingrandimento di ListWheelViewport", + "desc": [ + "【useMagnifier】 : Se ingrandire 【bool】", + "【magnification】 : Rapporto di ingrandimento 【double】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【renderChildrenOutsideViewport】 : Se renderizzare i figli fuori dalla vista 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Offset e trasparenza", + "desc": [ + "【offAxisFraction】 : Rapporto di offset del centro dell'asse 【double】", + "【overAndUnderCenterOpacity】 : Trasparenza fuori dall'ingranditore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json new file mode 100644 index 00000000..ac889c04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "リストホイールビューポート", + "info": "子リストを円柱状のホイール上に表示するビューポートで、ListWheelScrollView、CupertinoPickerの基盤となる依存関係です", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport の簡単な使用", + "desc": [ + "【itemExtent】 : 軸方向のアイテムサイズ 【double】", + "【offset】 : ビューポートのオフセット 【ViewportOffset】", + "【childDelegate】 : 子デリゲートコンストラクタ 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport の遠近効果", + "desc": [ + "【perspective】 : 遠近パラメータ 【double】", + "【squeeze】 : 圧縮値 【double】", + "【diameterRatio】 : 直径比率 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport の拡大", + "desc": [ + "【useMagnifier】 : 拡大するかどうか 【bool】", + "【magnification】 : 拡大比率 【double】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【renderChildrenOutsideViewport】 : 視野外の子をレンダリングするか 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "オフセットと透明度", + "desc": [ + "【offAxisFraction】 : 軸中心のオフセット比率 【double】", + "【overAndUnderCenterOpacity】 : 拡大器外の透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json new file mode 100644 index 00000000..8e74bc4c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "리스트 휠 뷰포트", + "info": "자식 리스트를 원통형 휠에 표시하는 뷰포트로, ListWheelScrollView, CupertinoPicker의 기반이 됨", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport 기본 사용법", + "desc": [ + "【itemExtent】 : 축 방향 아이템 크기 【double】", + "【offset】 : 뷰포트 오프셋 【ViewportOffset】", + "【childDelegate】 : 자식 위임 생성자 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport 원근 효과", + "desc": [ + "【perspective】 : 원근 매개변수 【double】", + "【squeeze】 : 압축 값 【double】", + "【diameterRatio】 : 직경 비율 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport 확대", + "desc": [ + "【useMagnifier】 : 확대 여부 【bool】", + "【magnification】 : 확대 비율 【double】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【renderChildrenOutsideViewport】 : 시야 밖 렌더링 여부 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "오프셋과 투명도", + "desc": [ + "【offAxisFraction】 : 축 중심 오프셋 비율 【double】", + "【overAndUnderCenterOpacity】 : 확대기 외부 투명도 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json new file mode 100644 index 00000000..5063eb01 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Porta de Roda de Lista", + "info": "Uma porta que exibe uma lista de filhos em uma roda cilíndrica, é a dependência subjacente de ListWheelScrollView e CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Simples de ListWheelViewport", + "desc": [ + "【itemExtent】 : Tamanho axial do item 【double】", + "【offset】 : Deslocamento da porta 【ViewportOffset】", + "【childDelegate】 : Construtor do delegado de filhos 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Efeito de Perspectiva de ListWheelViewport", + "desc": [ + "【perspective】 : Parâmetro de perspectiva 【double】", + "【squeeze】 : Valor de compressão 【double】", + "【diameterRatio】 : Razão de diâmetro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ampliação de ListWheelViewport", + "desc": [ + "【useMagnifier】 : Se amplia 【bool】", + "【magnification】 : Proporção de ampliação 【double】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【renderChildrenOutsideViewport】 : Se renderiza fora do campo de visão 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Deslocamento e Transparência", + "desc": [ + "【offAxisFraction】 : Razão de deslocamento do centro do eixo 【double】", + "【overAndUnderCenterOpacity】 : Transparência fora do ampliador 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json new file mode 100644 index 00000000..8b6bb345 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Вид списка колеса прокрутки", + "info": "Вид, который отображает список детей в виде цилиндрического колеса прокрутки, является базовой зависимостью для ListWheelScrollView и CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование ListWheelViewport", + "desc": [ + "【itemExtent】 : Размер элемента по оси 【double】", + "【offset】 : Смещение вида 【ViewportOffset】", + "【childDelegate】 : Делегат для создания детей 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Эффект перспективы ListWheelViewport", + "desc": [ + "【perspective】 : Параметр перспективы 【double】", + "【squeeze】 : Значение сжатия 【double】", + "【diameterRatio】 : Коэффициент диаметра 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Увеличение ListWheelViewport", + "desc": [ + "【useMagnifier】 : Использовать ли увеличение 【bool】", + "【magnification】 : Коэффициент увеличения 【double】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【renderChildrenOutsideViewport】 : Рендерить ли детей за пределами вида 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Смещение и прозрачность", + "desc": [ + "【offAxisFraction】 : Отношение смещения от центра оси 【double】", + "【overAndUnderCenterOpacity】 : Прозрачность за пределами увеличителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json new file mode 100644 index 00000000..fb86f4ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "列表滚轮视口", + "info": "一个将孩子列表显示在柱状滚轮上的视口,是 ListWheelScrollView、CupertinoPicker 的底层依赖", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport 简单使用", + "desc": [ + "【itemExtent】 : 轴向item尺寸 【double】", + "【offset】 : 视口偏移 【ViewportOffset】", + "【childDelegate】 : 孩子代理构造器 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport 透视效果", + "desc": [ + "【perspective】 : 透视参数 【double】", + "【squeeze】 : 挤压值 【double】", + "【diameterRatio】 : 直径分率 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport 放大", + "desc": [ + "【useMagnifier】 : 是否放大 【bool】", + "【magnification】 : 放大比例 【double】", + "【clipBehavior】 : 剪裁行为 【Clip】", + "【renderChildrenOutsideViewport】 : 出视野是否渲染 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "偏移和透明度", + "desc": [ + "【offAxisFraction】 : 轴中心偏移比 【double】", + "【overAndUnderCenterOpacity】 : 放大器之外的透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart new file mode 100644 index 00000000..1aeb4391 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart @@ -0,0 +1,65 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ListWheelViewportDemo extends StatelessWidget { + const ListWheelViewportDemo({super.key}); + + List get data => [ + Colors.blue[50]!, + Colors.blue[100]!, + Colors.blue[200]!, + Colors.blue[300]!, + Colors.blue[400]!, + Colors.blue[500]!, + Colors.blue[600]!, + Colors.blue[700]!, + Colors.blue[800]!, + Colors.blue[900]!, + Colors.blue[800]!, + Colors.blue[700]!, + Colors.blue[600]!, + Colors.blue[500]!, + Colors.blue[400]!, + Colors.blue[300]!, + Colors.blue[200]!, + Colors.blue[100]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 250, + width: 320, + child: Scrollable( + axisDirection: AxisDirection.down, + physics: const BouncingScrollPhysics(), + dragStartBehavior: DragStartBehavior.start, + viewportBuilder: (ctx, position) => ListWheelViewport( + itemExtent: 100, + offset: position, + childDelegate: ListWheelChildLoopingListDelegate( + children: data.map((e) => _buildItem(e)).toList()), + )), + ); + } + + Widget _buildItem(Color color) => Container( + alignment: Alignment.center, + color: color, + child: Text(colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ), + ])), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/packages/widgets/lib/Other/ListWheelViewport/node2_perspective.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart similarity index 81% rename from packages/widgets/lib/Other/ListWheelViewport/node2_perspective.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart index f4507cf9..ea873016 100644 --- a/packages/widgets/lib/Other/ListWheelViewport/node2_perspective.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart @@ -3,20 +3,12 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 透视效果', -// "priority": 2, -// "subtitle": "【perspective】 : 透视参数 【double】\n" -// "【squeeze】 : 挤压值 【double】\n" -// "【diameterRatio】 : 直径分率 【double】", -// } + class ListWheelViewportDemo2 extends StatelessWidget { - ListWheelViewportDemo2({Key? key}) : super(key: key); + const ListWheelViewportDemo2({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/packages/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart similarity index 79% rename from packages/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart index 5aa08c63..7b98d643 100644 --- a/packages/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart @@ -3,22 +3,12 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 放大', -// "priority": 3, -// "subtitle": "【useMagnifier】 : 是否放大 【bool】\n" -// "【magnification】 : 放大比例 【double】\n" -// "【clipBehavior】 : 剪裁行为 【Clip】\n" -// "【renderChildrenOutsideViewport】 : 出视野是否渲染 【bool】", -// } + class ListWheelViewportDemo3 extends StatelessWidget { - ListWheelViewportDemo3({Key? key}) : super(key: key); + const ListWheelViewportDemo3({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/packages/widgets/lib/Other/ListWheelViewport/node4_opacity.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart similarity index 83% rename from packages/widgets/lib/Other/ListWheelViewport/node4_opacity.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart index b8563352..098261a8 100644 --- a/packages/widgets/lib/Other/ListWheelViewport/node4_opacity.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart @@ -3,20 +3,12 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 291, -// "name": '偏移和透明度', -// "priority": 4, -// "subtitle": "【offAxisFraction】 : 轴中心偏移比 【double】\n" -// "【overAndUnderCenterOpacity】 : 放大器之外的透明度 【double】", -// } + class ListWheelViewportDemo4 extends StatelessWidget { - ListWheelViewportDemo4({Key? key}) : super(key: key); + const ListWheelViewportDemo4({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json new file mode 100644 index 00000000..b54faf2e --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Leistungsüberlagerung", + "info": "Ermöglicht das einfache Aktivieren von zwei Leistungsüberwachungsdiagrammen, um die Änderungen der Bildrate beim Aktualisieren der Oberfläche zu verfolgen.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PerformanceOverlay", + "desc": [ + "Mit PerformanceOverlay.allEnabled können alle Überwachungsoptionen gestartet werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json new file mode 100644 index 00000000..5c7aa36a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Performance Overlay", + "info": "It is very convenient to enable two bar charts for performance monitoring, making it easy to see the changes in frame rate when refreshing the interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PerformanceOverlay", + "desc": [ + "Using PerformanceOverlay.allEnabled can start all monitoring items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json new file mode 100644 index 00000000..5af74d60 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Superposición de Rendimiento", + "info": "Permite habilitar muy convenientemente dos gráficos de barras para monitorear el rendimiento, facilitando la visualización de los cambios en la tasa de cuadros al actualizar la interfaz.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de PerformanceOverlay", + "desc": [ + "Usar PerformanceOverlay.allEnabled permite iniciar todos los elementos de monitoreo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json new file mode 100644 index 00000000..c60ad927 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Superposition de Performance", + "info": "Permet d'activer très facilement deux graphiques de surveillance des performances, facilitant la visualisation des variations de fréquence d'images lors du rafraîchissement de l'interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PerformanceOverlay", + "desc": [ + "Utiliser PerformanceOverlay.allEnabled pour démarrer tous les éléments de surveillance." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json new file mode 100644 index 00000000..f95c4684 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Sovrapposizione delle Prestazioni", + "info": "Può attivare molto comodamente due grafici a barre per il monitoraggio delle prestazioni, facilitando la visualizzazione delle variazioni della frequenza dei fotogrammi durante l'aggiornamento dell'interfaccia.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di PerformanceOverlay", + "desc": [ + "Utilizzando PerformanceOverlay.allEnabled è possibile avviare tutti gli elementi di monitoraggio." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json new file mode 100644 index 00000000..9523d59b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "パフォーマンスオーバーレイ", + "info": "パフォーマンスモニタリングの2つの柱グラフを非常に簡単に有効にでき、インターフェースのリフレッシュ時のフレームレートの変化を簡単に確認できます。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlayの基本使用", + "desc": [ + "PerformanceOverlay.allEnabledを使用してすべての監視項目を開始できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json new file mode 100644 index 00000000..6d4084ca --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "성능 오버레이", + "info": "성능 모니터링을 매우 편리하게 시작할 수 있는 두 개의 막대 그래프로, 화면을 새로 고칠 때 프레임 속도 변화를 쉽게 확인할 수 있습니다.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlay 기본 사용", + "desc": [ + "PerformanceOverlay.allEnabled를 사용하여 모든 모니터링 항목을 시작할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json new file mode 100644 index 00000000..e17a5236 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Camada de Desempenho", + "info": "Permite ativar de forma muito conveniente dois gráficos de barras para monitorizar o desempenho, facilitando a visualização das mudanças na taxa de frames ao atualizar a interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PerformanceOverlay", + "desc": [ + "Usar PerformanceOverlay.allEnabled permite iniciar todos os itens de monitorização." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json new file mode 100644 index 00000000..85386e6a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Наложение производительности", + "info": "Очень удобно включить два столбчатых графика для мониторинга производительности, чтобы легко отслеживать изменения частоты кадров при обновлении интерфейса.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PerformanceOverlay", + "desc": [ + "Использование PerformanceOverlay.allEnabled позволяет начать все элементы мониторинга." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json new file mode 100644 index 00000000..8618b7b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "性能浮层", + "info": "可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlay基本使用", + "desc": [ + "使用PerformanceOverlay.allEnabled可以开始所有的监测项。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart new file mode 100644 index 00000000..831fb7fa --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart @@ -0,0 +1,18 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class PerformanceOverlayDemo extends StatelessWidget { + const PerformanceOverlayDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return PerformanceOverlay.allEnabled( + + ); + } +} + diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json new file mode 100644 index 00000000..2e357466 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Originalbild", + "info": "Ist die Kernkomponente zur Implementierung der Image-Komponente, kann das Image der UI anzeigen, die grundlegenden Eigenschaften sind identisch mit Image, wird selten allein verwendet.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawImage", + "desc": [ + "【image】 : Bild 【ui.Image】", + "【width】 : Breite 【int】", + "【height】: Höhe 【int】", + "【isAntiAlias】: Anti-Aliasing 【bool】", + "【filterQuality】: Filterqualität 【FilterQuality】", + "Viele Eigenschaften sind identisch mit Image, siehe dort." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json new file mode 100644 index 00000000..46bb1bf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Original Image", + "info": "It is the core component that implements the Image component, can display the ui.Image, and has the same basic properties as Image. It is rarely used alone.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawImage", + "desc": [ + "【image】: Image 【ui.Image】", + "【width】: Width 【int】", + "【height】: Height 【int】", + "【isAntiAlias】: Whether to anti-alias 【bool】", + "【filterQuality】: Filter quality 【FilterQuality】", + "Many properties are the same as Image, see details there." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json new file mode 100644 index 00000000..8ea04832 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Imagen Original", + "info": "Es el componente central que implementa el componente Image, puede mostrar la Image de la interfaz de usuario, las propiedades básicas son las mismas que Image, rara vez se usa por separado.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawImage", + "desc": [ + "【image】: Imagen 【ui.Image】", + "【width】: Ancho 【int】", + "【height】: Alto 【int】", + "【isAntiAlias】: Si es antialiasing 【bool】", + "【filterQuality】: Calidad de filtro 【FilterQuality】", + "Muchas propiedades son las mismas que Image, consulte para más detalles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json new file mode 100644 index 00000000..7db14198 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Image originale", + "info": "C'est le composant central pour implémenter le composant Image, capable d'afficher une image UI. Ses propriétés de base sont similaires à celles de Image, et il est rarement utilisé seul.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawImage", + "desc": [ + "【image】 : Image 【ui.Image】", + "【width】 : Largeur 【int】", + "【height】: Hauteur 【int】", + "【isAntiAlias】: Anti-crénelage 【bool】", + "【filterQuality】: Qualité de filtrage 【FilterQuality】", + "De nombreuses propriétés sont similaires à Image, voir les détails." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json new file mode 100644 index 00000000..91c6ac67 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Immagine originale", + "info": "È il componente principale per implementare il componente Image, può visualizzare l'Image dell'interfaccia utente, le proprietà di base sono le stesse di Image, generalmente raramente usato da solo.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RawImage", + "desc": [ + "【image】 : Immagine 【ui.Image】", + "【width】 : Larghezza 【int】", + "【height】: Altezza 【int】", + "【isAntiAlias】: Anti-alias 【bool】", + "【filterQuality】: Qualità del filtro 【FilterQuality】", + "Molte proprietà sono le stesse di Image, vedi dettagli." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json new file mode 100644 index 00000000..aae1a631 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "元画像", + "info": "Imageコンポーネントのコアコンポーネントであり、uiのImageを表示できます。基本的な属性はImageと同じで、単独で使用されることはほとんどありません。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImageの基本使用", + "desc": [ + "【image】 : 画像 【ui.Image】", + "【width】 : 幅 【int】", + "【height】: 高さ 【int】", + "【isAntiAlias】: アンチエイリアスかどうか 【bool】", + "【filterQuality】: フィルタ品質 【FilterQuality】", + "多くの属性はImageと同じです。詳細はそちらを参照してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json new file mode 100644 index 00000000..b4b0dd6c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "원본 이미지", + "info": "Image 컴포넌트를 구현하는 핵심 컴포넌트로, ui의 Image를 표시할 수 있으며, 기본 속성은 Image와 동일하며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImage 기본 사용", + "desc": [ + "【image】 : 이미지 【ui.Image】", + "【width】 : 너비 【int】", + "【height】: 높이 【int】", + "【isAntiAlias】: 안티앨리어싱 여부 【bool】", + "【filterQuality】: 필터 품질 【FilterQuality】", + "많은 속성이 Image와 동일하니, 자세한 내용은 해당 항목을 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json new file mode 100644 index 00000000..bb06bf43 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Imagem Original", + "info": "É o componente central que implementa o componente Image, pode exibir a Image da ui, as propriedades básicas são as mesmas que a Image, raramente é usado sozinho.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawImage", + "desc": [ + "【image】 : Imagem 【ui.Image】", + "【width】 : Largura 【int】", + "【height】: Altura 【int】", + "【isAntiAlias】: Anti-aliasing 【bool】", + "【filterQuality】: Qualidade do Filtro 【FilterQuality】", + "Muitas propriedades são as mesmas que a Image, consulte para mais detalhes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json new file mode 100644 index 00000000..062b9d79 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Исходное изображение", + "info": "Это основной компонент, реализующий компонент Image, который может отображать изображение UI. Основные свойства такие же, как у Image, и он редко используется отдельно.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawImage", + "desc": [ + "【image】 : изображение 【ui.Image】", + "【width】 : ширина 【int】", + "【height】: высота 【int】", + "【isAntiAlias】: сглаживание 【bool】", + "【filterQuality】: качество фильтрации 【FilterQuality】", + "Многие свойства такие же, как у Image, подробнее см. в нем." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json new file mode 100644 index 00000000..b4b22089 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "原图片", + "info": "是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImage基本使用", + "desc": [ + "【image】 : 图片 【ui.Image】", + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【isAntiAlias】: 是否抗锯齿 【bool】", + "【filterQuality】: 过滤质量 【FilterQuality】", + "很多属性同Image,详见之." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart b/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart new file mode 100644 index 00000000..6c6512e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart @@ -0,0 +1,82 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class RawImageDemo extends StatefulWidget { + const RawImageDemo({Key? key}) : super(key: key); + + @override + _RawImageDemoState createState() => _RawImageDemoState(); +} + +class _RawImageDemoState extends State { + ui.Image? _image; + + @override + void initState() { + super.initState(); + _loadImageFromAssets('assets/images/icon_head.webp'); + } + + @override + Widget build(BuildContext context) { + if (_image == null) { + return const SizedBox( + width: 80, + height: 80, + ); + } + + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + RawImage( + image: _image, + width: 150, + height: 150, + isAntiAlias: true, + filterQuality: FilterQuality.high, + ), + const Text('isAntiAlias: true'), + const Text('FilterQuality.high') + ], + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + RawImage( + image: _image, + width: 150, + height: 150, + isAntiAlias: false, + ), + const Text('isAntiAlias: false'), + const Text('FilterQuality.low') + ], + ), + ], + ); + } + + void _loadImageFromAssets(String name) async { + _image = await loadImageFromAssets(name); + setState(() {}); + } + + //读取 assets 中的图片 + Future loadImageFromAssets(String path) async { + ByteData data = await rootBundle.load(path); + List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + return decodeImageFromList(Uint8List.fromList(bytes)); + } +} diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json new file mode 100644 index 00000000..93d8f92c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Stammkomponente", + "info": "Brücke zwischen RenderObject und Element-Baum.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Rendering-Objekt 【RenderObjectWithChildMixin】", + "【child】 : Unterkomponente 【Widget】", + "【debugShortDescription】 : Debug-Kurzbeschreibung 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json new file mode 100644 index 00000000..ef938e9e --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Root Component", + "info": "The bridge between RenderObject and Element tree.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Render object 【RenderObjectWithChildMixin】", + "【child】 : Child component 【Widget】", + "【debugShortDescription】 : Debugging introduction 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json new file mode 100644 index 00000000..9120b742 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente raíz", + "info": "Puente entre RenderObject y el árbol de Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Objeto de renderizado 【RenderObjectWithChildMixin】", + "【child】 : Componente hijo 【Widget】", + "【debugShortDescription】 : Descripción corta de depuración 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json new file mode 100644 index 00000000..ea95a3db --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Composant racine", + "info": "Pont entre RenderObject et l'arbre Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : objet de rendu 【RenderObjectWithChildMixin】", + "【child】 : composant enfant 【Widget】", + "【debugShortDescription】 : description de débogage 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json new file mode 100644 index 00000000..a0e27e51 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente radice", + "info": "Ponte tra RenderObject e l'albero degli Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Oggetto di rendering 【RenderObjectWithChildMixin】", + "【child】 : Componente figlio 【Widget】", + "【debugShortDescription】 : Breve descrizione di debug 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json new file mode 100644 index 00000000..206fc9fc --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "ルートコンポーネント", + "info": "RenderObject と Element ツリーの橋渡し。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 紹介", + "desc": [ + "【container】 : レンダリングオブジェクト 【RenderObjectWithChildMixin】", + "【child】 : 子コンポーネント 【Widget】", + "【debugShortDescription】 : デバッグ概要 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json new file mode 100644 index 00000000..35c8289a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "루트 컴포넌트", + "info": "RenderObject와 Element 트리의 다리.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 소개", + "desc": [ + "【container】 : 렌더링 객체 【RenderObjectWithChildMixin】", + "【child】 : 자식 컴포넌트 【Widget】", + "【debugShortDescription】 : 디버그 간략 설명 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json new file mode 100644 index 00000000..dbbcb458 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente Raiz", + "info": "Ponte entre RenderObject e a árvore de Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Objeto de renderização 【RenderObjectWithChildMixin】", + "【child】 : Componente filho 【Widget】", + "【debugShortDescription】 : Breve descrição de depuração 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json new file mode 100644 index 00000000..39198c7b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Корневой компонент", + "info": "Мост между RenderObject и деревом Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Объект рендеринга 【RenderObjectWithChildMixin】", + "【child】 : Дочерний компонент 【Widget】", + "【debugShortDescription】 : Краткое описание для отладки 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json new file mode 100644 index 00000000..4a6c2a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "根组件", + "info": "RenderObject 和 Element 树的桥梁。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 介绍", + "desc": [ + "【container】 : 渲染对象 【RenderObjectWithChildMixin】", + "【child】 : 子组件 【Widget】", + "【debugShortDescription】 : 调试简介 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart new file mode 100644 index 00000000..fa146192 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart @@ -0,0 +1,25 @@ + +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class RenderObjectToWidgetAdapterDemo extends StatelessWidget { + const RenderObjectToWidgetAdapterDemo({Key? key}) : super(key: key); + + final String info = + '该组件并没有什么太大的使用价值,但却非常有纪念意义。它是 Flutter 框架中最顶层的 Widget,它的 child 是 runApp 传入的组件,在 attachRootWidget 方法中被实例化。' + '它持有根渲染对象 RenderView ,负责创建根元素 RenderObjectToWidgetElement,是一个无名英雄,一个深藏功与名的组件。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json new file mode 100644 index 00000000..f8555231 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Tabellenkomponente", + "info": "Eine Komponente zur Anzeige von Tabellen, bei der Eigenschaften wie Rahmen, Spaltenbreite, Textrichtung usw. angegeben werden können. Der Kernobjekttyp ist TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Table", + "desc": [ + "【children】: Widget-Liste 【List】", + "【columnWidths】: Spaltenbreite 【Map】", + "【defaultColumnWidth】: Standardspaltenbreite 【TableColumnWidth】", + "【border】: Rahmen 【TableBorder】", + "【textDirection】: Textrichtung 【TextDirection】", + "【defaultVerticalAlignment】: Vertikale Ausrichtung der Zellen 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json b/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json new file mode 100644 index 00000000..0e58923b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Table Component", + "info": "A component for displaying tables, which can specify properties such as borders, column widths, text direction, etc. The core object type is TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Table", + "desc": [ + "【children】: Component list 【List】", + "【columnWidths】: Column widths 【Map】", + "【defaultColumnWidth】: Default column width 【TableColumnWidth】", + "【border】: Border 【TableBorder】", + "【textDirection】: Text direction 【TextDirection】", + "【defaultVerticalAlignment】: Vertical alignment mode of cells 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json new file mode 100644 index 00000000..34ded904 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente de tabla", + "info": "Componente utilizado para mostrar tablas, se pueden especificar atributos como bordes, ancho de columna, dirección del texto, etc. El tipo de objeto principal es TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Table", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【columnWidths】 : Ancho de columna 【Map】", + "【defaultColumnWidth】 : Ancho de columna predeterminado 【TableColumnWidth】", + "【border】 : Borde 【TableBorder】", + "【textDirection】 : Dirección del texto 【TextDirection】", + "【defaultVerticalAlignment】 : Modo de alineación vertical de la celda 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json new file mode 100644 index 00000000..790cee5c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Composant de tableau", + "info": "Composant utilisé pour afficher des tableaux, permettant de spécifier des propriétés telles que les bordures, la largeur des colonnes, la direction du texte, etc. Le type d'objet principal est TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Table", + "desc": [ + "【children】 : Liste des composants 【List】", + "【columnWidths】 : Largeur des colonnes 【Map】", + "【defaultColumnWidth】 : Largeur de colonne par défaut 【TableColumnWidth】", + "【border】 : Bordure 【TableBorder】", + "【textDirection】 : Direction du texte 【TextDirection】", + "【defaultVerticalAlignment】 : Mode d'alignement vertical des cellules 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json new file mode 100644 index 00000000..f77e38ba --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente tabella", + "info": "Componente utilizzato per visualizzare tabelle, è possibile specificare attributi come bordi, larghezza delle colonne, direzione del testo, ecc. Il tipo di oggetto principale è TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Table", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【columnWidths】 : Larghezza delle colonne 【Map】", + "【defaultColumnWidth】 : Larghezza predefinita delle colonne 【TableColumnWidth】", + "【border】 : Bordo 【TableBorder】", + "【textDirection】 : Direzione del testo 【TextDirection】", + "【defaultVerticalAlignment】 : Modalità di allineamento verticale delle celle 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json new file mode 100644 index 00000000..63bdadae --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "テーブルコンポーネント", + "info": "テーブルを表示するためのコンポーネントで、境界線、列幅、テキストの方向などの属性を指定できます。コアオブジェクトタイプはTableRowです。", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テーブルの基本使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【columnWidths】 : 列幅 【Map】", + "【defaultColumnWidth】 : デフォルトの列幅 【TableColumnWidth】", + "【border】 : 境界線 【TableBorder】", + "【textDirection】 : テキストの方向 【TextDirection】", + "【defaultVerticalAlignment】 : セルの垂直方向の整列モード 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json new file mode 100644 index 00000000..1be34418 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "테이블 컴포넌트", + "info": "테이블을 표시하는 컴포넌트로, 테두리, 열 너비, 텍스트 방향 등의 속성을 지정할 수 있으며, 핵심 객체 유형은 TableRow입니다.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Table 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【columnWidths】 : 열 너비 【Map】", + "【defaultColumnWidth】 : 기본 열 너비 【TableColumnWidth】", + "【border】 : 테두리 【TableBorder】", + "【textDirection】 : 텍스트 방향 【TextDirection】", + "【defaultVerticalAlignment】 : 셀 세로 정렬 모드 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json new file mode 100644 index 00000000..c1a9f991 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente de Tabela", + "info": "Componente utilizado para exibir tabelas, pode especificar propriedades como bordas, largura das colunas, direção do texto, etc., o tipo de objeto principal é TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico da Tabela", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【columnWidths】 : Largura das colunas 【Map】", + "【defaultColumnWidth】 : Largura padrão da coluna 【TableColumnWidth】", + "【border】 : Borda 【TableBorder】", + "【textDirection】 : Direção do texto 【TextDirection】", + "【defaultVerticalAlignment】 : Modo de alinhamento vertical das células 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json new file mode 100644 index 00000000..c3045e21 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Компонент таблицы", + "info": "Компонент для отображения таблиц, может задавать свойства границ, ширины столбцов, направления текста и т.д. Основной тип объекта - TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Table", + "desc": [ + "【children】 : Список компонентов 【List】", + "【columnWidths】 : Ширина столбцов 【Map】", + "【defaultColumnWidth】 : Ширина столбца по умолчанию 【TableColumnWidth】", + "【border】 : Границы 【TableBorder】", + "【textDirection】 : Направление текста 【TextDirection】", + "【defaultVerticalAlignment】 : Режим выравнивания по вертикали в ячейке 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json new file mode 100644 index 00000000..25a10b9d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "表格组件", + "info": "用于展示表格的组件,可指定边线、列宽、文字方向等属性,核心对象类型是TableRow。", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Table基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【columnWidths】 : 列宽 【Map】", + "【defaultColumnWidth】 : 默认列宽 【TableColumnWidth】", + "【border】 : 边线 【TableBorder】", + "【textDirection】 : 文字方向 【TextDirection】", + "【defaultVerticalAlignment】 : 单元格竖直方向对齐模式 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/node1_base.dart b/modules/widget_system/widgets/lib/Other/Table/node1_base.dart new file mode 100644 index 00000000..6e12bbfb --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/node1_base.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomTable extends StatelessWidget { + const CustomTable({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); + _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); + _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); + _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); + _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); + _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); + _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); + _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); + + List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; + + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Table( + columnWidths: const { + 0: FixedColumnWidth(80.0), + 1: FixedColumnWidth(80.0), + 2: FixedColumnWidth(80.0), + 3: FixedColumnWidth(80.0), + 4: FixedColumnWidth(80.0), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + border: TableBorder.all( + color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), + children: data + .map((item) => TableRow(children: [ + Center( + child: Text( + item.name, + style: const TextStyle(color: Colors.blue), + )), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.symbol)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unitSymbol)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unitName)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unit)), + ), + ])) + .toList(), + ), + ); + } +} + +class _ItemBean { + String name; + String symbol; + String unit; + String unitName; + String unitSymbol; + + _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json new file mode 100644 index 00000000..4d5f47cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Button-Leiste Thema", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende ButtonBar-Komponenten festzulegen. Es kann auch verwendet werden, um die Attribute des Standard-ButtonBarThemas zu erhalten.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ButtonBarTheme", + "desc": [ + "Kann die ButtonBarThemeData-Attribute festlegen, um Standardstile für nachfolgende ButtonBar-Komponenten zu setzen, wie Ausrichtung, Stil, Ränder usw. Es kann auch ButtonBarTheme.of verwendet werden, um die Theme-Attribute der ButtonBar zu erhalten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json new file mode 100644 index 00000000..cb837bfe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Button Bar Theme", + "info": "Mainly used to set default properties for descendant ButtonBar components uniformly. It can also be used to obtain the properties of the default ButtonBarTheme.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ButtonBarTheme", + "desc": [ + "You can specify the ButtonBarThemeData properties to set default styles for descendant ButtonBar components, such as alignment, style, margins, etc. You can also use ButtonBarTheme.of to get the theme properties of ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json new file mode 100644 index 00000000..e249df4f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema de la barra de botones", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes ButtonBar descendientes, también se pueden obtener las propiedades del tema ButtonBarTheme predeterminado a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ButtonBarTheme", + "desc": [ + "Se puede especificar el atributo de datos ButtonBarThemeData para establecer el estilo predeterminado para los componentes ButtonBar descendientes, como la alineación, el estilo, los márgenes, etc. También se puede usar ButtonBarTheme.of para obtener las propiedades del tema ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json new file mode 100644 index 00000000..f73070f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Thème de la barre de boutons", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants ButtonBar descendants. Il est également possible d'obtenir les propriétés du ButtonBarTheme par défaut via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ButtonBarTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ButtonBarThemeData pour définir le style par défaut des composants ButtonBar descendants, tels que l'alignement, le style, les marges, etc. Vous pouvez également utiliser ButtonBarTheme.of pour obtenir les propriétés du thème ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json new file mode 100644 index 00000000..9f3b9fa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema della barra dei pulsanti", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ButtonBar discendenti, oppure per ottenere le proprietà del tema ButtonBarTheme predefinito tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ButtonBarTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ButtonBarThemeData per impostare lo stile predefinito per i componenti ButtonBar discendenti, come allineamento, stile, margini, ecc. È anche possibile utilizzare ButtonBarTheme.of per ottenere le proprietà del tema ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json new file mode 100644 index 00000000..c74d681e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "ボタンバーテーマ", + "info": "主に子孫のButtonBarコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのButtonBarThemeのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarThemeの基本的な使用", + "desc": [ + "ButtonBarThemeDataデータ属性を指定して、子孫のButtonBarコンポーネントにデフォルトのスタイルを設定できます。例えば、配置、スタイル、余白などです。また、ButtonBarTheme.ofを使用してButtonBarのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json new file mode 100644 index 00000000..50339341 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "버튼 바 테마", + "info": "주로 후손 ButtonBar 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 ButtonBarTheme의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarTheme 기본 사용법", + "desc": [ + "ButtonBarThemeData 데이터 속성을 지정하여 후손 ButtonBar 컴포넌트의 기본 스타일(예: 정렬 방식, 스타일, 여백 등)을 설정할 수 있습니다. 또한 ButtonBarTheme.of를 사용하여 ButtonBar의 테마 속성을 가져올 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json new file mode 100644 index 00000000..058b46e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema da Barra de Botões", + "info": "Principalmente usado para definir propriedades padrão para componentes ButtonBar descendentes, também pode ser usado para obter as propriedades do ButtonBarTheme padrão.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ButtonBarTheme", + "desc": [ + "Pode especificar as propriedades de dados do ButtonBarThemeData para definir o estilo padrão para componentes ButtonBar descendentes, como alinhamento, estilo, margens, etc. Também pode usar ButtonBarTheme.of para obter as propriedades do tema do ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json new file mode 100644 index 00000000..5bdfa179 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Тема панели кнопок", + "info": "В основном используется для установки стандартных свойств для компонентов ButtonBar у потомков, также можно получить свойства стандартной ButtonBarTheme через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ButtonBarTheme", + "desc": [ + "Можно указать свойства данных ButtonBarThemeData для установки стандартного стиля для компонентов ButtonBar у потомков, таких как выравнивание, стиль, отступы и т.д. Также можно использовать ButtonBarTheme.of для получения темы ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json new file mode 100644 index 00000000..bcb82e0d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "按钮条主题", + "info": "主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarTheme基本使用", + "desc": [ + "可指定ButtonBarThemeData数据属性为【后代】的ButtonBar组件设置默认样式,如对齐方式、样式、边距等。也可以用ButtonBarTheme.of获取ButtonBar的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart new file mode 100644 index 00000000..a05838c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class ButtonBarThemeDemo extends StatelessWidget { + const ButtonBarThemeDemo({super.key}); + + @override + Widget build(BuildContext context) { + return ButtonBarTheme( + data: ButtonBarTheme.of(context).copyWith( + alignment: MainAxisAlignment.center, + buttonPadding: const EdgeInsets.symmetric(horizontal: 6), + overflowDirection: VerticalDirection.up, + buttonMinWidth: 150, + buttonHeight: 30, + buttonTextTheme: ButtonTextTheme.primary), + child: const TempButtonBar()); + } +} + +class TempButtonBar extends StatelessWidget { + const TempButtonBar({super.key}); + + @override + Widget build(BuildContext context) { + return ButtonBar( + alignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.blue), + child: const Text("1.Elevated"), onPressed: () {}), + OutlinedButton(child: const Text("2.Outlined"), onPressed: () {}), + TextButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.blue), + onPressed: () {}, + child: const Text("3.Text"), + ) + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json new file mode 100644 index 00000000..6deddb8e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Schaltflächendesign", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende Schaltflächenkomponenten festzulegen. Es kann auch verwendet werden, um die Standardattribute der Schaltfläche zu erhalten.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von ButtonTheme", + "desc": [ + "Die Attribute sind die gleichen wie bei MaterialButton. Die Schaltflächendesign-Daten können über ButtonTheme.of abgerufen werden.", + "Es kann auch das Standarddesign für Schaltflächenkomponenten, die Nachkommen von ButtonTheme sind, festgelegt werden, einschließlich Farbe, Form, Größe usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json new file mode 100644 index 00000000..86283d7d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Button Style", + "info": "Mainly used to set default properties for descendant Button-type components uniformly, and also to obtain the default properties of a Button through this component.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme Usage", + "desc": [ + "The property parameters are the same as MaterialButton. You can obtain button theme data through ButtonTheme.of, \"", + "and also set default styles for button components that are descendants of ButtonTheme, including color, shape, size, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json new file mode 100644 index 00000000..d3a22e41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema del botón", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes de tipo Button en los descendientes, también se pueden obtener las propiedades predeterminadas del Button a través de este componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de ButtonTheme", + "desc": [ + "Los parámetros de las propiedades son los mismos que MaterialButton, se pueden obtener los datos del tema del botón a través de ButtonTheme.of, \"", + "también se pueden establecer estilos predeterminados para los componentes de botón descendientes de ButtonTheme, incluyendo color, forma, tamaño, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json new file mode 100644 index 00000000..729454fa --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Thème de bouton", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Button pour les descendants, ou pour obtenir les propriétés par défaut d'un Button via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de ButtonTheme", + "desc": [ + "Les paramètres des propriétés sont les mêmes que MaterialButton, vous pouvez obtenir les données du thème du bouton via ButtonTheme.of, \"", + "ou définir le style par défaut pour les composants bouton descendants de ButtonTheme, y compris la couleur, la forme, la taille, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json new file mode 100644 index 00000000..6fc4a22d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema del pulsante", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Button discendenti, o per ottenere le proprietà predefinite del Button attraverso questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di ButtonTheme", + "desc": [ + "I parametri delle proprietà sono gli stessi di MaterialButton, è possibile ottenere i dati del tema del pulsante tramite ButtonTheme.of, \"", + "è anche possibile impostare lo stile predefinito per i componenti pulsante discendenti di ButtonTheme, inclusi colore, forma, dimensione, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json new file mode 100644 index 00000000..3b65829d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "ボタンスタイル", + "info": "主に子孫のButtonタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのButtonのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonThemeの使用", + "desc": [ + "MaterialButtonと同じ属性パラメータで、ButtonTheme.ofを使用してボタンのテーマデータを取得できます。", + "また、ButtonThemeの【子孫】のボタンコンポーネントにデフォルトのスタイルを設定することもできます。これには色、形状、サイズなどが含まれます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json new file mode 100644 index 00000000..ef5b7c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "버튼 스타일", + "info": "주로 후손 Button 유형의 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Button의 속성을 얻을 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme 사용", + "desc": [ + "속성 매개변수는 MaterialButton과 동일하며, ButtonTheme.of를 통해 버튼 테마 데이터를 얻을 수 있습니다.", + "또한 ButtonTheme의 【후손】 버튼 컴포넌트에 기본 스타일(색상, 모양, 크기 등)을 설정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json new file mode 100644 index 00000000..c33815d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema do Botão", + "info": "Principalmente usado para definir propriedades padrão uniformes para componentes do tipo Button descendentes, também pode ser usado para obter as propriedades padrão do Button através deste componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do ButtonTheme", + "desc": [ + "Os parâmetros de propriedade são os mesmos que o MaterialButton, os dados do tema do botão podem ser obtidos através de ButtonTheme.of,", + "também pode definir estilos padrão para componentes de botão descendentes do ButtonTheme, incluindo cor, forma, tamanho, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json new file mode 100644 index 00000000..03a5a59b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Тема кнопки", + "info": "В основном используется для установки стандартных свойств для компонентов типа Button у потомков, также можно получить свойства стандартной кнопки через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование ButtonTheme", + "desc": [ + "Параметры свойств аналогичны MaterialButton, можно получить данные темы кнопки через ButtonTheme.of,", + "также можно установить стандартные стили для компонентов кнопок-потомков ButtonTheme, включая цвет, форму, размер и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json new file mode 100644 index 00000000..57fc08ce --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "按钮样式", + "info": "主要用于为后代的Button类型组件统一设置默认属性,也可以通过该组件获取默认Button的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme使用", + "desc": [ + "属性参数同MaterialButton,可以通过ButtonTheme.of获取按钮主题数据,\"", + "也可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart new file mode 100644 index 00000000..4adfd83c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + + + +class ButtonThemeDemo extends StatelessWidget { + const ButtonThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ButtonTheme( + buttonColor: Colors.orange, + splashColor: Colors.blue, + minWidth: 40, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + child: Wrap( + spacing: 10, + children: [ + ElevatedButton(onPressed: (){},child: const Icon(Icons.add)), + TextButton(onPressed: (){},child: const Icon(Icons.add)), + OutlinedButton(onPressed: (){},child: const Icon(Icons.add)), + MaterialButton(onPressed: (){},child: const Icon(Icons.add)), + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json new file mode 100644 index 00000000..b875ae52 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Chip-Stil", + "info": "Wird hauptsächlich verwendet, um Standardattribute für Chip-Typ-Komponenten für Nachkommen festzulegen. Es kann auch verwendet werden, um die Standardattribute des Chips abzurufen.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ChipTheme", + "desc": [ + "Kann ChipThemeData-Datenattribute angeben, um Standardstile für Chip-Typ-Komponenten für Nachkommen festzulegen. Die Attribute ähneln denen des Chips, wie Schatten, Farbe, Abstand, Form, Textstil usw. ChipTheme.of kann auch verwendet werden, um die Themendaten des Chips abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json new file mode 100644 index 00000000..8007a4be --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Chip Style", + "info": "Mainly used to set default properties for Chip type components of descendants, and can also be used to obtain the default properties of Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ChipTheme", + "desc": [ + "You can specify the ChipThemeData properties to set default styles for Chip type components of descendants. The properties are similar to those of Chip, such as shadow, color, margin, shape, text style, etc. You can also use ChipTheme.of to get the theme data of Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json new file mode 100644 index 00000000..7621db9a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Estilo de Chip", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para componentes de tipo Chip descendientes, también se puede utilizar este componente para obtener las propiedades predeterminadas de Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ChipTheme", + "desc": [ + "Se pueden especificar las propiedades de datos de ChipThemeData para establecer estilos predeterminados para componentes de tipo Chip descendientes, las propiedades son similares a las de Chip, como sombras, colores, márgenes, formas, estilos de texto, etc. También se puede usar ChipTheme.of para obtener los datos del tema de Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json new file mode 100644 index 00000000..aad67185 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Style de la petite barre", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Chip pour les descendants, il est également possible d'obtenir les propriétés par défaut de Chip via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ChipTheme", + "desc": [ + "Il est possible de spécifier les propriétés de données ChipThemeData pour définir le style par défaut des composants de type Chip pour les descendants, les propriétés sont similaires à celles de Chip, telles que l'ombre, la couleur, la marge, la forme, le style de texte, etc. Il est également possible d'obtenir les données de thème de Chip en utilisant ChipTheme.of." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json new file mode 100644 index 00000000..ec2f5d99 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Stile della linguetta", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Chip discendenti, è anche possibile ottenere le proprietà predefinite di Chip tramite questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ChipTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ChipThemeData per impostare lo stile predefinito per i componenti di tipo Chip discendenti, le proprietà sono simili a quelle di Chip, come ombre, colori, margini, forme, stili di testo, ecc. È anche possibile utilizzare ChipTheme.of per ottenere i dati del tema di Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json new file mode 100644 index 00000000..047f618a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "チップスタイル", + "info": "主に子孫のChipタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのChipのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipThemeの基本使用", + "desc": [ + "ChipThemeDataデータプロパティを指定して、【子孫】のChipタイプコンポーネントにデフォルトのスタイルを設定できます。プロパティはChipのプロパティと似ており、影、色、余白、形状、テキストスタイルなどがあります。また、ChipTheme.ofを使用してChipのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json new file mode 100644 index 00000000..596a5bec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "칩 스타일", + "info": "주로 후손의 Chip 타입 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Chip의 속성을 가져올 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipTheme 기본 사용", + "desc": [ + "ChipThemeData 데이터 속성을 지정하여 【후손】의 Chip 타입 컴포넌트에 기본 스타일을 설정할 수 있습니다. 속성은 Chip 속성과 유사하며, 그림자, 색상, 여백, 모양, 텍스트 스타일 등이 포함됩니다. 또한 ChipTheme.of를 사용하여 Chip의 테마 데이터를 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json new file mode 100644 index 00000000..e2c9f4bd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Estilo de Chip", + "info": "Principalmente usado para definir propriedades padrão para componentes do tipo Chip descendentes, também pode ser usado para obter as propriedades padrão do Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ChipTheme", + "desc": [ + "Pode especificar as propriedades de dados do ChipThemeData para definir o estilo padrão para componentes do tipo Chip descendentes, as propriedades são semelhantes às do Chip, como sombra, cor, margem, forma, estilo de texto, etc. Também pode usar ChipTheme.of para obter os dados do tema do Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json new file mode 100644 index 00000000..11fa7bbb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Стиль чипа", + "info": "В основном используется для установки стандартных атрибутов для компонентов типа Chip у потомков, также можно получить атрибуты стандартного Chip через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ChipTheme", + "desc": [ + "Можно указать атрибуты данных ChipThemeData для установки стандартного стиля для компонентов типа Chip у потомков, атрибуты аналогичны атрибутам Chip, такие как тень, цвет, отступы, форма, стиль текста и т.д. Также можно получить данные темы Chip с помощью ChipTheme.of." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json new file mode 100644 index 00000000..6091b013 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "小条样式", + "info": "主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipTheme基本使用", + "desc": [ + "可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart new file mode 100644 index 00000000..29e8f385 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/20 +/// contact me by email 1981462002@qq.com + +class ChipThemeDemo extends StatelessWidget { + const ChipThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ChipTheme( + data: ChipTheme.of(context).copyWith( + selectedColor: Colors.orange.withAlpha(55), + selectedShadowColor: Colors.blue, + shadowColor: Colors.orangeAccent, + pressElevation: 5, + elevation: 3, + ), + child: const CustomFilterChip(), + ); + } +} + +class CustomFilterChip extends StatefulWidget { + const CustomFilterChip({Key? key}) : super(key: key); + + @override + _CustomFilterChipState createState() => _CustomFilterChipState(); +} + +class _CustomFilterChipState extends State { + final Map map = { + 'A': 'Ant', + 'B': 'Bug', + 'C': 'Cat', + 'D': 'Dog', + }; + final List _selected = []; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Wrap( + children: map.keys.map((key) => _buildChild(key)).toList(), + ), + Container( + padding: const EdgeInsets.all(10), + child: Text('您已选择: ${_selected.join(', ')}')), + ], + ); + } + + Padding _buildChild(String key) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: FilterChip( + avatar: CircleAvatar(child: Text(key)), + label: Text(map[key]!), + selected: _selected.contains(map[key]), + onSelected: (bool value) { + setState(() { + if (value) { + _selected.add(map[key]!); + } else { + _selected.removeWhere((name) => name == map[key]); + } + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json new file mode 100644 index 00000000..984b189a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Benutzeroberflächenebene", + "info": "Ein Konzept in iOS, die visuelle Ebene der Benutzeroberfläche UIUserInterfaceLevel, unterteilt in base und elevated. Als InheritedWidget dient es hauptsächlich dazu, diese Daten zu teilen.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) kann CupertinoUserInterfaceLevelData-Daten abrufen. Mit dieser Komponente können auch diese Daten eingerichtet und mit Unterbäumen geteilt werden. Weitere Informationen zur Datenquelle finden Sie unter: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json new file mode 100644 index 00000000..608bb59b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "User Interface Level", + "info": "A concept in iOS, the content visibility level UIUserInterfaceLevel, divided into base and elevated. As an InheritedWidget, it mainly shares this data.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) can retrieve CupertinoUserInterfaceLevelData. This component can also be used to set and share this data with the subtree. For more information about the data source, see: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json new file mode 100644 index 00000000..7c2124b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Nivel de Interfaz de Usuario", + "info": "Concepto en iOS, nivel de visibilidad del contenido UIUserInterfaceLevel, dividido en base y elevated. Como un InheritedWidget, su función principal es compartir estos datos.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) puede obtener los datos de CupertinoUserInterfaceLevelData. También se puede usar este componente para configurar y compartir estos datos con el subárbol. Para más detalles sobre el origen de los datos, consulte: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json new file mode 100644 index 00000000..2c153d74 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Niveau de l'interface utilisateur", + "info": "Concept dans iOS, niveau de visibilité du contenu UIUserInterfaceLevel, divisé en base et elevated. En tant que InheritedWidget, il partage principalement ces données.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) peut récupérer les données CupertinoUserInterfaceLevelData. Ce composant peut également être utilisé pour partager ces données avec le sous-arbre. Pour plus d'informations sur le diagramme des données, voir : https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json new file mode 100644 index 00000000..17e17a49 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Livello dell'interfaccia utente", + "info": "Concetto in iOS, livello visivo del contenuto UIUserInterfaceLevel, diviso in base e elevated. Come InheritedWidget, principalmente condivide questi dati.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) può ottenere i dati di CupertinoUserInterfaceLevelData. Puoi anche utilizzare questo componente per impostare e condividere questi dati con il sottoalbero. Per ulteriori informazioni sui dati originali, consulta: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json new file mode 100644 index 00000000..abbec8fb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "ユーザーインターフェースレベル", + "info": "iOS の概念で、コンテンツの可視レベル UIUserInterfaceLevel で、base と elevated に分かれています。InheritedWidget として、主にこのデータを共有します。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 紹介", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) を使用して CupertinoUserInterfaceLevelData データを取得できます。また、このコンポーネントを使用してデータを設定し、サブツリーと共有することもできます。データの詳細については、以下を参照してください: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json new file mode 100644 index 00000000..b4ab14be --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "사용자 인터페이스 레벨", + "info": "iOS의 개념으로, 콘텐츠 가시성 레벨인 UIUserInterfaceLevel을 의미하며, base와 elevated로 나뉩니다. InheritedWidget으로서, 주로 이 데이터를 공유하는 역할을 합니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 소개", + "desc": [ + "CupertinoUserInterfaceLevel.of(context)를 통해 CupertinoUserInterfaceLevelData 데이터를 얻을 수 있습니다. 또한 이 컴포넌트를 사용하여 해당 데이터를 설정하고 서브트리와 공유할 수 있습니다. 데이터 원본에 대한 자세한 내용은 다음을 참조하세요: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json new file mode 100644 index 00000000..7f712dbf --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Nível de Interface do Utilizador", + "info": "Conceito no iOS, nível de visibilidade do conteúdo UIUserInterfaceLevel, dividido em base e elevado. Como um InheritedWidget, o principal objetivo é compartilhar esses dados.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) pode obter os dados CupertinoUserInterfaceLevelData. Também pode usar este componente para definir e compartilhar esses dados com a subárvore. Para mais detalhes sobre o diagrama de dados, consulte: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json new file mode 100644 index 00000000..de7b0577 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Уровень пользовательского интерфейса", + "info": "Концепция в ios, уровень видимости контента UIUserInterfaceLevel, разделяется на base и elevated. Как InheritedWidget, в основном используется для обмена этими данными.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) может получить данные CupertinoUserInterfaceLevelData. Также можно использовать этот компонент для настройки и обмена этих данных с поддеревом. Подробнее о данных см.: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json new file mode 100644 index 00000000..361c2720 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "用户接口等级", + "info": "ios 中的概念,内容可视级别 UIUserInterfaceLevel ,分为 base 和 elevated。作为一个 InheritedWidget ,主要就是共享该数据。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 介绍", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) 可以获取 CupertinoUserInterfaceLevelData 数据。也可以使用该组件设置该数据与子树共享。关于数据原图详见: https:developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart new file mode 100644 index 00000000..f424aa65 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class CupertinoUserInterfaceLevelDemo extends StatelessWidget { + const CupertinoUserInterfaceLevelDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const CupertinoUserInterfaceLevel( + data: CupertinoUserInterfaceLevelData.elevated, + child: LevelShower() + ); + } + +} + +class LevelShower extends StatelessWidget { + const LevelShower({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + CupertinoUserInterfaceLevelData data = CupertinoUserInterfaceLevel.of(context); + return Container( + height: 150, + alignment: Alignment.center, + color: Theme.of(context).primaryColor.withOpacity(0.1), + child: Text(data.toString()), + ); + } +} + + diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json new file mode 100644 index 00000000..d7b33549 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Standard-Ressourcenpaket", + "info": "Ein InheritedWidget, das nach der Einstellung des AssetBundle-Objekts es den Knoten nach diesem Knoten ermöglicht, das AssetBundle-Objekt über DefaultAssetBundle.of(context) zu erhalten, um auf Ressourcendateien zuzugreifen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in DefaultAssetBundle", + "desc": [ + "【bundle】 : *Ressourcenpaket 【AssetBundle】", + "【child】 : *Untergeordnete Komponente 【Widget】", + "Wir können unser eigenes DefaultAssetBundle definieren, das von nachfolgenden Knoten verwendet wird, oder direkt das Standardpaket verwenden. Dieses Beispiel zeigt, wie ein Ressourcenbild mithilfe des von Framework bereitgestellten DefaultAssetBundle geladen und angezeigt wird." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json new file mode 100644 index 00000000..36677835 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Default Asset Bundle", + "info": "An InheritedWidget that sets the AssetBundle object. After setting, the context of the nodes following this node can obtain the AssetBundle object through DefaultAssetBundle.of(context) for accessing resource files.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to DefaultAssetBundle", + "desc": [ + "【bundle】: *Resource Bundle 【AssetBundle】", + "【child】: *Child Widget 【Widget】", + "We can define our own DefaultAssetBundle for use by subsequent nodes, or we can directly use the default one. This case demonstrates loading and displaying a resource image using the DefaultAssetBundle provided by the framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json new file mode 100644 index 00000000..26058f6d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Paquete de recursos predeterminado", + "info": "Un InheritedWidget que, después de configurar el objeto AssetBundle, permite que los nodos posteriores en el contexto obtengan el objeto AssetBundle a través de DefaultAssetBundle.of(context) para acceder a los archivos de recursos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a DefaultAssetBundle", + "desc": [ + "【bundle】 : *Paquete de recursos 【AssetBundle】", + "【child】 : *Componente hijo 【Widget】", + "Podemos definir nuestro propio DefaultAssetBundle para que lo usen los nodos posteriores, o podemos usar el predeterminado directamente. Este caso demuestra cómo cargar y mostrar una imagen de recursos utilizando el DefaultAssetBundle proporcionado por el marco." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json new file mode 100644 index 00000000..2e711023 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Paquet de ressources par défaut", + "info": "Un InheritedWidget, après avoir défini l'objet AssetBundle, les nœuds suivants dans le contexte peuvent obtenir l'objet AssetBundle via DefaultAssetBundle.of(context) pour accéder aux fichiers de ressources.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Présentation de DefaultAssetBundle", + "desc": [ + "【bundle】 : *Paquet de ressources 【AssetBundle】", + "【child】 : *Composant enfant 【Widget】", + "Nous pouvons définir notre propre DefaultAssetBundle pour une utilisation ultérieure par les nœuds suivants, ou utiliser directement celui par défaut. Ce cas montre comment charger et afficher une image de ressource en utilisant le DefaultAssetBundle fourni par le framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json new file mode 100644 index 00000000..150558b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Pacchetto di risorse predefinito", + "info": "Un InheritedWidget che, una volta impostato l'oggetto AssetBundle, consente ai nodi successivi nel contesto di ottenere l'oggetto AssetBundle tramite DefaultAssetBundle.of(context) per accedere ai file delle risorse.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a DefaultAssetBundle", + "desc": [ + "【bundle】 : *Pacchetto di risorse 【AssetBundle】", + "【child】 : *Componente figlio 【Widget】", + "Possiamo definire il nostro DefaultAssetBundle per l'uso da parte dei nodi successivi, oppure possiamo utilizzare quello predefinito. Questo esempio dimostra come caricare e visualizzare un'immagine di risorsa utilizzando il DefaultAssetBundle fornito dal framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json new file mode 100644 index 00000000..000ac9cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "デフォルトアセットバンドル", + "info": "InheritedWidget で、AssetBundle オブジェクトを設定した後、このノード以降のノードコンテキストは DefaultAssetBundle.of(context) を使用して AssetBundle オブジェクトを取得し、リソースファイルにアクセスできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle の紹介", + "desc": [ + "【bundle】 : *リソースバンドル 【AssetBundle】", + "【child】 : *子コンポーネント 【Widget】", + "独自の DefaultAssetBundle を定義して後続のノードで使用することも、デフォルトのものを直接使用することもできます。この例では、フレームワークが提供する DefaultAssetBundle を使用してリソース画像を読み込み、表示します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json new file mode 100644 index 00000000..1b3dc477 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "기본 리소스 번들", + "info": "InheritedWidget으로, AssetBundle 객체를 설정한 후, 해당 노드 이후의 노드 컨텍스트에서 DefaultAssetBundle.of(context)를 통해 AssetBundle 객체를 얻어 리소스 파일에 접근할 수 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle 소개", + "desc": [ + "【bundle】 : *리소스 번들 【AssetBundle】", + "【child】 : *자식 위젯 【Widget】", + "우리는 후속 노드에서 사용할 수 있도록 자신만의 DefaultAssetBundle을 정의할 수도 있고, 기본값을 바로 사용할 수도 있습니다. 이 예제는 프레임워크에서 제공하는 DefaultAssetBundle을 통해 리소스 이미지를 로드하여 표시하는 방법을 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json new file mode 100644 index 00000000..f124827c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Pacote de Recursos Padrão", + "info": "Um InheritedWidget que, após configurar o objeto AssetBundle, permite que os nós subsequentes no contexto obtenham o objeto AssetBundle através de DefaultAssetBundle.of(context) para acessar arquivos de recursos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao DefaultAssetBundle", + "desc": [ + "【bundle】 : *Pacote de recursos 【AssetBundle】", + "【child】 : *Componente filho 【Widget】", + "Podemos definir nosso próprio DefaultAssetBundle para uso por nós subsequentes ou usar o padrão diretamente. Este exemplo demonstra o carregamento e exibição de uma imagem de recurso usando o DefaultAssetBundle fornecido pela estrutura." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json new file mode 100644 index 00000000..d4c86d0f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Пакет ресурсов по умолчанию", + "info": "InheritedWidget, который устанавливает объект AssetBundle, после чего контекст узлов после этого узла может получить объект AssetBundle с помощью DefaultAssetBundle.of(context) для доступа к файлам ресурсов.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в DefaultAssetBundle", + "desc": [ + "【bundle】 : *Пакет ресурсов 【AssetBundle】", + "【child】 : *Дочерний компонент 【Widget】", + "Мы можем определить собственный DefaultAssetBundle для использования последующими узлами или использовать предоставленный по умолчанию. Этот пример демонстрирует загрузку и отображение изображения ресурса с помощью DefaultAssetBundle, предоставленного фреймворком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json new file mode 100644 index 00000000..de0c341c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "默认资源包", + "info": "一个 InheritedWidget,设置 AssetBundle 对象后,该节点后的节点上下文可以通过 DefaultAssetBundle.of(context) 获取 AssetBundle 对象用于访问资源文件。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle 介绍", + "desc": [ + "【bundle】 : *资源包 【AssetBundle】", + "【child】 : *子组件 【Widget】", + "我们可以定义自己的 DefaultAssetBundle 来供后续节点使用,也可以直接使用默认的。该案例演示通过框架提供的 DefaultAssetBundle 加载一张资源图片进行显示。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart new file mode 100644 index 00000000..b9590d86 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'dart:ui' as ui; +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class DefaultAssetBundleDemo extends StatefulWidget { + const DefaultAssetBundleDemo({Key? key}) : super(key: key); + + @override + _DefaultAssetBundleDemoState createState() => _DefaultAssetBundleDemoState(); +} + +class _DefaultAssetBundleDemoState extends State { + ui.Image? _image; + @override + void initState() { + super.initState(); + _load(); + } + + @override + Widget build(BuildContext context) { + + return Container( + width: 150, + height: 150, + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: _image==null?Container():RawImage(image: _image,fit: BoxFit.cover,), + ); + } + + void _load() async{ + AssetBundle info = DefaultAssetBundle.of(context); + ByteData data = await info.load('assets/images/sabar.webp'); + _image = await decodeImageFromList(data.buffer.asUint8List()); + setState(() { + + }); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json new file mode 100644 index 00000000..6c804ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Standardtextstil", + "info": "Kann ein Kind enthalten und den Standardstil für den Text der Nachkommen festlegen. Wird häufig verwendet, um den Stil mehrerer identischer Texte zu vereinheitlichen und so die individuelle Einstellung zu vermeiden.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von DefaultTextStyle", + "desc": [ + "Die Eigenschaften sind die gleichen wie bei Text, siehe dort für Details.", + "Seine Funktion ist: Den Standardtextstil für [Nachkomponenten] festlegen, beachten Sie, dass Nachkomponenten auch ihren eigenen Stil festlegen können" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json new file mode 100644 index 00000000..c7a0ca76 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Default Font Style", + "info": "Can contain a child, specifying the default style for descendant text. Commonly used to unify the style of multiple identical texts, avoiding setting them one by one.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle Usage", + "desc": [ + "The properties are the same as Text, see details there.", + "Its function is: Set the default text style to be applied to [descendant widgets], note that descendant widgets can also specify their own styles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json new file mode 100644 index 00000000..e4df5bdb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Estilo de texto predeterminado", + "info": "Puede contener un hijo, especifica el estilo de texto predeterminado para los descendientes. Se usa comúnmente para unificar el estilo de múltiples textos iguales, evitando configurarlos uno por uno.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DefaultTextStyle", + "desc": [ + "Los atributos son los mismos que Text, consulte los detalles.", + "Su función es: establecer el estilo de texto predeterminado para los【componentes descendientes】, tenga en cuenta que los componentes descendientes también pueden especificar su propio estilo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json new file mode 100644 index 00000000..249b4231 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Style de texte par défaut", + "info": "Peut contenir un enfant, spécifie le style de texte par défaut pour les descendants. Souvent utilisé pour unifier le style de plusieurs textes identiques, évitant de les définir un par un.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DefaultTextStyle", + "desc": [ + "Les propriétés sont les mêmes que Text, voir ci-dessus pour plus de détails.", + "Sa fonction est : définir le style de texte par défaut appliqué aux [composants descendants], notez que les composants descendants peuvent également spécifier leur propre style" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json new file mode 100644 index 00000000..6366506b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Stile di testo predefinito", + "info": "Può contenere un figlio e specifica lo stile predefinito per il testo dei discendenti. Comunemente utilizzato per uniformare lo stile di più testi identici, evitando di impostarli uno per uno.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di DefaultTextStyle", + "desc": [ + "Le proprietà sono le stesse di Text, per i dettagli vedere quello.", + "La sua funzione è: impostare lo stile di testo predefinito da applicare ai [componenti discendenti], notare che i componenti discendenti possono anche specificare il proprio stile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json new file mode 100644 index 00000000..1f090142 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "デフォルトフォントスタイル", + "info": "子要素を一つ持つことができ、子孫のテキストにデフォルトのスタイルを指定します。複数の同じテキストのスタイルを統一するためによく使用され、一つ一つ設定する手間を省きます。", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleの使用", + "desc": [ + "各属性はTextと同じです。詳細はそちらを参照してください。", + "その機能は: デフォルトのテキストスタイルを【子孫コンポーネント】に適用することです。子孫コンポーネントも自身のスタイルを指定できることに注意してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json new file mode 100644 index 00000000..ff0265e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "기본 글꼴 스타일", + "info": "하나의 자식을 수용할 수 있으며, 후손 텍스트에 기본 스타일을 지정합니다. 여러 동일한 텍스트의 스타일을 통일하여 일일이 설정하는 것을 방지하기 위해 자주 사용됩니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle 사용", + "desc": [ + "각 속성은 Text와 동일하며, 자세한 내용은 해당 문서를 참조하십시오.", + "기능은: 기본 텍스트 스타일을 설정하여 【후손 컴포넌트】에 적용하며, 후손 컴포넌트는 자신의 스타일을 지정할 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json new file mode 100644 index 00000000..bd2458dc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Estilo de Texto Padrão", + "info": "Pode conter um filho, especificando o estilo padrão para o texto dos descendentes. Frequentemente usado para unificar o estilo de múltiplos textos iguais, evitando a configuração individual.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DefaultTextStyle", + "desc": [ + "As propriedades são as mesmas que o Text, consulte-o para mais detalhes.", + "Sua função é: definir o estilo de texto padrão para [componentes descendentes], note que os componentes descendentes também podem especificar seus próprios estilos" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json new file mode 100644 index 00000000..4fe407c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Стиль текста по умолчанию", + "info": "Может содержать одного ребенка, задает стиль текста по умолчанию для потомков. Часто используется для унификации стиля нескольких одинаковых текстов, чтобы избежать индивидуальной настройки.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DefaultTextStyle", + "desc": [ + "Атрибуты такие же, как у Text, подробнее см. там.", + "Его функция: установка стиля текста по умолчанию для [потомков], обратите внимание, что потомки также могут задавать свой собственный стиль" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json new file mode 100644 index 00000000..4f51e037 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "默认字体样式", + "info": "可容纳一个孩子,为后代的文字指定默认样式。常用于多个相同文字的样式统一,避免一一设置。", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle使用", + "desc": [ + "各属性同Text,详见之。", + "其功能是: 设置默认的文字样式应用于【后代组件】,注意后代组件也可以指定自身的样式" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart new file mode 100644 index 00000000..47fc30a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart @@ -0,0 +1,28 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + +class DefaultTextStyleDemo extends StatelessWidget { + const DefaultTextStyleDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return DefaultTextStyle( + style: const TextStyle( + fontSize: 18, + color: Colors.blue, + decoration: TextDecoration.underline), + child: Wrap( + spacing: 5, + children: const[ + Text("Hello,",), + FlutterLogo(), + Text("Flutter",style: TextStyle(color: Colors.red),), + Text("Unit."), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json new file mode 100644 index 00000000..622b10f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Richtungsabhängigkeit", + "info": "Ändert den Eigenschaftswert für Komponenten mit textDirection-Attribut einheitlich für Nachkommen. Der aktuelle Standardwert von textDirection kann auch über Directionality.of(context) abgerufen werden.", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Directionality", + "desc": [ + "【textDirection】: Textausrichtung 【TextDirection】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json new file mode 100644 index 00000000..9c86d959 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Directionality", + "info": "Set the property value uniformly for components with the textDirection attribute for descendants, or get the default textDirection attribute through Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Directionality", + "desc": [ + "【textDirection】: Text arrangement direction 【TextDirection】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json new file mode 100644 index 00000000..8e90e8b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direccionalidad", + "info": "Establece un valor de propiedad unificado para los componentes con el atributo textDirection para los descendientes, también se puede obtener el valor predeterminado del atributo textDirection actual a través de Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Directionality", + "desc": [ + "【textDirection】: Dirección de alineación del texto 【TextDirection】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json new file mode 100644 index 00000000..ef429cb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Directionnalité", + "info": "Modifie la valeur de l'attribut pour les composants ayant l'attribut textDirection pour les descendants, ou obtenez la valeur par défaut de textDirection via Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Directionality", + "desc": [ + "【textDirection】 : Direction de l'arrangement du texte 【TextDirection】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json new file mode 100644 index 00000000..7e02c95a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direzionalità", + "info": "Imposta un valore di attributo uniforme per i componenti con l'attributo textDirection per i discendenti, oppure puoi ottenere l'attributo predefinito textDirection corrente tramite Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Directionality", + "desc": [ + "【textDirection】: direzione di disposizione del testo 【TextDirection】", + "【child】: componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json new file mode 100644 index 00000000..85dae336 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "方向性", + "info": "textDirectionプロパティを持つコンポーネントのプロパティ値を一括設定して子孫に変更します。また、Directionality.of(context)を使用して現在のtextDirectionのデフォルトプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionalityの基本的な使用法", + "desc": [ + "【textDirection】: テキストの配置方向 【TextDirection】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json new file mode 100644 index 00000000..a86f7d2c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "방향성", + "info": "후손을 위해 textDirection 속성이 있는 컴포넌트의 속성 값을 통일적으로 설정할 수 있으며, Directionality.of(context)를 통해 현재 textDirection의 기본 속성을 얻을 수 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionality 기본 사용", + "desc": [ + "【textDirection】 : 텍스트 배열 방향 【TextDirection】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json new file mode 100644 index 00000000..7bce778d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direcionalidade", + "info": "Define o valor do atributo uniformemente para componentes com o atributo textDirection para os descendentes, ou pode obter o valor padrão do textDirection atual através de Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Directionality", + "desc": [ + "【textDirection】 : Direção de disposição do texto 【TextDirection】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json new file mode 100644 index 00000000..a4da56a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Направленность", + "info": "Устанавливает значение атрибута для компонентов с атрибутом textDirection для потомков, также можно получить текущее значение по умолчанию textDirection через Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Directionality", + "desc": [ + "【textDirection】 : Направление текста 【TextDirection】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json new file mode 100644 index 00000000..a05c445f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "定向性", + "info": "为后代改变有textDirection属性的组件统一设置属性值,也可以通过Directionality.of(context)获取当前textDirection默认属性。", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionality基本使用", + "desc": [ + "【textDirection】 : 文字排列方向 【TextDirection】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart new file mode 100644 index 00000000..ad9e15eb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class DirectionalityDemo extends StatefulWidget { + const DirectionalityDemo({Key? key}) : super(key: key); + + @override + _DirectionalityDemoState createState() => _DirectionalityDemoState(); +} + +class _DirectionalityDemoState extends State { + TextDirection _textDirection = TextDirection.rtl; + + @override + Widget build(BuildContext context) { + return Directionality( + textDirection: _textDirection, + child: Container( + padding: const EdgeInsets.all(8), + width: 250, + color: Colors.grey.withAlpha(33), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'A widget that determines the ambient directionality of text and text direction sensitive render objects.'), + _buildSwitch(), + const Text( + 'The text direction from the closest instance of this class that encloses the given context.'), + ], + ), + ), + ); + } + + Widget _buildSwitch() => Row( + children: [ + Switch( + value: _textDirection == TextDirection.rtl, + onChanged: (v) { + setState(() { + _textDirection = + v ? TextDirection.rtl : TextDirection.ltr; + }); + }, + ), + Text( + _textDirection.toString(), + style: const TextStyle(color: Colors.blue, fontSize: 18), + ) + ], + ); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json new file mode 100644 index 00000000..60cf42c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Trennlinienstil", + "info": "Wird hauptsächlich verwendet, um standardmäßige Attribute für Divider-Typ-Komponenten für Nachkommen festzulegen. Es kann auch verwendet werden, um die Standardattribute des Divider zu erhalten.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme Verwendung", + "desc": [ + "Die Attributeparameter ähneln denen von Divider. Die Trennlinienthemendaten können über DividerTheme.of abgerufen werden.", + "Es kann auch der Standardstil für Trennlinien von DividerTheme [Nachkommen] festgelegt werden, einschließlich Farbe, Dicke, Höhe usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json new file mode 100644 index 00000000..06f197ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Divider Style", + "info": "Mainly used to set default properties for descendant Divider type components uniformly, and it can also be used to obtain the default properties of Divider.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Using DividerTheme", + "desc": [ + "The property parameters are similar to Divider. You can obtain the divider theme data through DividerTheme.of,", + "and you can also set default styles for the dividers of DividerTheme【descendants】, including color, thickness, height, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json new file mode 100644 index 00000000..c70cc491 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Estilo de la línea divisoria", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes de tipo Divider descendientes, también se pueden obtener las propiedades predeterminadas de Divider a través de este componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DividerTheme", + "desc": [ + "Los parámetros de atributos son similares a Divider, se pueden obtener los datos del tema de la línea divisoria a través de DividerTheme.of, \"", + "también se pueden establecer estilos predeterminados para las líneas divisorias de los 【descendientes】 de DividerTheme, incluyendo color, grosor, altura, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json new file mode 100644 index 00000000..4b025c39 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Thème de séparateur", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Divider pour les descendants, ou pour obtenir les propriétés par défaut du Divider via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DividerTheme", + "desc": [ + "Les paramètres d'attributs sont similaires à ceux de Divider, vous pouvez obtenir les données du thème de séparateur via DividerTheme.of, \"", + "vous pouvez également définir le style par défaut pour les séparateurs des descendants de DividerTheme, y compris la couleur, l'épaisseur, la hauteur, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json new file mode 100644 index 00000000..3479698b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Stile della linea divisoria", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Divider discendenti, è anche possibile ottenere le proprietà predefinite di Divider attraverso questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di DividerTheme", + "desc": [ + "I parametri delle proprietà sono simili a Divider, è possibile ottenere i dati del tema della linea divisoria tramite DividerTheme.of,\"", + "è anche possibile impostare uno stile predefinito per le linee divisorie dei [discendenti] di DividerTheme, inclusi colore, spessore, altezza, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json new file mode 100644 index 00000000..314f585d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "分割線スタイル", + "info": "主に子孫のDividerタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのDividerのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerThemeの使用", + "desc": [ + "プロパティパラメータはDividerと類似しており、DividerTheme.ofを使用して分割線のテーマデータを取得できます。\"", + "また、DividerTheme【子孫】の分割線にデフォルトのスタイルを設定することもできます。これには色、太さ、高さなどが含まれます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json new file mode 100644 index 00000000..52bb21f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "구분선 스타일", + "info": "주로 후손 Divider 타입 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Divider의 속성을 가져올 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme 사용", + "desc": [ + "속성 매개변수는 Divider와 유사하며, DividerTheme.of를 통해 구분선 테마 데이터를 가져올 수 있습니다.", + "또한 DividerTheme【후손】의 구분선에 기본 스타일을 설정할 수 있으며, 색상, 두께, 높이 등을 포함합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json new file mode 100644 index 00000000..7165907d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Estilo da Linha Divisória", + "info": "Principalmente utilizado para definir propriedades padrão para componentes do tipo Divider descendentes, também pode ser usado para obter as propriedades padrão do Divider.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DividerTheme", + "desc": [ + "Os parâmetros de propriedade são semelhantes ao Divider, os dados do tema da linha divisória podem ser obtidos através de DividerTheme.of, \"", + "também pode definir o estilo padrão para as linhas divisórias dos descendentes do DividerTheme, incluindo cor, espessura, altura, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json new file mode 100644 index 00000000..efb2c0a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Стиль разделителя", + "info": "В основном используется для установки стандартных свойств для компонентов типа Divider для потомков, также можно получить свойства стандартного Divider через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DividerTheme", + "desc": [ + "Параметры свойств аналогичны Divider, можно получить данные темы разделителя через DividerTheme.of, \"", + "также можно установить стандартный стиль для разделителей потомков DividerTheme, включая цвет, толщину, высоту и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json new file mode 100644 index 00000000..14fdb4f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "分割线样式", + "info": "主要用于为后代的Divider类型组件统一设置默认属性,也可以通过该组件获取默认Divider的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme使用", + "desc": [ + "属性参数与Divider类似,可以通过DividerTheme.of获取分割线主题数据,\"", + "也可以为DividerTheme【后代】的分割线设置默认样式,包括颜色、粗细、高度等。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart new file mode 100644 index 00000000..e7ebf6bc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + + + +class DividerThemeDemo extends StatelessWidget { + const DividerThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return DividerTheme( + data: const DividerThemeData( + color: Colors.orange, + thickness: 2, + space: 10, + indent: 10, + endIndent: 10, + ), + child: Wrap( + spacing: 10, + children: [ + const Divider(), + const Divider(), + const Divider(), + const Divider(), + const Divider(), + SizedBox( + height: 100, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: const [ + VerticalDivider(), + VerticalDivider(), + VerticalDivider(), + VerticalDivider(), + VerticalDivider(), + ], + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json new file mode 100644 index 00000000..244d7375 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Dropdown-Schaltfläche Unterstreichung ausblenden", + "info": "Wird verwendet, um die Unterstreichung der Dropdown-Schaltfläche zu entfernen, hat an sich keinen praktischen Nutzen.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json new file mode 100644 index 00000000..282aa47e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Dropdown Button Hide Underline", + "info": "Used to remove the underline of the DropdownButton, it has little practical value.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline Usage", + "desc": [ + "【child】 : Child component 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json new file mode 100644 index 00000000..df48e9dd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Botón desplegable ocultar subrayado", + "info": "Se utiliza para eliminar el subrayado de DropdownButton, en sí no tiene mucho valor práctico.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DropDownButtonHideUnderline", + "desc": [ + "【child】 : Componente hijo 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json new file mode 100644 index 00000000..d285d584 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Bouton déroulant masquer le soulignement", + "info": "Utilisé pour supprimer le soulignement du DropdownButton, il n'a pas beaucoup de valeur pratique en soi.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DropDownButtonHideUnderline", + "desc": [ + "【child】 : Composant enfant 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json new file mode 100644 index 00000000..1f43b003 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Pulsante a discesa nascondi sottolineatura", + "info": "Utilizzato per rimuovere la sottolineatura del DropdownButton, di per sé non ha un grande valore applicativo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di DropDownButtonHideUnderline", + "desc": [ + "【child】 : componente figlio 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json new file mode 100644 index 00000000..ede68d69 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "ドロップダウンボタンの下線を非表示", + "info": "DropdownButtonの下線を除去するために使用されますが、それ自体にはあまり実用的な価値はありません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderlineの使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json new file mode 100644 index 00000000..9314420e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "드롭다운 버튼 숨김 선", + "info": "DropdownButton의 밑줄을 제거하는 데 사용되며, 그 자체로는 큰 활용 가치가 없습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json new file mode 100644 index 00000000..c46534b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Botão de Dropdown Ocultar Sublinhado", + "info": "Usado para remover o sublinhado do DropdownButton, por si só não tem grande valor prático.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DropDownButtonHideUnderline", + "desc": [ + "【child】 : Componente filho 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json new file mode 100644 index 00000000..c38d0924 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Кнопка выпадающего списка скрыть подчеркивание", + "info": "Используется для удаления подчеркивания у DropdownButton, само по себе не имеет практической ценности.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DropDownButtonHideUnderline", + "desc": [ + "【child】 : Дочерний компонент 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json new file mode 100644 index 00000000..d1efe39b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "下拉按钮隐藏线", + "info": "用于去除DropdownButton的下划线,本身没有什么应用价值。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline使用", + "desc": [ + "【child】 : 子组件 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart new file mode 100644 index 00000000..b650621f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomDropDownButtonHideUnderline extends StatefulWidget { + const CustomDropDownButtonHideUnderline({Key? key}) : super(key: key); + + @override + _CustomDropDownButtonHideUnderlineState createState() => + _CustomDropDownButtonHideUnderlineState(); +} + +class _CustomDropDownButtonHideUnderlineState + extends State { + Color _color = Colors.red; + final List _colors = const[ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + DropdownButtonHideUnderline( + child: DropdownButton( + value: _color, + elevation: 1, + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (Color? color) => + setState(() => _color = color ?? _color)), + ), + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json new file mode 100644 index 00000000..4376d143 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Erweitertes Widget", + "info": "Die übergeordnete Klasse ist Flexible, entspricht einem Flexible-Widget mit dem Fit-Typ tight. Kann verschachtelte Kinder verwenden, um den verbleibenden Platz zu erweitern.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Expanded", + "desc": [ + "【child】 : Kind 【Widget】", + "【flex】 : Verhältnis der verbleibenden Platzverteilung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json new file mode 100644 index 00000000..916e4044 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Extended Component", + "info": "The parent class is Flexible, equivalent to a Flexible component with a fit type of tight. It can nest children to utilize the remaining space to extend the placeholder space.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Expanded", + "desc": [ + "【child】: child 【Widget】", + "【flex】: Proportion of remaining space allocation 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json new file mode 100644 index 00000000..d363072b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Expandido", + "info": "La clase padre es Flexible, equivalente a un componente Flexible con un tipo fit tight. Puede anidar hijos para expandir el espacio de marcador utilizando el espacio restante.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Expanded", + "desc": [ + "【child】 : hijo 【Widget】", + "【flex】 : proporción de asignación de espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json new file mode 100644 index 00000000..03bfcd0a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Composant Étendu", + "info": "La classe parente est Flexible, équivalente à un composant Flexible avec un fit de type tight. Peut imbriquer des enfants pour utiliser l'espace restant pour étendre l'espace de placement.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Expanded", + "desc": [ + "【child】 : Enfant 【Widget】", + "【flex】 : Proportion de distribution de l'espace restant 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json new file mode 100644 index 00000000..b0272f3c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Esteso", + "info": "La classe genitore è Flexible, equivalente a un componente Flexible con tipo fit tight. Può annidare figli per espandere lo spazio occupato utilizzando lo spazio rimanente.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Expanded", + "desc": [ + "【child】 : figlio 【Widget】", + "【flex】 : percentuale di allocazione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json new file mode 100644 index 00000000..39719a02 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "拡張コンポーネント", + "info": "親クラスはFlexibleで、fitタイプがtightのFlexibleコンポーネントに相当します。ネストされた子要素が残りのスペースを使用して占有スペースを拡張します。", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expandedの基本的な使用法", + "desc": [ + "【child】 : 子要素 【Widget】", + "【flex】 : 残りスペースの配分比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json new file mode 100644 index 00000000..5ae804d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "확장 컴포넌트", + "info": "부모 클래스는 Flexible이며, fit 타입이 tight인 Flexible 컴포넌트와 동일합니다. 자식을 중첩하여 남은 공간을 사용하여 공간을 확장할 수 있습니다.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expanded 기본 사용법", + "desc": [ + "【child】 : 자식 【Widget】", + "【flex】 : 남은 공간 배분 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json new file mode 100644 index 00000000..3831e473 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Expandido", + "info": "A classe pai é Flexible, equivalente a um componente Flexible com o tipo fit como tight. Pode aninhar filhos para utilizar o espaço restante e expandir o espaço ocupado.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Expanded", + "desc": [ + "【child】 : filho 【Widget】", + "【flex】 : proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json new file mode 100644 index 00000000..3873c103 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Расширяемый компонент", + "info": "Родительский класс - Flexible, эквивалент компоненту Flexible с типом fit tight. Может вкладывать дочерние элементы для расширения занимаемого пространства.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Expanded", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json new file mode 100644 index 00000000..c6ddf83a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "延展组件", + "info": "父类是Flexible,相当于一个fit类型为tight的Flexible组件。可嵌套孩子利用剩余空间对占位空间进行延展。", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expanded基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart new file mode 100644 index 00000000..b642cf5b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart @@ -0,0 +1,46 @@ + import 'package:flutter/material.dart'; +import 'package:widgets/utils/color_utils.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomExpended extends StatefulWidget { + const CustomExpended({Key? key}) : super(key: key); + + @override + _CustomExpendedState createState() => _CustomExpendedState(); +} + +class _CustomExpendedState extends State { + @override + Widget build(BuildContext context) { + return Column( + children: [ + buildRow([0, 0, 0]), + const SizedBox(height: 10,), + buildRow([0, 0, 1]), + const SizedBox(height: 10,), + buildRow([1, 1, 1]), + const SizedBox(height: 10,), + buildRow([2, 3, 3]), + ], + ); + } + + Widget buildRow(List num) { + return Row( + children: num.map((e) => Expanded( + flex: e, + child: Container( + alignment: Alignment.center, + width: 50, + height: 50, + color: ColorUtils.randomColor(), + child: Text( + 'flex=$e', + style: const TextStyle(color: Colors.white), + ), + ), + )).toList()); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json new file mode 100644 index 00000000..faa0e1ff --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Flexible Komponente", + "info": "Kann nur in Row-, Column- und Flex-Layouts verwendet werden, kann Kinder verschachteln, um den verbleibenden Platz zu nutzen und den Platzhalterbereich zu erweitern, kann auch den Anpassungstyp angeben.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Flexible", + "desc": [ + "【child】 : Kind 【Widget】", + "【fit】 : Anpassungsmodus*2 【FlexFit】", + "【flex】 : Anteil der verbleibenden Platzverteilung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json new file mode 100644 index 00000000..db2399ef --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Flexible Component", + "info": "Can only be used in Row, Column, and Flex layouts. It can nest children to utilize the remaining space to extend the placeholder space, and the adaptation type can also be specified.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Flexible", + "desc": [ + "【child】: child 【Widget】", + "【fit】: adaptation mode*2 【FlexFit】", + "【flex】: remaining space allocation ratio 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json new file mode 100644 index 00000000..39e613ca --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Componente Flexible", + "info": "Solo se puede usar en diseños Row, Column y Flex, puede anidar hijos para extender el espacio de marcador de posición utilizando el espacio restante, también se puede especificar el tipo de adaptación.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Flexible", + "desc": [ + "【child】 : hijo 【Widget】", + "【fit】 : modo de adaptación*2 【FlexFit】", + "【flex】 : proporción de asignación de espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json new file mode 100644 index 00000000..0c271f94 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Composant Flexible", + "info": "Peut uniquement être utilisé dans les dispositions Row, Column et Flex, peut imbriquer des enfants pour étendre l'espace résiduel, et peut également spécifier le type d'adaptation.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Flexible", + "desc": [ + "【child】 : Enfant 【Widget】", + "【fit】 : Mode d'adaptation*2 【FlexFit】", + "【flex】 : Proportion de l'allocation de l'espace résiduel 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json new file mode 100644 index 00000000..25a628db --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Componente Flessibile", + "info": "Può essere utilizzato solo nei layout Row, Column e Flex, può annidare figli per espandere lo spazio rimanente, e può anche specificare il tipo di adattamento.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Flexible", + "desc": [ + "【child】 : Figlio 【Widget】", + "【fit】 : Modalità di adattamento*2 【FlexFit】", + "【flex】 : Percentuale di allocazione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json new file mode 100644 index 00000000..3ed301db --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "フレキシブルコンポーネント", + "info": "Row、Column、Flexレイアウトでのみ使用可能で、ネストされた子要素を使用して残りのスペースを拡張したり、適応タイプを指定したりできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexibleの基本使用", + "desc": [ + "【child】 : 子要素 【Widget】", + "【fit】 : 適応モード*2 【FlexFit】", + "【flex】 : 残りスペースの分配比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json new file mode 100644 index 00000000..d683f4c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "유연한 컴포넌트", + "info": "Row, Column 및 Flex 레이아웃에서만 사용할 수 있으며, 자식을 중첩하여 남은 공간을 확장하거나 적응 유형을 지정할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexible 기본 사용법", + "desc": [ + "【child】 : 자식 【Widget】", + "【fit】 : 적응 모드*2 【FlexFit】", + "【flex】 : 남은 공간 할당 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json new file mode 100644 index 00000000..acd61655 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexível", + "localName": "Componente Flexível", + "info": "Só pode ser usado em layouts Row, Column e Flex, pode aninhar filhos para estender o espaço de preenchimento utilizando o espaço restante, e também pode especificar o tipo de ajuste.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Flexible", + "desc": [ + "【child】 : filho 【Widget】", + "【fit】 : modo de ajuste*2 【FlexFit】", + "【flex】 : proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json new file mode 100644 index 00000000..4a71dd91 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Гибкий компонент", + "info": "Может использоваться только в макетах Row, Column и Flex, может вкладывать дочерние элементы для расширения занимаемого пространства с использованием оставшегося пространства, также можно указать тип адаптации.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Flexible", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【fit】 : Режим адаптации*2 【FlexFit】", + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json new file mode 100644 index 00000000..4c7ff0ad --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "灵活组件", + "info": "只能用于只能用于Row、Column和Flex布局中,可嵌套孩子利用剩余空间对占位空间进行延展,也可指定适应类型。", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexible基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【fit】 : 适应模式*2 【FlexFit】", + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart new file mode 100644 index 00000000..39fd82d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomFlexible extends StatefulWidget { + const CustomFlexible({Key? key}) : super(key: key); + + @override + _CustomFlexibleState createState() => _CustomFlexibleState(); +} + +class _CustomFlexibleState extends State { + double _width = 300.0; + bool _loose = false; + + @override + Widget build(BuildContext context) { + return Column(children: [ + Container( + color: Colors.grey.withAlpha(33), + width: _width, + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Flexible( + flex: 2, + child: Container( + alignment: Alignment.center, + height: 50, + color: Colors.red, + child: const Text( + 'flex=2', + style: TextStyle(color: Colors.white), + ), + ), + ), + Flexible( + flex: 3, + child: Container( + alignment: Alignment.center, + height: 50, + color: Colors.blue, + child: const Text( + 'flex=3', + style: TextStyle(color: Colors.white), + ), + ), + ), + Flexible( + flex: 4, + fit: _loose?FlexFit.loose:FlexFit.tight, + child: Container( + constraints: const BoxConstraints(maxWidth: 60), + alignment: Alignment.center, + height: 50, + color: Colors.green, + child: Text( + 'flex=4 \nfit:${_loose?'loose':'tight'}', + style: const TextStyle(color: Colors.white), + ), + ), + ) + ], + )), + _buildOp() + ]); + } + + Widget _buildOp() => Row( + children: [ + Switch( + value: _loose, + onChanged: (v) => setState(() => _loose = v)), + Expanded( + child: Slider( + divisions: 10, + min: 100, + max: 350, + value: _width, + onChanged: (v) => setState(() => _width = v)), + ), + ], + ); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json new file mode 100644 index 00000000..0e9d23ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Icon-Stil", + "info": "Kann ein Kind aufnehmen und den Standardstil für die Icons der Nachkommen festlegen. Wird häufig verwendet, um den Stil mehrerer gleicher Icons zu vereinheitlichen und die individuelle Einstellung zu vermeiden.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von IconTheme", + "desc": [ + "Kann die Icon-Themen-Daten über IconTheme.of abrufen und den Standardstil für die Icon-Komponenten der Nachkommen von IconTheme festlegen, einschließlich Farbe, Transparenz und Größe." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json new file mode 100644 index 00000000..5fbd6356 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Icon Style", + "info": "Can accommodate one child, specifying the default style for the descendant icons. Commonly used to unify the styles of multiple identical icons, avoiding setting them one by one.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme Usage", + "desc": [ + "You can obtain the icon theme data through IconTheme.of, or set the default style for the icon components of IconTheme【descendants】, including color, opacity, and size." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json new file mode 100644 index 00000000..74294a70 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema de iconos", + "info": "Puede contener un hijo y especifica un estilo predeterminado para los iconos de los descendientes. Se usa comúnmente para unificar el estilo de múltiples iconos idénticos, evitando configurarlos uno por uno.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de IconTheme", + "desc": [ + "Puede obtener los datos del tema de iconos a través de IconTheme.of, y también puede establecer un estilo predeterminado para los componentes de iconos de los descendientes de IconTheme, incluyendo color, transparencia y tamaño." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json new file mode 100644 index 00000000..1f050871 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Thème d'icône", + "info": "Peut contenir un enfant, spécifie le style par défaut pour les icônes des descendants. Souvent utilisé pour unifier le style de plusieurs icônes identiques, évitant ainsi de les configurer une par une.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de IconTheme", + "desc": [ + "Vous pouvez obtenir les données du thème d'icône via IconTheme.of, ou définir un style par défaut pour les composants d'icône des descendants de IconTheme, y compris la couleur, la transparence et la taille." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json new file mode 100644 index 00000000..9a7ab28f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema Icona", + "info": "Può contenere un figlio, specifica lo stile predefinito per le icone dei discendenti. Comunemente utilizzato per uniformare lo stile di più icone identiche, evitando di impostarle una per una.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di IconTheme", + "desc": [ + "È possibile ottenere i dati del tema dell'icona tramite IconTheme.of, oppure impostare lo stile predefinito per i componenti icona dei discendenti di IconTheme, inclusi colore, trasparenza e dimensione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json new file mode 100644 index 00000000..9445365c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "アイコンテーマ", + "info": "子要素を1つ持つことができ、子孫のアイコンのデフォルトスタイルを指定します。複数の同じアイコンのスタイルを統一し、個別に設定する手間を省くために使用されます。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconThemeの使用", + "desc": [ + "IconTheme.ofを使用してアイコンテーマデータを取得できます。また、IconThemeの【子孫】のアイコンコンポーネントにデフォルトのスタイル(色、透明度、サイズ)を設定できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json new file mode 100644 index 00000000..329848a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "아이콘 스타일", + "info": "하나의 자식을 포함할 수 있으며, 후손 아이콘의 기본 스타일을 지정합니다. 여러 동일한 아이콘의 스타일을 통일하고, 일일이 설정하는 것을 방지하는 데 자주 사용됩니다.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme 사용", + "desc": [ + "IconTheme.of를 통해 아이콘 테마 데이터를 얻을 수 있으며, IconTheme의 후손 아이콘 컴포넌트에 기본 스타일(색상, 투명도, 크기 등)을 설정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json new file mode 100644 index 00000000..002df5ed --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema de Ícones", + "info": "Pode conter um filho, especificando o estilo padrão para ícones descendentes. Frequentemente usado para unificar o estilo de vários ícones idênticos, evitando a configuração individual.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do IconTheme", + "desc": [ + "Pode obter os dados do tema do ícone através de IconTheme.of, e também pode definir o estilo padrão para componentes de ícone descendentes de IconTheme, incluindo cor, transparência e tamanho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json new file mode 100644 index 00000000..97124925 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Тема иконок", + "info": "Может содержать один дочерний элемент, задающий стиль по умолчанию для иконок потомков. Часто используется для унификации стиля нескольких одинаковых иконок, чтобы избежать индивидуальной настройки.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование IconTheme", + "desc": [ + "Можно получить данные темы иконок через IconTheme.of, а также установить стиль по умолчанию для иконок-потомков IconTheme, включая цвет, прозрачность и размер." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json new file mode 100644 index 00000000..945968e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "图标样式", + "info": "可容纳一个孩子,为后代的图标指定默认样式。常用于多个相同图标的样式统一,避免一一设置。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme使用", + "desc": [ + "可以通过IconTheme.of获取图标主题数据,也可以为IconTheme【后代】的图标组件设置默认样式,包括颜色、透明度、尺寸。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart new file mode 100644 index 00000000..19a60976 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + +class IconThemeDemo extends StatelessWidget { + const IconThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return IconTheme( + data: const IconThemeData( + color: Colors.purple, + opacity: 1.0, + size: 30 + ), + child: Wrap( + spacing: 10, + children: const[ + Icon(Icons.add), + Icon(Icons.ac_unit), + Icon(Icons.g_translate), + Icon(Icons.remove) + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json new file mode 100644 index 00000000..7001d683 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Gemeinsames Modell", + "info": "Es ist eine abstrakte Unterklasse von InheritedWidget, die Daten über den Kontext an den Unterbaum weiterleitet und die Granularität der Abhängigkeitsbenachrichtigung über den Aspekt Aspect steuert.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von InheritedModel", + "desc": [ + "【child】: Unterkomponente 【Widget】", + "Unten ist ein benutzerdefiniertes InheritedModel, das die gemeinsame Nutzung von Daten im Unterbaum implementiert; und definiert zwei Aspekte, Farbe und Wert, um die Granularität der Abhängigkeitsbenachrichtigung zu steuern." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json new file mode 100644 index 00000000..3f2d6164 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Shared Model", + "info": "It is an abstract subclass of InheritedWidget, which passes data to the subtree through context and controls the granularity of dependency notifications through Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel Usage", + "desc": [ + "【child】: child component 【Widget】", + "Below is a custom InheritedModel that implements subtree sharing of data; and defines two aspects, color and value, to control the granularity of dependency notifications." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json new file mode 100644 index 00000000..b257f274 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modelo Compartido", + "info": "Es una subclase abstracta de InheritedWidget, que pasa datos al subárbol a través del contexto y controla la granularidad de las notificaciones de dependencia a través del aspecto Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de InheritedModel", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "A continuación se muestra un InheritedModel personalizado que implementa el intercambio de datos en el subárbol; y define dos aspectos, color y valor, para controlar la granularidad de las notificaciones de dependencia." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json new file mode 100644 index 00000000..9d7d8fe9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modèle partagé", + "info": "Il s'agit d'une sous-classe abstraite de InheritedWidget, qui transmet des données au sous-arbre via le contexte, et contrôle la granularité des notifications de dépendance via l'aspect Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de InheritedModel", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Voici un InheritedModel personnalisé, qui permet le partage de données dans le sous-arbre ; et définit deux aspects, la couleur et la valeur, pour contrôler la granularité des notifications de dépendance." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json new file mode 100644 index 00000000..cf2406c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modello Condiviso", + "info": "È una sottoclasse astratta di InheritedWidget, che passa i dati al sottoalbero tramite il contesto e controlla la granularità delle notifiche di dipendenza attraverso l'aspetto Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di InheritedModel", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Di seguito è riportato un InheritedModel personalizzato che implementa la condivisione dei dati nel sottoalbero; e definisce due aspetti, colore e valore, per controllare la granularità delle notifiche di dipendenza." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json new file mode 100644 index 00000000..f90449e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "共有モデル", + "info": "これは InheritedWidget の抽象サブクラスで、context を介してサブツリーにデータを渡し、Aspect の側面を介して依存通知の粒度を制御します。", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel の使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "以下はカスタム InheritedModel で、データのサブツリー共有を実装し、色と数値の二つの側面を定義して、依存通知の粒度を制御します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json new file mode 100644 index 00000000..f2cf7ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "공유 모델", + "info": "이것은 InheritedWidget 추상 서브클래스로, context를 통해 서브트리에 데이터를 전달하고 Aspect 측면을 통해 의존성 알림의 세분화를 제어합니다.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "다음은 사용자 정의 InheritedModel로, 데이터의 서브트리 공유를 구현하고 색상과 값 두 가지 측면을 정의하여 의존성 알림의 세분화를 제어합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json new file mode 100644 index 00000000..b5735a27 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modelo Compartilhado", + "info": "É uma subclasse abstrata de InheritedWidget, que transmite dados para a subárvore através do context e controla a granularidade das notificações de dependência através do Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do InheritedModel", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Abaixo está um InheritedModel personalizado, que implementa o compartilhamento de dados na subárvore; e define dois aspectos, cor e valor, para controlar a granularidade das notificações de dependência." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json new file mode 100644 index 00000000..cc19d1a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Общая модель", + "info": "Это абстрактный подкласс InheritedWidget, который передает данные в поддерево через context и управляет гранулярностью уведомлений о зависимостях через аспект Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование InheritedModel", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Ниже приведен пример пользовательского InheritedModel, который реализует обмен данными в поддереве; а также определяет два аспекта: цвет и значение, чтобы управлять гранулярностью уведомлений о зависимостях." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json new file mode 100644 index 00000000..cd3566fa --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "共享模型", + "info": "它是 InheritedWidget 抽象子类,通过 context 向子树传递数据,并通过 Aspect 方面控制依赖通知的粒度。", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "下面是一个自定义 InheritedModel,实现数据的子树共享;并且定义颜色和数值两个方面,控制依赖通知的粒度。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart new file mode 100644 index 00000000..6516f3b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart @@ -0,0 +1,251 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class InheritedModelDemo extends StatefulWidget { + const InheritedModelDemo({super.key}); + + @override + State createState() => _InheritedModelDemoState(); +} + +class _InheritedModelDemoState extends State { + int _counter = 0; + late Color _color = colors.first; + + final List colors = const [ + Colors.black, + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.indigo, + Colors.purple, + ]; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _CircleIconButton( + color: Colors.green, + icon: Icons.remove, + onPressed: _decrease, + ), + CounterModel( + color: _color, + counter: _counter, + child: const _BoxDecorationWrap(), + ), + _CircleIconButton( + color: Colors.blue, + icon: Icons.add, + onPressed: _increase, + ), + ], + ), + const SizedBox(height: 20), + _ColorSelector( + colors: colors, + activeColor: _color, + onSelect: _onSelectColor, + ) + ], + ); + } + + void _increase() { + setState(() => _counter += 1); + } + + void _decrease() { + setState(() => _counter -= 1); + } + + void _onSelectColor(Color value) { + setState(() { + _color = value; + }); + } +} +enum CounterAspect { color, value } + +class CounterModel extends InheritedModel { + const CounterModel({ + super.key, + this.color, + this.counter, + required super.child, + }); + + final Color? color; + final int? counter; + + static CounterModel? of(BuildContext context,CounterAspect aspect){ + return InheritedModel.inheritFrom(context, aspect: aspect); + } + + @override + bool updateShouldNotify(CounterModel oldWidget) { + return color != oldWidget.color || counter != oldWidget.counter; + } + + @override + bool updateShouldNotifyDependent(CounterModel oldWidget, Set dependencies) { + if (color != oldWidget.color && dependencies.contains(CounterAspect.color)) { + return true; + } + if (counter != oldWidget.counter && dependencies.contains(CounterAspect.value)) { + return true; + } + return false; + } +} + +class _CircleIconButton extends StatelessWidget { + final Color color; + final IconData icon; + final VoidCallback onPressed; + + const _CircleIconButton( + {super.key, + required this.color, + required this.icon, + required this.onPressed}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + decoration: const BoxDecoration( + color: Color(0xFFDFDFDF), + shape: BoxShape.circle, + ), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Icon( + icon, + color: Colors.white, + size: 16, + ), + ), + ), + ), + ); + } +} + +class _ColorSelector extends StatelessWidget { + final List colors; + final ValueChanged onSelect; + final Color activeColor; + + const _ColorSelector({ + super.key, + required this.colors, + required this.activeColor, + required this.onSelect, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: colors + .map((e) => GestureDetector( + onTap: () => onSelect(e), + child: _buildCircle(e), + )) + .toList(), + ); + } + + Widget _buildCircle(Color color) { + return CircleAvatar( + radius: 12, + child: color == activeColor + ? const Icon( + Icons.check, + color: Colors.white, + size: 16, + ) + : null, + backgroundColor: color, + ); + } +} + +class _BoxDecorationWrap extends StatefulWidget { + const _BoxDecorationWrap({super.key}); + + @override + State<_BoxDecorationWrap> createState() => _BoxDecorationWrapState(); +} + +class _BoxDecorationWrapState extends State<_BoxDecorationWrap> { + + @override + void didChangeDependencies() { + print("======BoxDecorationWrap#didChangeDependencies========="); + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + final Color color = CounterModel.of(context,CounterAspect.color)?.color ?? Colors.black; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: const _CounterText(), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: color), + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: color, + spreadRadius: 2, + blurRadius: 8, + offset: const Offset(0, 0)) + ]), + ); + } +} + +class _CounterText extends StatefulWidget { + const _CounterText({super.key}); + + @override + State<_CounterText> createState() => _CounterTextState(); +} + +class _CounterTextState extends State<_CounterText> { + @override + void didChangeDependencies() { + print("======CounterText#didChangeDependencies========="); + super.didChangeDependencies(); + } + @override + Widget build(BuildContext context) { + final Color color = CounterModel.of(context,CounterAspect.color)?.color ?? Colors.black; + final int counter = CounterModel.of(context,CounterAspect.value)?.counter ?? 0; + return Text( + "Counter = $counter", + style: TextStyle(color: color,fontWeight: FontWeight.bold), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json new file mode 100644 index 00000000..201bc84a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Vererbungsthema", + "info": "Es ist eine abstrakte Klasse mit vielen XXXTheme-bezogenen Unterklassen, die verwendet werden, um Eigenschaften wie Farben und Textstile zu definieren und diese Eigenschaften in Unterbäumen gemeinsam zu nutzen.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in InheritedTheme", + "desc": [ + "InheritedTheme.capture kann das übergeordnete Thema erfassen und ein CapturedThemes-Objekt erhalten, durch dessen wrap-Methode das erfasste Thema routenübergreifend verwendet werden kann.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json new file mode 100644 index 00000000..1dce38c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Inherited Theme", + "info": "It is an abstract class with many XXXTheme related subclasses, used to define properties such as colors and text styles, and share these properties in the subtree.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to InheritedTheme", + "desc": [ + "InheritedTheme.capture can capture the upper theme, obtain the CapturedThemes object, and use the captured theme across routes through the wrap method of this object.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json new file mode 100644 index 00000000..bd1c9c21 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema Heredado", + "info": "Es una clase abstracta con muchas subclases relacionadas con XXXTheme, utilizadas para definir propiedades como colores, estilos de texto, etc., y compartir estas propiedades en el subárbol.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a InheritedTheme", + "desc": [ + "InheritedTheme.capture puede capturar el tema superior y obtener un objeto CapturedThemes, a través del cual el método wrap puede usar el tema capturado entre rutas.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json new file mode 100644 index 00000000..d2511a09 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Thème Hérité", + "info": "C'est une classe abstraite, avec de nombreuses sous-classes XXXTheme associées, utilisées pour définir des propriétés telles que les couleurs, les styles de texte, etc., et partager ces propriétés dans l'arbre de sous-éléments.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à InheritedTheme", + "desc": [ + "InheritedTheme.capture peut capturer le thème supérieur, obtenir un objet CapturedThemes, et utiliser la méthode wrap de cet objet pour utiliser le thème capturé à travers les routes.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json new file mode 100644 index 00000000..b7d18dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema Ereditato", + "info": "È una classe astratta, con molte sottoclassi correlate a XXXTheme, utilizzate per definire proprietà come colori, stili di testo, ecc., e condividere queste proprietà all'interno del sottoalbero.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a InheritedTheme", + "desc": [ + "InheritedTheme.capture può catturare il tema superiore, ottenendo un oggetto CapturedThemes, attraverso il metodo wrap di questo oggetto è possibile utilizzare il tema catturato attraverso le rotte.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json new file mode 100644 index 00000000..37d3da27 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "継承テーマ", + "info": "これは抽象クラスで、非常に多くの XXXTheme 関連のサブクラスがあり、色やテキストスタイルなどの属性を定義し、サブツリー内でこれらの属性を共有するために使用されます。", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 紹介", + "desc": [ + "InheritedTheme.capture を使用して上位のテーマをキャプチャし、CapturedThemes オブジェクトを取得できます。このオブジェクトの wrap メソッドを使用して、キャプチャしたテーマをルート間で使用できます。", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json new file mode 100644 index 00000000..8d0752a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "전통 테마", + "info": "추상 클래스이며, 많은 XXXTheme 관련 하위 클래스가 있어 색상, 텍스트 스타일 등의 속성을 정의하고 하위 트리에서 이러한 속성을 공유합니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 소개", + "desc": [ + "InheritedTheme.capture는 상위 테마를 캡처하여 CapturedThemes 객체를 가져올 수 있으며, 이 객체의 wrap 메서드를 통해 캡처한 테마를 라우터 간에 사용할 수 있습니다.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json new file mode 100644 index 00000000..7976fa9f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema de Herança", + "info": "É uma classe abstrata, com muitas subclasses relacionadas a XXXTheme, usadas para definir propriedades como cores, estilos de texto, etc., e compartilhar essas propriedades na subárvore.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao InheritedTheme", + "desc": [ + "InheritedTheme.capture pode capturar o tema superior, obter o objeto CapturedThemes, e através do método wrap desse objeto, o tema capturado pode ser usado entre rotas.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json new file mode 100644 index 00000000..c8f3df04 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Тема наследования", + "info": "Это абстрактный класс, имеющий множество связанных подклассов XXXTheme, используемых для определения таких свойств, как цвета, стили текста и т.д., которые затем используются в поддереве.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в InheritedTheme", + "desc": [ + "InheritedTheme.capture может захватывать тему верхнего уровня, получая объект CapturedThemes, через метод wrap которого можно использовать захваченную тему между маршрутами.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json new file mode 100644 index 00000000..c300aa9e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "传承主题", + "info": "它是抽象类,有非常多的 XXXTheme 相关子类,用于定义颜色、文字样式等属性,在子树中共享这些属性。", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 介绍", + "desc": [ + "InheritedTheme.capture 可以抓取上层主题,获取 CapturedThemes 对象,通过该对象 wrap 方法可以跨路由使用抓到的主题。", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart new file mode 100644 index 00000000..3fd4a5ee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class InheritedThemeDemo extends StatelessWidget { + const InheritedThemeDemo({super.key}); + + + @override + Widget build(BuildContext context) { + return const DefaultTextStyle( + style: TextStyle(fontSize: 24, color: Colors.blue), + child: TestBody(), + ); + } +} + +class TestBody extends StatelessWidget { + const TestBody({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + + return GestureDetector( + onTap: () => _toNextPage(context), + child: Container( + height: 60, + margin: const EdgeInsets.only(left: 40,right: 40), + alignment: Alignment.center, + color: Theme.of(context).primaryColor.withOpacity(0.1), + child: const Text('InheritedTheme'))); + } + + void _toNextPage(BuildContext context) { + // final NavigatorState navigator = Navigator.of(context); + // final CapturedThemes themes = + // InheritedTheme.capture(from: context, to: navigator.context); + // + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (BuildContext _) { + // return themes.wrap(Container( + // alignment: Alignment.center, + // color: Colors.white, + // child: Text('Flutter Unit'), + // )); + // }, + // ), + // ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json new file mode 100644 index 00000000..e23bcbe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Vererbte Komponente", + "info": "Diese Klasse ist eine abstrakte Klasse, deren Funktion darin besteht, Daten im aktuellen Kontext zu speichern und diese Daten in den Kontexten der nachfolgenden Knoten gemeinsam zu nutzen. Es gibt viele Implementierungsklassen, einschließlich verschiedener Themenkomponenten, MediaQuery usw.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Column", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】 : Textbaseline 【TextBaseline】", + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】 : Hauptachsengröße 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget Beispiel", + "desc": [ + "Unten wird die Verwendung der InheritedWidget-Komponente anhand eines Farbzählerprojekts gezeigt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json new file mode 100644 index 00000000..e3e3c0e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Inherited Widget", + "info": "This class is an abstract class, which can store data in this context and share that data in the context of its subsequent nodes. There are many implementation classes, including various theme components, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Column", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget Example", + "desc": [ + "Below is an example of using the InheritedWidget component through a color counter project." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json new file mode 100644 index 00000000..2a335a4b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Heredado", + "info": "Esta clase es una clase abstracta que permite almacenar datos en este contexto y compartirlos en los contextos de sus nodos subsiguientes. Tiene muchas clases de implementación, incluyendo varios componentes temáticos, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】 : Línea base del texto 【TextBaseline】", + "【verticalDirection】 : Dirección vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamaño del eje principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Ejemplo de InheritedWidget", + "desc": [ + "A continuación se muestra un proyecto de contador de colores que demuestra el uso del componente InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json new file mode 100644 index 00000000..0cba5d15 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Widget Hérité", + "info": "Cette classe est une classe abstraite, dont le rôle est de stocker des données dans ce contexte et de partager ces données dans les contextes des nœuds suivants. Il existe de nombreuses classes d'implémentation, y compris divers composants de thème, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Column", + "desc": [ + "【children】 : Liste de composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Exemple de InheritedWidget", + "desc": [ + "Ci-dessous, un projet de compteur de couleur illustre l'utilisation du composant InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json new file mode 100644 index 00000000..b8fa4f6c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Ereditato", + "info": "Questa classe è astratta e ha la funzione di memorizzare dati nel contesto corrente e condividerli nei contesti dei nodi successivi. Ci sono molte classi di implementazione, inclusi vari componenti tematici, MediaQuery, ecc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Column", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Esempio di InheritedWidget", + "desc": [ + "Di seguito è mostrato l'uso del componente InheritedWidget attraverso un progetto di contatore di colori." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json new file mode 100644 index 00000000..bff24ebe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "継承ウィジェット", + "info": "このクラスは抽象クラスで、このコンテキストにデータを保存し、その後のノードのコンテキストでそのデータを共有する役割を果たします。多くの実装クラスがあり、さまざまなテーマウィジェットやMediaQueryなどが含まれます。", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Columnの基本使用", + "desc": [ + "【children】 : ウィジェットリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸のサイズ 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget の使用例", + "desc": [ + "以下は、色カウンタープロジェクトを通じてInheritedWidgetウィジェットの使用を展示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json new file mode 100644 index 00000000..99daa4cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "상속 위젯", + "info": "이 클래스는 추상 클래스로, 본 컨텍스트에서 데이터를 저장하고, 그 후속 노드의 컨텍스트에서 해당 데이터를 공유할 수 있습니다. 다양한 구현 클래스가 있으며, 다양한 테마 위젯, MediaQuery 등이 포함됩니다.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Column 기본 사용", + "desc": [ + "【children】 : 위젯 리스트 【List】", + "【mainAxisAlignment】 : 메인 축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차 축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 수직 방향 【VerticalDirection】", + "【mainAxisSize】 : 메인 축 크기 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget 예제", + "desc": [ + "아래는 색상 카운터 프로젝트를 통해 InheritedWidget 위젯의 사용을 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json new file mode 100644 index 00000000..e56e8e50 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Herdado", + "info": "Esta classe é abstrata e tem a função de armazenar dados no contexto atual e compartilhar esses dados nos contextos dos nós subsequentes. Existem muitas classes de implementação, incluindo vários componentes temáticos, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Exemplo de InheritedWidget", + "desc": [ + "Abaixo está um projeto de contador de cores que demonstra o uso do componente InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json new file mode 100644 index 00000000..6c76cdeb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Наследуемый компонент", + "info": "Этот класс является абстрактным и используется для хранения данных в текущем контексте и совместного использования этих данных в контекстах последующих узлов. Существует множество реализаций этого класса, включая различные тематические компоненты, MediaQuery и другие.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Column", + "desc": [ + "【children】 : Список компонентов 【List】", + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】 : Базовая линия текста 【TextBaseline】", + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】 : Размер главной оси 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Пример использования InheritedWidget", + "desc": [ + "Ниже приведен пример использования компонента InheritedWidget в проекте счетчика цветов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json new file mode 100644 index 00000000..8b8f53f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "传承组件", + "info": "该类是抽象类,作用是可以在本上下文存储数据,在其后续节点的上下文中共享该数据。有很多实现类,包括各种主题组件、MediaQuery等。", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Column基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget 案例", + "desc": [ + "下面是通过一个颜色计数器项目展示 InheritedWidget 组件的使用。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart new file mode 100644 index 00000000..823cbb2c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + + +class InheritedWidgetDemo extends StatelessWidget { + final String info = + 'InheritedWidget 是一个抽象类,不可以直接使用。可以自定义对应共享数据的子类,如这里的通过 InfoInheritedWidget 实现:当前这段话可以在任意子树节点上下文获取。' + '一般都会定义一个 XXX.of(context) 的方法来获取数据,如 MediaQuery.of,Theme.of 等。'; + + const InheritedWidgetDemo({super.key}); + + @override + Widget build(BuildContext context) { + return InfoInheritedWidget( + info: info, + child: const InfoWidget(), + ); + } +} + +class InfoWidget extends StatelessWidget { + const InfoWidget({super.key}); + + @override + Widget build(BuildContext context) { + String info = InfoInheritedWidget.of(context)?.info??''; + + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} + +class InfoInheritedWidget extends InheritedWidget { + final String info; + + const InfoInheritedWidget({super.key,required this.info, required super.child}); + + @override + bool updateShouldNotify(covariant InfoInheritedWidget oldWidget) => + info != oldWidget.info; + + static InfoInheritedWidget? of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType(); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart new file mode 100644 index 00000000..4e2ec7d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart @@ -0,0 +1,218 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// +class InheritedWidgetDemo2 extends StatefulWidget { + const InheritedWidgetDemo2({super.key}); + + @override + State createState() => _InheritedWidgetDemo2State(); +} + +class InheritedCounter extends InheritedWidget { + const InheritedCounter({ + super.key, + this.color, + this.counter, + required super.child, + }); + + final Color? color; + final int? counter; + + static InheritedCounter? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(InheritedCounter oldWidget) { + return color != oldWidget.color || counter != oldWidget.counter; + } +} + +class _InheritedWidgetDemo2State extends State { + int _counter = 0; + late Color _color = colors.first; + + final List colors = const [ + Colors.black, + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.indigo, + Colors.purple, + ]; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleIconButton( + color: Colors.green, + icon: Icons.remove, + onPressed: _decrease, + ), + InheritedCounter( + color: _color, + counter: _counter, + child: const BoxDecorationWrap(), + ), + CircleIconButton( + color: Colors.blue, + icon: Icons.add, + onPressed: _increase, + ), + ], + ), + const SizedBox(height: 20), + ColorSelector( + colors: colors, + activeColor: _color, + onSelect: _onSelectColor, + ) + ], + ); + } + + void _increase() { + setState(() => _counter += 1); + } + + void _decrease() { + setState(() => _counter -= 1); + } + + void _onSelectColor(Color value) { + setState(() { + _color = value; + }); + } +} + +class CircleIconButton extends StatelessWidget { + final Color color; + final IconData icon; + final VoidCallback onPressed; + + const CircleIconButton( + {super.key, + required this.color, + required this.icon, + required this.onPressed}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + decoration: const BoxDecoration( + color: Color(0xFFDFDFDF), + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Icon( + icon, + color: Colors.white, + size: 16, + ), + ), + ), + ), + ); + } +} + +class ColorSelector extends StatelessWidget { + final List colors; + final ValueChanged onSelect; + final Color activeColor; + + const ColorSelector({ + super.key, + required this.colors, + required this.activeColor, + required this.onSelect, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: colors + .map((e) => GestureDetector( + onTap: () => onSelect(e), + child: _buildCircle(e), + )) + .toList(), + ); + } + + Widget _buildCircle(Color color) { + return CircleAvatar( + radius: 12, + child: color == activeColor + ? const Icon( + Icons.check, + color: Colors.white, + size: 16, + ) + : null, + backgroundColor: color, + ); + } +} + +class BoxDecorationWrap extends StatelessWidget { + const BoxDecorationWrap({super.key}); + + @override + Widget build(BuildContext context) { + final Color color = InheritedCounter.of(context)?.color ?? Colors.black; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: const CounterText(), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: color), + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: color, + spreadRadius: 2, + blurRadius: 8, + offset: const Offset(0, 0)) + ]), + ); + } +} + +class CounterText extends StatelessWidget { + const CounterText({super.key}); + + @override + Widget build(BuildContext context) { + final Color? color = InheritedCounter.of(context)?.color; + final int counter = InheritedCounter.of(context)?.counter??0; + return Text( + "Counter = $counter", + style: TextStyle(color: color,fontWeight: FontWeight.bold), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json new file mode 100644 index 00000000..e152f61f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Lebendig halten", + "info": "Ob der Zustand der Kinder in einer faul geladenen Liste lebendig gehalten werden soll. Ist die zugrunde liegende Implementierung von AutomaticKeepAlive und wird normalerweise nicht alleine verwendet.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in KeepAlive", + "desc": [ + "【child】 : *Kindkomponente 【Widget】", + "【keepAlive】 : *Ob lebendig gehalten wird 【bool】", + "In der Flutter-Framework-Ebene wird es nur in AutomaticKeepAlive verwendet, und im Quellcode wird auch gesagt, dass es selten alleine verwendet wird. Dieses Beispiel zeigt die Zustandserhaltung der ListView-Einträge." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json new file mode 100644 index 00000000..231bcbdb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Keep Alive", + "info": "Whether the state of the child needs to be kept alive in a lazy-loaded list. It is the underlying implementation of AutomaticKeepAlive and is generally not used alone.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to KeepAlive", + "desc": [ + "【child】: *Child component 【Widget】", + "【keepAlive】: *Whether to keep alive 【bool】", + "In the Flutter framework layer, it is only used in AutomaticKeepAlive. The source code also mentions that it is rarely used alone. This example demonstrates the state keep-alive of ListView items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json new file mode 100644 index 00000000..077935c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Mantener activo", + "info": "En listas de carga perezosa, si el estado de los hijos necesita mantenerse activo. Es la implementación subyacente de AutomaticKeepAlive, generalmente no se usa por separado.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a KeepAlive", + "desc": [ + "【child】 : *Componente hijo 【Widget】", + "【keepAlive】 : *Si se mantiene activo 【bool】", + "En la capa del framework de Flutter, solo se usa en AutomaticKeepAlive, y en el código fuente también se menciona que rara vez se usa por separado. Este ejemplo muestra cómo mantener activo el estado de los elementos de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json new file mode 100644 index 00000000..6ff230cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Maintenir en vie", + "info": "Dans une liste chargée de manière paresseuse, faut-il maintenir l'état de l'enfant en vie. C'est l'implémentation sous-jacente de AutomaticKeepAlive, généralement pas utilisé seul.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à KeepAlive", + "desc": [ + "【child】 : *composant enfant 【Widget】", + "【keepAlive】 : *maintenir en vie 【bool】", + "Dans la couche framework de Flutter, il est uniquement utilisé dans AutomaticKeepAlive, et le code source indique qu'il est rarement utilisé seul. Cet exemple montre la maintenance de l'état des éléments de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json new file mode 100644 index 00000000..b3ec17cb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Mantenimento Attivo", + "info": "In una lista caricata in modo lazy, lo stato del bambino deve essere mantenuto attivo. È l'implementazione sottostante di AutomaticKeepAlive e generalmente non viene utilizzato da solo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a KeepAlive", + "desc": [ + "【child】 : *componente figlio 【Widget】", + "【keepAlive】 : *se mantenere attivo 【bool】", + "Nel livello del framework Flutter, viene utilizzato solo in AutomaticKeepAlive, e il codice sorgente dice che è raramente usato da solo. Questo esempio mostra il mantenimento dello stato degli elementi di ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json new file mode 100644 index 00000000..77fce8d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "キープアライブ", + "info": "レイジーロードのリストで、子の状態をキープアライブする必要があるかどうか。AutomaticKeepAliveの基盤実装であり、通常は単独で使用しません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 紹介", + "desc": [ + "【child】 : *子コンポーネント 【Widget】", + "【keepAlive】 : *キープアライブするかどうか 【bool】", + "Flutterフレームワーク層では、AutomaticKeepAliveでのみ使用され、ソースコードでも単独で使用することはほとんどないとされています。この例は、ListViewアイテムの状態をキープアライブすることを示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json new file mode 100644 index 00000000..86a59289 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "유지", + "info": "지연 로딩된 목록에서 자식의 상태를 유지할 필요가 있는지 여부. AutomaticKeepAlive의 기본 구현이며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 소개", + "desc": [ + "【child】 : *자식 위젯 【Widget】", + "【keepAlive】 : *유지 여부 【bool】", + "flutter 프레임워크 레이어에서는 AutomaticKeepAlive에서만 사용되며, 소스 코드에서도 단독으로 사용하는 경우가 드물다고 언급합니다. 이 예제는 ListView 항목의 상태 유지를 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json new file mode 100644 index 00000000..91c0dfb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Manter Ativo", + "info": "Em listas de carregamento preguiçoso, se o estado da criança precisa ser mantido ativo. É a implementação subjacente do AutomaticKeepAlive, geralmente não usado separadamente.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao KeepAlive", + "desc": [ + "【child】 : *componente filho 【Widget】", + "【keepAlive】 : *se deve manter ativo 【bool】", + "Na camada de framework do flutter, é usado apenas no AutomaticKeepAlive, e o código-fonte também diz que raramente é usado separadamente. Este exemplo mostra a manutenção do estado dos itens da ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json new file mode 100644 index 00000000..79c4db41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Поддержание активности", + "info": "Нужно ли сохранять состояние дочерних элементов в лениво загружаемом списке. Это базовая реализация AutomaticKeepAlive, обычно не используется отдельно.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в KeepAlive", + "desc": [ + "【child】 : *Дочерний компонент 【Widget】", + "【keepAlive】 : *Сохранять ли активность 【bool】", + "На уровне фреймворка Flutter используется только в AutomaticKeepAlive, в исходном коде также сказано, что он редко используется отдельно. Этот пример демонстрирует поддержание состояния элементов ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json new file mode 100644 index 00000000..09a06bbb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "保活", + "info": "在懒加载的列表中,孩子的状态是否需要保活。是 AutomaticKeepAlive 的底层实现,一般不单独使用。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 介绍", + "desc": [ + "【child】 : *子组件 【Widget】", + "【keepAlive】 : *是否保活 【bool】", + "在 flutter 框架层中,只用于 AutomaticKeepAlive 中,源码中也说很少单独使用它。该示例展示出 ListView 条目的状态保活。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart new file mode 100644 index 00000000..d9b6a7a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class KeepAliveDemo extends StatelessWidget { + const KeepAliveDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: ListView.builder( + itemCount: data.length, + itemBuilder: (_, index) => ColorBox( + color: data[index], + index: index, + ), + ), + ); + } +} + +class ColorBox extends StatefulWidget { + final Color color; + final int index; + + const ColorBox({ + Key? key, + required this.color, + required this.index, + }) : super(key: key); + + @override + _ColorBoxState createState() => _ColorBoxState(); +} + +class _ColorBoxState extends State with AutomaticKeepAliveClientMixin { + bool _checked = false; + + @override + void initState() { + super.initState(); + _checked = false; + print('-----_ColorBoxState#initState---${widget.index}-------'); + } + + @override + void dispose() { + print('-----_ColorBoxState#dispose---${widget.index}-------'); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return Container( + alignment: Alignment.center, + height: 50, + color: widget.color, + child: Row( + children: [ + const SizedBox(width: 60), + Checkbox( + value: _checked, + onChanged: (bool? v) { + setState(() { + _checked = v??false; + }); + }, + ), + Text( + "index ${widget.index}: ${colorString(widget.color)}", + style: const TextStyle(color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ]), + ), + ], + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + @override + bool get wantKeepAlive => true; +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json new file mode 100644 index 00000000..a03631fa --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "LayoutId", + "info": "Kann nur in der CustomMultiChildLayout-Komponente verwendet werden, um die Identität ihrer Kindkomponenten zu kennzeichnen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Anwendungsfall von LayoutId", + "desc": [ + "【id】 : Identifikations-ID 【Object】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json new file mode 100644 index 00000000..8ea43570 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Layout Id", + "info": "Can only be used in the CustomMultiChildLayout component to identify its child components.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId Usage Scenarios", + "desc": [ + "【id】 : Identifier id 【Object】", + "【child】 : Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json new file mode 100644 index 00000000..41bbd70e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de diseño", + "info": "Solo se puede usar en el componente CustomMultiChildLayout para identificar a sus componentes hijos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Escenarios de uso de LayoutId", + "desc": [ + "【id】 : Identificador de id 【Object】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json new file mode 100644 index 00000000..15dc1be9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de mise en page", + "info": "Ne peut être utilisé que dans le composant CustomMultiChildLayout pour identifier ses enfants.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scénario d'utilisation de LayoutId", + "desc": [ + "【id】 : Identifiant 【Object】", + "【child】 : Enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json new file mode 100644 index 00000000..ca5ca444 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id Layout", + "info": "Può essere utilizzato solo nel componente CustomMultiChildLayout per identificare i suoi componenti figli.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scenario di utilizzo di LayoutId", + "desc": [ + "【id】 : ID identificativo 【Object】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json new file mode 100644 index 00000000..798aaf9c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "レイアウトId", + "info": "CustomMultiChildLayoutコンポーネント内でのみ使用でき、その子コンポーネントの識別に使用されます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutIdの使用シナリオ", + "desc": [ + "【id】 : 識別id 【Object】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json new file mode 100644 index 00000000..b7de4fba --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "레이아웃 Id", + "info": "CustomMultiChildLayout 컴포넌트에서만 사용할 수 있으며, 자식 컴포넌트의 신원을 식별하는 데 사용됩니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId 사용 사례", + "desc": [ + "【id】 : 식별 id 【Object】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json new file mode 100644 index 00000000..22315770 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de Layout", + "info": "Só pode ser usado no componente CustomMultiChildLayout para identificar os seus componentes filhos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cenários de uso do LayoutId", + "desc": [ + "【id】 : Identificador de id 【Object】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json new file mode 100644 index 00000000..263741ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Идентификатор макета", + "info": "Может использоваться только в компоненте CustomMultiChildLayout для идентификации его дочерних компонентов.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Сценарии использования LayoutId", + "desc": [ + "【id】 : Идентификатор 【Object】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json new file mode 100644 index 00000000..b9799fb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "布局Id", + "info": "只能用于CustomMultiChildLayout组件中,为其子组件标识身份。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId使用场景", + "desc": [ + "【id】 : 标识id 【Object】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart new file mode 100644 index 00000000..ce6b3179 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/6 +/// contact me by email 1981462002@qq.com + + + +class LayoutIdDemo extends StatelessWidget { + const LayoutIdDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: 300, + height: 150, + color: Colors.grey.withAlpha(33), + child: CustomMultiChildLayout( + delegate: CornerCustomMultiChildLayout( + padding:const EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5), + ), + children: [ + LayoutId(id: CornerType.topLeft, child: const Box50(Colors.red)), + LayoutId(id: CornerType.topRight, child: const Box50(Colors.yellow)), + LayoutId(id: CornerType.bottomLeft, child: const Box50(Colors.blue)), + LayoutId(id: CornerType.bottomRight, child: const Box50(Colors.green)), + ], + ), + ); + } +} + +// 50 颜色盒 +class Box50 extends StatelessWidget { + final Color color; + const Box50(this.color, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: 50, + height: 50, + color: color, + ); + } +} + + +enum CornerType{ + topLeft, + topRight, + bottomLeft, + bottomRight +} + + +class CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{ + final EdgeInsets padding; + + CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero}); + + @override + void performLayout(Size size) { + if (hasChild(CornerType.topLeft)) { + layoutChild(CornerType.topLeft, BoxConstraints.loose(size)); + positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top)); + } + if (hasChild(CornerType.topRight)) { + var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size)); + positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top)); + } + if (hasChild(CornerType.bottomLeft)) { + var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size)); + positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom)); + } + if (hasChild(CornerType.bottomRight)) { + var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size)); + positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom)); + } + } + + @override + bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding; +} + diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json new file mode 100644 index 00000000..7b9bbe12 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile-Thema", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für nachfolgende ListTile-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften von ListTile abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListTileTheme", + "desc": [ + "Kann die ListTileThemeData-Dateneigenschaften angeben, um Standardstile für nachfolgende ListTile-Komponenten festzulegen, wie Stile, Farben, Dekorationen, Ränder usw. Es kann auch ListTileTheme.of verwendet werden, um die Theme-Eigenschaften von ListTile abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json new file mode 100644 index 00000000..33c921b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile Theme", + "info": "Mainly used to set default properties for descendant ListTile components uniformly, and also to obtain the default properties of ListTile through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListTileTheme", + "desc": [ + "You can specify the ListTileThemeData properties to set default styles for descendant ListTile components, such as styles, colors, decorations, margins, etc. You can also use ListTileTheme.of to get the theme properties of ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json new file mode 100644 index 00000000..46b6a0d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema de ListTile", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes ListTile descendientes, y también se puede utilizar este componente para obtener las propiedades predeterminadas de ListTile.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListTileTheme", + "desc": [ + "Se puede especificar la propiedad de datos ListTileThemeData para establecer estilos predeterminados para los componentes ListTile descendientes, como estilos, colores, decoraciones, márgenes, etc. También se puede usar ListTileTheme.of para obtener las propiedades temáticas de ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json new file mode 100644 index 00000000..ecef7578 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Thème de ListTile", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants ListTile descendants de manière unifiée. Il est également possible d'obtenir les propriétés par défaut de ListTile via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListTileTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ListTileThemeData pour définir le style par défaut des composants ListTile descendants, tels que le style, la couleur, la décoration, la marge, etc. Vous pouvez également utiliser ListTileTheme.of pour obtenir les propriétés du thème de ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json new file mode 100644 index 00000000..e5586554 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema ListTile", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ListTile discendenti in modo uniforme, oppure per ottenere le proprietà predefinite di ListTile tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListTileTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di ListTileThemeData per impostare lo stile predefinito per i componenti ListTile discendenti, come stile, colore, decorazione, margine, ecc. Inoltre, è possibile utilizzare ListTileTheme.of per ottenere le proprietà del tema di ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json new file mode 100644 index 00000000..f6fe0cfd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTileテーマ", + "info": "主に子孫のListTileコンポーネントにデフォルトのプロパティを一括設定するために使用されます。また、このコンポーネントを通じてデフォルトのListTileのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileThemeの基本使用", + "desc": [ + "ListTileThemeDataデータプロパティを指定して、子孫のListTileコンポーネントにデフォルトのスタイル(スタイル、色、装飾、余白など)を設定できます。また、ListTileTheme.ofを使用してListTileのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json new file mode 100644 index 00000000..00696efc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile 테마", + "info": "주로 후손 ListTile 컴포넌트에 대한 기본 속성을 통일적으로 설정하는 데 사용되며, 이 컴포넌트를 통해 기본 ListTile의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileTheme 기본 사용", + "desc": [ + "ListTileThemeData 데이터 속성을 지정하여 【후손】 ListTile 컴포넌트에 대한 기본 스타일(스타일, 색상, 장식, 여백 등)을 설정할 수 있습니다. ListTileTheme.of를 사용하여 ListTile의 테마 속성을 얻을 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json new file mode 100644 index 00000000..b638b2bd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema do ListTile", + "info": "Principalmente usado para definir propriedades padrão unificadas para componentes ListTile descendentes, também pode ser usado para obter as propriedades padrão do ListTile.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ListTileTheme", + "desc": [ + "Pode especificar os atributos de dados do ListTileThemeData para definir o estilo padrão para componentes ListTile descendentes, como estilo, cor, decoração, margens, etc. Também pode usar ListTileTheme.of para obter as propriedades do tema do ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json new file mode 100644 index 00000000..38e1d8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Тема ListTile", + "info": "В основном используется для установки свойств по умолчанию для компонентов ListTile-потомков, также можно получить свойства по умолчанию ListTile через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListTileTheme", + "desc": [ + "Можно указать свойства данных ListTileThemeData для установки стилей по умолчанию для компонентов ListTile-потомков, таких как стили, цвета, декорации, отступы и т.д. Также можно использовать ListTileTheme.of для получения тематических свойств ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json new file mode 100644 index 00000000..644f3b48 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile主题", + "info": "主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileTheme基本使用", + "desc": [ + "可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart new file mode 100644 index 00000000..a0537638 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class ListTileThemeDemo extends StatelessWidget { + const ListTileThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ListTileTheme( + dense: false, + style: ListTileStyle.list, + selectedColor: Colors.blue, + contentPadding: const EdgeInsets.only(left: 15,right: 15,top: 5,bottom: 5), + iconColor: Colors.purple, + textColor: Colors.orange, + child: _ListTileSimple(), + ); + } +} + +class _ListTileSimple extends StatefulWidget { + @override + _ListTileSimpleState createState() => _ListTileSimpleState(); +} + +class _ListTileSimpleState extends State<_ListTileSimple> { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + selected: _selected, + title: const Text("以梦为马"), + subtitle: const Text("海子"), + trailing: const Icon(Icons.more_vert), + onTap: () => setState(() => _selected = !_selected), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json new file mode 100644 index 00000000..bca3d929 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Banner-Stil", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für nachfolgende MaterialBanner-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften von MaterialBanner abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MaterialBannerTheme", + "desc": [ + "Kann die MaterialBannerThemeData-Dateneigenschaften verwenden, um Standardstile für nachfolgende MaterialBanner-Komponenten festzulegen, wie Hintergrundfarbe, Abstände, Textstile usw. Es kann auch MaterialBannerTheme.of verwenden, um die Themedaten von MaterialBanner abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json new file mode 100644 index 00000000..2eb954a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Banner Style", + "info": "Mainly used to set default properties for descendant MaterialBanner components uniformly, and it can also be used to obtain the default properties of MaterialBanner.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MaterialBannerTheme", + "desc": [ + "You can specify the MaterialBannerThemeData properties to set default styles for descendant MaterialBanner components, such as background color, margins, text styles, etc. You can also use MaterialBannerTheme.of to get the theme data of MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json new file mode 100644 index 00000000..2e9d4278 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema de Banner", + "info": "Principalmente utilizado para establecer propiedades predeterminadas unificadas para los componentes MaterialBanner descendientes. También se puede utilizar este componente para obtener las propiedades predeterminadas de MaterialBanner.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MaterialBannerTheme", + "desc": [ + "Se puede especificar la propiedad de datos MaterialBannerThemeData para establecer el estilo predeterminado de los componentes MaterialBanner descendientes, como el color de fondo, el margen, el estilo de texto, etc. También se puede usar MaterialBannerTheme.of para obtener los datos del tema de MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json new file mode 100644 index 00000000..03c958f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Thème de bannière", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants MaterialBanner descendants, ou pour obtenir les propriétés par défaut de MaterialBanner via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MaterialBannerTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de MaterialBannerThemeData pour définir le style par défaut des composants MaterialBanner descendants, tels que la couleur de fond, les marges, le style du texte, etc. Vous pouvez également utiliser MaterialBannerTheme.of pour obtenir les données de thème de MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json new file mode 100644 index 00000000..c9fc9050 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema del Banner", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti MaterialBanner discendenti, è anche possibile ottenere le proprietà predefinite di MaterialBanner attraverso questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MaterialBannerTheme", + "desc": [ + "È possibile specificare le proprietà di MaterialBannerThemeData per impostare lo stile predefinito per i componenti MaterialBanner discendenti, come il colore di sfondo, i margini, lo stile del testo, ecc. È anche possibile utilizzare MaterialBannerTheme.of per ottenere i dati del tema di MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json new file mode 100644 index 00000000..e2b376eb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "バナースタイル", + "info": "主に子孫のMaterialBannerコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのMaterialBannerのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerThemeの基本使用", + "desc": [ + "MaterialBannerThemeDataデータプロパティを指定して、【子孫】のMaterialBannerコンポーネントにデフォルトのスタイル(背景色、余白、テキストスタイルなど)を設定できます。また、MaterialBannerTheme.ofを使用してMaterialBannerのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json new file mode 100644 index 00000000..efcbab08 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "배너 스타일", + "info": "주로 후손 MaterialBanner 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 MaterialBanner의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerTheme 기본 사용법", + "desc": [ + "MaterialBannerThemeData 데이터 속성을 지정하여 후손 MaterialBanner 컴포넌트의 기본 스타일을 설정할 수 있습니다. 예를 들어 배경색, 여백, 텍스트 스타일 등. 또한 MaterialBannerTheme.of를 사용하여 MaterialBanner의 테마 데이터를 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json new file mode 100644 index 00000000..9824f516 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema de Banner", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes MaterialBanner descendentes, também pode ser usado para obter as propriedades padrão do MaterialBanner através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do MaterialBannerTheme", + "desc": [ + "Pode especificar as propriedades de dados do MaterialBannerThemeData para definir o estilo padrão para componentes MaterialBanner descendentes, como cor de fundo, margens, estilo de texto, etc. Também pode usar MaterialBannerTheme.of para obter os dados do tema do MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json new file mode 100644 index 00000000..342ca9a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Тема баннера", + "info": "Основное использование — установка стандартных свойств для компонентов MaterialBanner у потомков. Также можно получить стандартные свойства MaterialBanner через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MaterialBannerTheme", + "desc": [ + "Можно указать свойства данных MaterialBannerThemeData для установки стандартных стилей для компонентов MaterialBanner у потомков, таких как цвет фона, отступы, стиль текста и т.д. Также можно использовать MaterialBannerTheme.of для получения данных темы MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json new file mode 100644 index 00000000..63929b44 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "横幅样式", + "info": "主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerTheme基本使用", + "desc": [ + "可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart new file mode 100644 index 00000000..1a4d83d9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class MaterialBannerThemeDemo extends StatelessWidget { + const MaterialBannerThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialBannerTheme( + data: MaterialBannerTheme.of(context).copyWith( + backgroundColor: Colors.purple, + padding: const EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2), + leadingPadding:const EdgeInsetsDirectional.only(end: 16.0) , + contentTextStyle: const TextStyle(color: Colors.white), + ), + child: _MaterialBannerDemo(), + ); + } +} + + +class _MaterialBannerDemo extends StatelessWidget { + final info = + 'A banner displays an important, succinct message, and provides actions for users to address. ' + 'A user action is required for itto be dismissed.'; + + @override + Widget build(BuildContext context) { + return Column( + children: [MaterialBanner( + content: Text(info), + leading: const Icon(Icons.warning, color: Colors.yellow), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.white), + onPressed: () {}, + child: const Text( + 'I KNOW', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.white), + onPressed: () {}, + child: const Text( + 'I IGNORE', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + ], + )], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json new file mode 100644 index 00000000..641c9d93 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Medienabfrage", + "info": "Über MediaQuery.of können Informationen wie Bildschirmgröße, Gerätedichte, Textskalierungsfaktor, Ränder usw. abgerufen werden.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery Dateninformationen abrufen", + "desc": [ + "MediaQuery.of(context) kann MediaQueryData abrufen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json new file mode 100644 index 00000000..187f601e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Media Query", + "info": "You can use MediaQuery.of to obtain information such as screen size, device density, text scaling ratio, margins, etc.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery Get Data Information", + "desc": [ + "MediaQuery.of(context) can obtain MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json new file mode 100644 index 00000000..b1ba389b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Consulta de Medios", + "info": "Se puede obtener información como el tamaño de la pantalla, la densidad del dispositivo, la escala de texto, los márgenes, etc., a través de MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obtener información de datos con MediaQuery", + "desc": [ + "MediaQuery.of(context) puede obtener MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json new file mode 100644 index 00000000..51afde9b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Requête média", + "info": "Vous pouvez obtenir des informations telles que la taille de l'écran, la densité de l'appareil, le facteur de zoom du texte, les marges, etc. via MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obtenir des informations de données avec MediaQuery", + "desc": [ + "MediaQuery.of(context) peut obtenir MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json new file mode 100644 index 00000000..f9fa1d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Query sui media", + "info": "È possibile ottenere informazioni come dimensioni dello schermo, densità del dispositivo, scala del testo, margini, ecc. tramite MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ottenere informazioni sui dati con MediaQuery", + "desc": [ + "MediaQuery.of(context) può ottenere MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json new file mode 100644 index 00000000..1994ff13 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "メディアクエリ", + "info": "MediaQuery.ofを使用して、画面サイズ、デバイスの密度、テキストのスケーリング比率、マージンなどの情報を取得できます。", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQueryでデータ情報を取得", + "desc": [ + "MediaQuery.of(context)を使用してMediaQueryDataを取得できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json new file mode 100644 index 00000000..0edde099 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "미디어 쿼리", + "info": "MediaQuery.of를 통해 화면 크기, 기기 밀도, 텍스트 확대 비율, 여백 등의 정보를 얻을 수 있습니다.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery 데이터 정보 가져오기", + "desc": [ + "MediaQuery.of(context)를 통해 MediaQueryData를 얻을 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json new file mode 100644 index 00000000..d67c756f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Consulta de Mídia", + "info": "Pode usar MediaQuery.of para obter informações como o tamanho da tela, densidade do dispositivo, escala de texto, margens, etc.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obter informações de dados com MediaQuery", + "desc": [ + "MediaQuery.of(context) pode obter MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json new file mode 100644 index 00000000..ba9d4b47 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Медиа-запросы", + "info": "С помощью MediaQuery.of можно получить информацию о размере экрана, плотности устройства, масштабе текста, отступах и т.д.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Получение данных через MediaQuery", + "desc": [ + "MediaQuery.of(context) позволяет получить MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json new file mode 100644 index 00000000..ffb9a6ef --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "媒体查询", + "info": "可通过MediaQuery.of来获取屏幕尺寸、设备密度、文字缩放比例、边距等信息。", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery获取数据信息", + "desc": [ + "MediaQuery.of(context)可以获取MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart new file mode 100644 index 00000000..9bf69e27 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class CustomMediaQuery extends StatelessWidget { + const CustomMediaQuery({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + MediaQueryData queryData = MediaQuery.of(context); + Map data = { + "size": queryData.size, + "devicePixelRatio": queryData.devicePixelRatio.toStringAsFixed(1), + "textScaleFactor": queryData.textScaleFactor.toStringAsFixed(1), + "platformBrightness": queryData.platformBrightness, + "padding": queryData.padding, + "viewInsets": queryData.viewInsets, + "systemGestureInsets": queryData.padding, + "viewPadding": queryData.padding, + "physicalDepth": queryData.padding, + "alwaysUse24HourFormat": queryData.padding, + "accessibleNavigation": queryData.alwaysUse24HourFormat, + "invertColors": queryData.invertColors, + "highContrast": queryData.highContrast, + "disableAnimations": queryData.disableAnimations, + "boldText": queryData.boldText, + }; + + return Container( + height: 200, + color: Colors.grey.withAlpha(11), + child:ListView( + children: data.keys.map((e) => buildItem(e, data)).toList(), + ), + ); + } + + Widget buildItem(String e, Map data) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + e, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + data[e].toString(), + style: const TextStyle(fontSize: 16, color: Colors.orange), + ) + ], + ), + ), + const Divider( + height: 1, + ) + ], + ); +} + + diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json new file mode 100644 index 00000000..57f4d638 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Elterndaten-Widget", + "info": "Abstrakte Klasse, die verwendet wird, um ParentData-Informationen mit RenderObjectWidget-Kindkomponenten zu verbinden. Seine Unterklassen sind Positioned, Flexible, Expanded usw. Diese Komponenten können nur unter bestimmten Komponenten verwendet werden.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in ParentDataWidget", + "desc": [ + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json new file mode 100644 index 00000000..fff9f56f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Parent Data Widget", + "info": "An abstract class used to hook ParentData information to RenderObjectWidget child components. Its subclasses include Positioned, Flexible, Expanded, etc. These components can only be used under specific components.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ParentDataWidget", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json new file mode 100644 index 00000000..ae003e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget de Datos Parentales", + "info": "Clase abstracta utilizada para conectar información de ParentData a los subcomponentes de RenderObjectWidget. Sus subclases incluyen Positioned, Flexible, Expanded, etc., y estos componentes solo se pueden utilizar bajo componentes específicos.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ParentDataWidget", + "desc": [ + "【child】 : Subcomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json new file mode 100644 index 00000000..1727f5c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget de données parentales", + "info": "Classe abstraite utilisée pour associer des informations ParentData à des widgets enfants RenderObjectWidget. Ses sous-classes incluent Positioned, Flexible, Expanded, etc., ces widgets ne peuvent être utilisés que sous des composants spécifiques.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ParentDataWidget", + "desc": [ + "【child】 : widget enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json new file mode 100644 index 00000000..0fcb14e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget dei dati genitore", + "info": "Classe astratta utilizzata per collegare le informazioni ParentData ai widget figli di RenderObjectWidget. Le sue sottoclassi includono Positioned, Flexible, Expanded, ecc., e questi widget possono essere utilizzati solo sotto componenti specifici.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ParentDataWidget", + "desc": [ + "【child】 : Widget figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json new file mode 100644 index 00000000..dd0bd64c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "親データウィジェット", + "info": "抽象クラスで、ParentData情報をRenderObjectWidgetの子ウィジェットにフックするために使用されます。そのサブクラスにはPositioned、Flexible、Expandedなどがあり、これらのウィジェットは特定のコンポーネントの下でのみ使用できます。", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 紹介", + "desc": [ + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json new file mode 100644 index 00000000..da5b2a45 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "부모 데이터 위젯", + "info": "추상 클래스, ParentData 정보를 RenderObjectWidget 자식 위젯에 연결하는 데 사용됩니다. 하위 클래스로는 Positioned, Flexible, Expanded 등이 있으며, 이러한 위젯은 특정 위젯 아래에서만 사용할 수 있습니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json new file mode 100644 index 00000000..c44ff6d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Componente de Dados Parentais", + "info": "Classe abstrata usada para conectar informações de ParentData a componentes filhos de RenderObjectWidget. Suas subclasses incluem Positioned, Flexible, Expanded, etc. Esses componentes só podem ser usados sob componentes específicos.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ParentDataWidget", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json new file mode 100644 index 00000000..41988d6b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Родительский виджет данных", + "info": "Абстрактный класс, используемый для привязки информации ParentData к дочерним виджетам RenderObjectWidget. Его подклассы включают Positioned, Flexible, Expanded и другие, которые могут использоваться только под определенными компонентами.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ParentDataWidget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json new file mode 100644 index 00000000..486af92d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "父数据组件", + "info": "抽象类,用于将 ParentData 信息挂钩到 RenderObjectWidget 子组件上。其子类有 Positioned、Flexible、Expanded等,这些组件只能用于特定的组件之下。", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 介绍", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart new file mode 100644 index 00000000..04ff5a95 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ParentDataWidgetDemo extends StatelessWidget { + const ParentDataWidgetDemo({Key? key}) : super(key: key); + + final String info = + 'ParentDataWidget 是一个抽象类,不能直接使用,它拥有 ParentData 子类型的泛型,该泛型会限定该组件的适应场景。' + '如 Positioned 组件继承自 ParentDataWidget,就说明 Positioned 的上层组件必须使用 Stack 族组件。' + '如 Flexible 组件继承自 ParentDataWidget,就说明 Flexible 的上层组件必须使用 Flex 族组件。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json new file mode 100644 index 00000000..4aded214 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Popup-Menü-Stil", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für die nachfolgenden PopupMenuButton-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften des PopupMenu zu erhalten.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuTheme", + "desc": [ + "Kann die PopupMenuThemeData-Dateneigenschaften verwenden, um Standardstile für die nachfolgenden PopupMenuButton-Komponenten festzulegen, wie Form, Schattentiefe, Farbe, Textstil usw. Kann auch PopupMenuTheme.of verwenden, um die Themedaten des PopupMenu zu erhalten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json new file mode 100644 index 00000000..39033a47 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Popup Menu Theme", + "info": "Mainly used to set default properties uniformly for descendant PopupMenuButton components, and also to obtain the default properties of PopupMenu through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuTheme", + "desc": [ + "You can specify the PopupMenuThemeData properties to set default styles for descendant PopupMenuButton components, such as shape, elevation, color, text style, etc. You can also use PopupMenuTheme.of to obtain the theme data of PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json new file mode 100644 index 00000000..ec0d9a69 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema del menú emergente", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes PopupMenuButton descendientes, también se puede obtener las propiedades predeterminadas de PopupMenu a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuTheme", + "desc": [ + "Se pueden especificar las propiedades de datos de PopupMenuThemeData para establecer estilos predeterminados para los componentes PopupMenuButton descendientes, como forma, profundidad de sombra, color, estilo de texto, etc. También se puede usar PopupMenuTheme.of para obtener los datos del tema de PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json new file mode 100644 index 00000000..38338257 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Thème du menu contextuel", + "info": "Principalement utilisé pour définir des propriétés par défaut unifiées pour les composants PopupMenuButton descendants. Il est également possible d'obtenir les propriétés par défaut de PopupMenu via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de PopupMenuThemeData pour définir des styles par défaut pour les composants PopupMenuButton descendants, tels que la forme, la profondeur de l'ombre, la couleur, le style de texte, etc. Vous pouvez également utiliser PopupMenuTheme.of pour obtenir les données de thème de PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json new file mode 100644 index 00000000..07caa85b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema del menu a comparsa", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti PopupMenuButton discendenti, oppure per ottenere le proprietà predefinite del PopupMenu attraverso questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di PopupMenuThemeData per impostare lo stile predefinito per i componenti PopupMenuButton discendenti, come forma, profondità dell'ombra, colore, stile del testo, ecc. È anche possibile utilizzare PopupMenuTheme.of per ottenere i dati del tema del PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json new file mode 100644 index 00000000..4bd5bfd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "ポップアップメニュースタイル", + "info": "主に子孫のPopupMenuButtonコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのPopupMenuのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuThemeの基本使用", + "desc": [ + "PopupMenuThemeDataデータ属性を指定して、【子孫】のPopupMenuButtonコンポーネントにデフォルトのスタイルを設定できます。形状、影の深さ、色、テキストスタイルなどです。また、PopupMenuTheme.ofを使用してPopupMenuのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json new file mode 100644 index 00000000..e6683a3e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "팝업 메뉴 스타일", + "info": "주로 후손의 PopupMenuButton 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 PopupMenu의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuTheme 기본 사용", + "desc": [ + "PopupMenuThemeData 데이터 속성을 지정하여 후손의 PopupMenuButton 컴포넌트에 기본 스타일(예: 모양, 그림자, 색상, 텍스트 스타일 등)을 설정할 수 있습니다. 또한 PopupMenuTheme.of를 사용하여 PopupMenu의 테마 데이터를 얻을 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json new file mode 100644 index 00000000..30af0da8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema do Menu Pop-up", + "info": "Principalmente utilizado para definir propriedades padrão uniformes para os componentes PopupMenuButton descendentes, também é possível obter as propriedades padrão do PopupMenu através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuTheme", + "desc": [ + "Pode especificar as propriedades de dados do PopupMenuThemeData para definir o estilo padrão para os componentes PopupMenuButton descendentes, como forma, profundidade de sombra, cor, estilo de texto, etc. Também é possível usar PopupMenuTheme.of para obter os dados do tema do PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json new file mode 100644 index 00000000..bd6d8ef6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Тема всплывающего меню", + "info": "Основное использование для установки стандартных свойств для компонентов PopupMenuButton потомков, также можно получить свойства стандартного PopupMenu через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuTheme", + "desc": [ + "Можно указать атрибуты данных PopupMenuThemeData для установки стандартных стилей для компонентов PopupMenuButton потомков, таких как форма, глубина тени, цвет, стиль текста и т.д. Также можно использовать PopupMenuTheme.of для получения данных темы PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json new file mode 100644 index 00000000..9158c8ee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "弹出菜单样式", + "info": "主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuTheme基本使用", + "desc": [ + "可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart new file mode 100644 index 00000000..3006a6ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class PopupMenuThemeDemo extends StatelessWidget { + const PopupMenuThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return PopupMenuTheme( + data: PopupMenuTheme.of(context).copyWith( + color: Colors.orangeAccent, + elevation: 1, + textStyle: const TextStyle(color: Colors.white), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + topRight: Radius.circular(5), + bottomLeft: Radius.circular(5), + )), + ), + child: _PopupMenuButtonSimple(), + ); + } +} + +class _PopupMenuButtonSimple extends StatefulWidget { + @override + _PopupMenuButtonSimpleState createState() => _PopupMenuButtonSimpleState(); +} + +class _PopupMenuButtonSimpleState extends State<_PopupMenuButtonSimple> { + final Map map = { + "关于": Icons.info_outline, + "帮助": Icons.help_outline, + "反馈": Icons.add_comment, + }; + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + itemBuilder: (context) => buildItems(), + offset: const Offset(0, 50), + onSelected: print, + onCanceled: () => print('onCanceled'), + ); + } + + List> buildItems() { + return map.keys + .toList() + .map((e) => PopupMenuItem( + value: e, + child: Wrap( + spacing: 6, + children: [ + Icon( + map[e], + ), + Text(e), + ], + ))) + .toList(); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json new file mode 100644 index 00000000..c0fd65b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Positionierungskomponente", + "info": "Kann nur in einem Stack verwendet werden, ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Positioned", + "desc": [ + "【child】 : Komponente 【Widget】", + "【top】 : Abstand zum oberen Elternteil 【double】", + "【right】 : Abstand zum rechten Elternteil 【double】", + "【left】 : Abstand zum linken Elternteil 【double】", + "【bottom】 : Abstand zum unteren Elternteil 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json new file mode 100644 index 00000000..6c4ade67 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Positioning Component", + "info": "Can only be used in Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Positioned", + "desc": [ + "【child】: Component 【Widget】", + "【top】: Distance to the top of the parent 【double】", + "【right】: Distance to the right of the parent 【double】", + "【left】: Distance to the left of the parent 【double】", + "【bottom】: Distance to the bottom of the parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json new file mode 100644 index 00000000..9e450347 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente de posicionamiento", + "info": "Solo se puede usar en Stack, permite especificar las distancias superior, izquierda, derecha e inferior para colocar un componente con precisión.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distancia al borde superior del padre 【double】", + "【right】 : Distancia al borde derecho del padre 【double】", + "【left】 : Distancia al borde izquierdo del padre 【double】", + "【bottom】 : Distancia al borde inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json new file mode 100644 index 00000000..a263004d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Composant de positionnement", + "info": "Ne peut être utilisé que dans une Stack, permet de positionner précisément un composant en spécifiant les distances par rapport au haut, bas, gauche et droite.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Positioned", + "desc": [ + "【child】 : Composant 【Widget】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【right】 : Distance par rapport à la droite du parent 【double】", + "【left】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json new file mode 100644 index 00000000..1093c29e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente di posizionamento", + "info": "Può essere utilizzato solo in Stack, consente di posizionare con precisione un componente specificando le distanze da sinistra, destra, alto e basso.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【right】 : Distanza dal bordo destro del genitore 【double】", + "【left】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json new file mode 100644 index 00000000..0aedbae0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "位置指定コンポーネント", + "info": "Stack内でのみ使用可能で、上下左右の距離を指定してコンポーネントを正確に配置できます。", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positionedの基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【top】 : 親の上端までの距離 【double】", + "【right】 : 親の右端までの距離 【double】", + "【left】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json new file mode 100644 index 00000000..c29eeb19 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "위치 지정 컴포넌트", + "info": "Stack에서만 사용할 수 있으며, 상하좌우 거리를 지정하여 특정 컴포넌트를 정확하게 배치할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positioned 기본 사용법", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【top】 : 상단에서 부모까지의 거리 【double】", + "【right】 : 우측에서 부모까지의 거리 【double】", + "【left】 : 좌측에서 부모까지의 거리 【double】", + "【bottom】 : 하단에서 부모까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json new file mode 100644 index 00000000..58cee8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente de Posicionamento", + "info": "Só pode ser usado em Stack, pode especificar as distâncias superior, inferior, esquerda e direita para posicionar um componente com precisão.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distância do topo do pai 【double】", + "【right】 : Distância da direita do pai 【double】", + "【left】 : Distância da esquerda do pai 【double】", + "【bottom】 : Distância da base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json new file mode 100644 index 00000000..afa91ee1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Компонент позиционирования", + "info": "Может использоваться только в Stack, позволяет точно разместить компонент, указав расстояния сверху, слева, справа и снизу.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Positioned", + "desc": [ + "【child】 : Компонент 【Widget】", + "【top】 : Расстояние до верха родителя 【double】", + "【right】 : Расстояние до правого края родителя 【double】", + "【left】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до низа родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json new file mode 100644 index 00000000..75ba8c78 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "定位组件", + "info": "只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positioned基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【top】 : 到父顶距离 【double】", + "【right】 : 到父右距离 【double】", + "【left】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart new file mode 100644 index 00000000..c59c04c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomPositioned extends StatelessWidget { + const CustomPositioned({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Widget yellowBox = Container( + color: Colors.yellow, + height: 100, + width: 100, + ); + + Widget redBox = Container( + color: Colors.red, + height: 90, + width: 90, + ); + + Widget greenBox = Container( + color: Colors.green, + height: 80, + width: 80, + ); + + Widget cyanBox = Container( + color: Colors.cyanAccent, + height: 70, + width: 70, + ); + + return Container( + width: 200, + height: 120, + color: Colors.grey.withAlpha(33), + child: Stack( + children: [ + yellowBox, + redBox, + Positioned(top: 20, left: 20, child: greenBox), + Positioned( + child: cyanBox, + bottom: 10, + right: 10, + ) + ], + )); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json new file mode 100644 index 00000000..e027a2c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Primärer Scroll-Controller", + "info": "Es ist eine Unterklasse von InheritedWidget und stellt den standardmäßigen ScrollController-Objekt für scrollbare Ansichten im Unterbaum über den Kontext bereit.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in den PrimaryScrollController", + "desc": [ + "【controller】 : Scroll-Controller 【ScrollController】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json new file mode 100644 index 00000000..7595d787 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Primary Scroll Controller", + "info": "It is a subclass of InheritedWidget, providing a default ScrollController object to scrollable views in the subtree through context.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to PrimaryScrollController", + "desc": [ + "【controller】: Scroll Controller 【ScrollController】", + "【child】: Child Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json new file mode 100644 index 00000000..1441d306 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controlador de Desplazamiento Primario", + "info": "Es una subclase de InheritedWidget que proporciona un objeto ScrollController predeterminado a las vistas desplazables en el subárbol a través del contexto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a PrimaryScrollController", + "desc": [ + "【controller】 : Controlador de desplazamiento 【ScrollController】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json new file mode 100644 index 00000000..c097b0c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Contrôleur de défilement initial", + "info": "C'est une sous-classe d'InheritedWidget qui fournit un objet ScrollController par défaut aux vues défilables dans le sous-arbre via le contexte.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction de PrimaryScrollController", + "desc": [ + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json new file mode 100644 index 00000000..729e3e7f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controllore di scorrimento iniziale", + "info": "È una sottoclasse di InheritedWidget, che fornisce un oggetto ScrollController predefinito alle viste scorrevoli nel sottoalbero tramite il contesto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a PrimaryScrollController", + "desc": [ + "【controller】 : Controllore di scorrimento 【ScrollController】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json new file mode 100644 index 00000000..46787923 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "初期スクロールコントローラー", + "info": "これは InheritedWidget のサブクラスで、context を通じてサブツリー内のスクロール可能なビューにデフォルトの ScrollController オブジェクトを提供します。", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 紹介", + "desc": [ + "【controller】 : スクロールコントローラー 【ScrollController】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json new file mode 100644 index 00000000..5897c1b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "기본 스크롤 컨트롤러", + "info": "이것은 InheritedWidget의 하위 클래스로, context를 통해 하위 트리의 스크롤 가능한 뷰에 기본 ScrollController 객체를 제공합니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 소개", + "desc": [ + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【child】 : 하위 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json new file mode 100644 index 00000000..d071d047 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controlador de Deslocamento Inicial", + "info": "É uma subclasse de InheritedWidget que fornece um objeto ScrollController padrão para vistas roláveis na subárvore através do contexto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao PrimaryScrollController", + "desc": [ + "【controller】 : Controlador de Deslocamento 【ScrollController】", + "【child】 : Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json new file mode 100644 index 00000000..4c828ad7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Основной контроллер прокрутки", + "info": "Это подкласс InheritedWidget, который предоставляет объект ScrollController по умолчанию для прокручиваемых представлений в поддереве через контекст.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в PrimaryScrollController", + "desc": [ + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json new file mode 100644 index 00000000..1e77d574 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "初始滑动控制器", + "info": "它是 InheritedWidget 子类,通过 context 向子树中的可滑动视图提供默认的 ScrollController 对象。", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 介绍", + "desc": [ + "【controller】 : 滑动控制器 【ScrollController】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart new file mode 100644 index 00000000..076ac8db --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/3/31 +/// contact me by email 1981462002@qq.com +/// + +class PrimaryScrollControllerDemo extends StatelessWidget { + const PrimaryScrollControllerDemo({Key? key}) : super(key: key); + + final String info = + 'PrimaryScrollController 是 InheritedWidget 子类,也就说明它可以为子树组件提供某些默认数据,' + '子树可以通过 context 来获取上层该组件的提供 ScrollController 对象。\n' + '对于一些可滑动组件 ScrollView、SingleChildScrollView、NestedScrollView 等,' + '在使用者未提供 ScrollController 时,且 primary 属性为 true 时(默认true) ,' + '会使用上层 PrimaryScrollController 组件提供的滑动控制器。\n' + '使用 MaterialApp 组件,其已经内置 PrimaryScrollController,'; + + @override + Widget build(BuildContext context) { + ScrollController? label = PrimaryScrollController.of(context); + + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info+"当前其持有的滑动控制器对象: $label"), + ); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json new file mode 100644 index 00000000..aba9b5c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iOS-Menüschaltfläche", + "info": "Muss eine scrollbare Komponente umschließen und durch das Verhalten-Attribut den Scroll-Effekt steuern, kann den blauen Schatten beim Scrollen entfernen usw.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ScrollConfiguration", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【behavior】: Scrollverhalten 【ScrollBehavior】", + " Kann ScrollConfiguration verwenden, um den blauen Schatten in ListView zu entfernen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json new file mode 100644 index 00000000..502a531f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iOS Menu Button", + "info": "Needs to wrap a scrollable component and control the scrolling effect through the behavior property, which can remove the blue shadow of the scrolling, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ScrollConfiguration", + "desc": [ + "【child】: Child component 【Widget】", + "【behavior】: Scroll behavior 【ScrollBehavior】", + " ScrollConfiguration can be used to remove the blue shadow of ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json new file mode 100644 index 00000000..446a72a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Botón de menú de iOS", + "info": "Necesita envolver un componente deslizable y controlar el efecto de deslizamiento a través de la propiedad behavior, lo que puede eliminar la sombra azul del deslizamiento, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ScrollConfiguration", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【behavior】 : Comportamiento de deslizamiento 【ScrollBehavior】", + " Puedes usar ScrollConfiguration para eliminar la sombra azul de ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json new file mode 100644 index 00000000..9e750c53 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Bouton de menu iOS", + "info": "Doit envelopper un composant défilable et contrôler l'effet de défilement via la propriété behavior, peut supprimer l'ombre bleue du défilement, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ScrollConfiguration", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【behavior】 : Comportement de défilement 【ScrollBehavior】", + " Peut utiliser ScrollConfiguration pour supprimer l'ombre bleue de ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json new file mode 100644 index 00000000..627b4a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Pulsante menu ios", + "info": "Deve avvolgere un componente scorrevole e controllare l'effetto dello scorrimento attraverso la proprietà behavior, rimuovendo ad esempio l'ombra blu dello scorrimento.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ScrollConfiguration", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【behavior】 : Comportamento di scorrimento 【ScrollBehavior】", + " Puoi usare ScrollConfiguration per rimuovere l'ombra blu da ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json new file mode 100644 index 00000000..36c5d1ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iosメニューボタン", + "info": "スクロール可能なコンポーネントをラップし、behaviorプロパティを通じてスクロール効果を制御します。これにより、スクロール時の青色の影などを取り除くことができます。", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfigurationの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【behavior】 : スクロール動作 【ScrollBehavior】", + " ScrollConfigurationを使用してListViewの青色の影をなくすことができます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json new file mode 100644 index 00000000..ae09e759 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "ios 메뉴 버튼", + "info": "스크롤 가능한 컴포넌트를 감싸고 behavior 속성을 통해 스크롤 효과를 제어할 수 있으며, 스크롤 시 파란색 그림자 등을 제거할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfiguration 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【behavior】 : 스크롤 동작 【ScrollBehavior】", + " ScrollConfiguration을 사용하여 ListView의 파란색 그림자를 제거할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json new file mode 100644 index 00000000..a5dad2f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Botão de menu ios", + "info": "Precisa envolver um componente deslizável e controlar o efeito de deslize através da propriedade behavior, podendo remover a sombra azul do deslize, entre outros.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ScrollConfiguration", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【behavior】 : Comportamento de deslize 【ScrollBehavior】", + " Pode usar o ScrollConfiguration para remover a sombra azul do ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json new file mode 100644 index 00000000..18999966 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "кнопка меню ios", + "info": "Необходимо обернуть прокручиваемый компонент и управлять эффектом прокрутки через свойство behavior, можно убрать синюю тень при прокрутке и т.д.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ScrollConfiguration", + "desc": [ + "【child】 : дочерний компонент 【Widget】", + "【behavior】 : поведение прокрутки 【ScrollBehavior】", + " Можно использовать ScrollConfiguration, чтобы убрать синюю тень у ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json new file mode 100644 index 00000000..17e990a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "ios菜单按钮", + "info": "需要包裹一个可滑动的组件,并通过behavior属性控制滑动的效果,可以去除滑动的蓝色阴影等。", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfiguration基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【behavior】 : 滑动行为 【ScrollBehavior】", + " 可以使用ScrollConfiguration让ListView无蓝色阴影" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart new file mode 100644 index 00000000..5c18f5ab --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomScrollConfiguration extends StatelessWidget { + const CustomScrollConfiguration({super.key}); + + List get data => [ + Colors.cyan[50]!, + Colors.cyan[100]!, + Colors.cyan[200]!, + Colors.cyan[300]!, + Colors.cyan[400]!, + Colors.cyan[500]!, + Colors.cyan[600]!, + Colors.cyan[700]!, + Colors.cyan[800]!, + Colors.cyan[900]!, + ]; + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ScrollConfiguration( + behavior: NoScrollBehavior(), child: _buildListView()), + ); + } + + Widget _buildListView() => ListView( + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + )) + .toList(), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} + +class NoScrollBehavior extends ScrollBehavior { + @override + Widget buildViewportChrome( + BuildContext context, Widget child, AxisDirection axisDirection) => + child; +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json new file mode 100644 index 00000000..919e8b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Schieberegler-Stil", + "info": "Kann ein Kind enthalten und gibt den Standardstil für nachfolgende Schieberegler an. Wird häufig verwendet, um den Stil von Schiebereglern zu vereinheitlichen und die individuelle Einstellung zu vermeiden. Kann auch verwendet werden, um den Stil von Schiebereglern anzupassen.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme Verwendung", + "desc": [ + "Kann SliderTheme.of verwenden, um das Slider-Themen-Datenobjekt zu erhalten, das eine Vielzahl von Attributen für die Einstellung des Schiebereglers enthält.", + "Kann Standardstile für Schaltflächenkomponenten von ButtonTheme [Nachkommen] festlegen, einschließlich Farbe, Form, Größe usw." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme Stilanpassung für Schieberegler", + "desc": [ + "Durch thumbShape und valueIndicatorShape kann der Stil des Schiebereglers angepasst werden.", + "Hinweis: Dieses Beispiel bezieht sich auf SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json new file mode 100644 index 00000000..95df2de4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Slider Style", + "info": "Can contain a child, specifies the default style for descendant Sliders. Commonly used for unifying the style of Sliders to avoid setting them one by one, and can also customize the style of Sliders.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme Usage", + "desc": [ + "You can obtain the Slider theme data object through SliderTheme.of, which contains a large number of properties for setting the Slider.", + "You can set the default style for the button components of ButtonTheme【descendants】, including color, shape, size, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme Customization for Slider", + "desc": [ + "You can customize the style of the Slider through thumbShape and valueIndicatorShape.", + "Note: This example refers to the SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json new file mode 100644 index 00000000..0c19c2c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Estilo del deslizador", + "info": "Puede contener un hijo y especifica el estilo predeterminado para los Slider descendientes. Se usa comúnmente para unificar el estilo de los Slider, evitando configuraciones individuales, y también permite personalizar el estilo del Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de SliderTheme", + "desc": [ + "Se puede obtener el objeto de datos del tema Slider a través de SliderTheme.of, que contiene una gran cantidad de propiedades para configurar el Slider.", + "Puede establecer el estilo predeterminado para los componentes de botón [descendientes] de ButtonTheme, incluyendo color, forma, tamaño, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalización del estilo del Slider con SliderTheme", + "desc": [ + "Se puede personalizar el estilo del Slider a través de thumbShape y valueIndicatorShape.", + "Nota: Este ejemplo se basa en SlideDemo de flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json new file mode 100644 index 00000000..c9db739c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Style du curseur", + "info": "Peut contenir un enfant, spécifie le style par défaut pour les descendants Slider. Souvent utilisé pour unifier le style des Slider, évitant de les configurer un par un, et permet également de personnaliser le style du Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de SliderTheme", + "desc": [ + "Peut obtenir l'objet de données de thème Slider via SliderTheme.of, qui contient de nombreuses propriétés pour la configuration du Slider.\"", + "Peut définir un style par défaut pour les composants boutons des descendants de ButtonTheme, y compris la couleur, la forme, la taille, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personnalisation du style du Slider avec SliderTheme", + "desc": [ + "Permet de personnaliser le style du Slider via thumbShape et valueIndicatorShape.\"", + "Note: Cet exemple est inspiré de SlideDemo dans flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json new file mode 100644 index 00000000..0da8d57b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Stile del cursore", + "info": "Può contenere un figlio e specifica lo stile predefinito per i cursori discendenti. Comunemente utilizzato per unificare lo stile dei cursori, evitando di impostarli uno per uno, e consente anche la personalizzazione dello stile del cursore.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di SliderTheme", + "desc": [ + "È possibile ottenere l'oggetto dati del tema del cursore tramite SliderTheme.of, che contiene numerose proprietà per la configurazione del cursore.", + "È possibile impostare uno stile predefinito per i componenti del pulsante [discendenti] di ButtonTheme, inclusi colore, forma, dimensioni, ecc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalizzazione dello stile del cursore con SliderTheme", + "desc": [ + "È possibile personalizzare lo stile del cursore tramite thumbShape e valueIndicatorShape.", + "Nota: Questo esempio si riferisce a SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json new file mode 100644 index 00000000..46441db3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "スライダースタイル", + "info": "1つの子要素を収容し、子孫のSliderにデフォルトのスタイルを指定します。Sliderのスタイル統一に使用され、個別に設定する必要がなく、Sliderのスタイルをカスタマイズすることもできます。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderThemeの使用", + "desc": [ + "SliderTheme.ofを使用してSliderのテーマデータオブジェクトを取得できます。これには、Sliderの設定に使用される多くの属性が含まれています。\"", + "ButtonTheme【子孫】のボタンコンポーネントにデフォルトのスタイルを設定できます。これには、色、形状、サイズなどが含まれます。" + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderThemeによるSliderのスタイルカスタマイズ", + "desc": [ + "thumbShapeとvalueIndicatorShapeを使用してSliderのスタイルをカスタマイズできます。\"", + "注: この例はflutter-galleryのSlideDemoを参考にしています" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json new file mode 100644 index 00000000..09d0c527 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "슬라이더 스타일", + "info": "하나의 자식을 포함할 수 있으며, 후손 Slider에 기본 스타일을 지정합니다. 주로 Slider의 스타일 통일을 위해 사용되며, 일일이 설정하는 것을 방지하고, Slider의 스타일을 커스터마이징할 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme 사용", + "desc": [ + "SliderTheme.of를 통해 Slider 테마 데이터 객체를 얻을 수 있으며, 여기에는 Slider 설정을 위한 다양한 속성이 포함되어 있습니다.", + "ButtonTheme【후손】의 버튼 컴포넌트에 기본 스타일을 설정할 수 있으며, 색상, 모양, 크기 등을 포함합니다." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme를 통한 Slider 스타일 커스터마이징", + "desc": [ + "thumbShape와 valueIndicatorShape를 통해 Slider의 스타일을 커스터마이징할 수 있습니다.", + "참고: 이 예제는 flutter-gallery의 SlideDemo를 참고했습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json new file mode 100644 index 00000000..7e669c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Estilo do Controlo Deslizante", + "info": "Pode conter um filho, especificando o estilo padrão para o Controlo Deslizante descendente. Comumente usado para unificar o estilo do Controlo Deslizante, evitando a configuração individual, também pode personalizar o estilo do Controlo Deslizante.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do SliderTheme", + "desc": [ + "Pode obter o objeto de dados do tema do Controlo Deslizante através de SliderTheme.of, que contém uma grande quantidade de propriedades para configurar o Controlo Deslizante.", + "Pode definir o estilo padrão para os componentes de botão [descendentes] do ButtonTheme, incluindo cor, forma, tamanho, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalização do estilo do Controlo Deslizante com SliderTheme", + "desc": [ + "Através de thumbShape e valueIndicatorShape, pode personalizar o estilo do Controlo Deslizante.", + "Nota: Este exemplo é baseado no SlideDemo do flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json new file mode 100644 index 00000000..0f4ed94a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Стиль слайдера", + "info": "Может содержать один дочерний элемент, задает стиль по умолчанию для потомков Slider. Часто используется для унификации стилей Slider, чтобы избежать индивидуальной настройки, также позволяет настраивать стиль Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование SliderTheme", + "desc": [ + "Можно получить объект данных темы Slider через SliderTheme.of, который содержит множество свойств для настройки Slider.", + "Можно задать стиль по умолчанию для компонентов кнопок, являющихся потомками ButtonTheme, включая цвет, форму, размер и т.д." + ] + }, + { + "file": "node2_diy.dart", + "name": "Настройка стиля Slider с помощью SliderTheme", + "desc": [ + "С помощью thumbShape и valueIndicatorShape можно настроить стиль Slider.", + "Примечание: этот пример взят из SlideDemo в flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json new file mode 100644 index 00000000..b027fa96 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "滑块样式", + "info": "可容纳一个孩子,为后代的Slider指定默认样式。常用于Slider的样式统一,避免一一设置,也可以对Slider进行样式定制。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme使用", + "desc": [ + "可通过SliderTheme.of获取Slider主题数据对象,其中包含大量属性用于对Slider的设定。\"", + "可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。" + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme对Slider的样式定制", + "desc": [ + "通过thumbShape和valueIndicatorShape可以对Slider进行样式定制。\"", + "注: 本例参考flutter-gallery中的SlideDemo" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart new file mode 100644 index 00000000..ecf42093 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + + +class SliderThemeDemo extends StatefulWidget { + const SliderThemeDemo({Key? key}) : super(key: key); + + @override + _SliderThemeDemoState createState() => _SliderThemeDemoState(); +} + +class _SliderThemeDemoState extends State { + double _bliss = 0.5; + + @override + Widget build(BuildContext context) { + return SliderTheme( + data: SliderTheme.of(context).copyWith(activeTrackColor: Colors.orange), + child: Slider( + min: 0.0, + max: 200.0, + divisions: 10, + label: _bliss.toStringAsFixed(1), + onChanged: (double value) { + setState(() { + _bliss = value; + }); + }, + value: _bliss, + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart new file mode 100644 index 00000000..9681384c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart @@ -0,0 +1,173 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-12 +/// contact me by email 1981462002@qq.com + + +class DIYSliderTheme extends StatefulWidget { + const DIYSliderTheme({Key? key}) : super(key: key); + + @override + _DIYSliderThemeState createState() => _DIYSliderThemeState(); +} + +class _DIYSliderThemeState extends State { + double _bliss = 0.5; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + return SliderTheme( + data: theme.sliderTheme.copyWith( + activeTrackColor: Colors.deepPurple, + inactiveTrackColor: Colors.blue.withAlpha(55), + activeTickMarkColor: theme.colorScheme.onSurface.withOpacity(0.7), + inactiveTickMarkColor: theme.colorScheme.surface.withOpacity(0.7), + overlayColor: theme.colorScheme.onSurface.withOpacity(0.12), + thumbColor: Colors.deepPurple, + valueIndicatorColor: Colors.deepPurpleAccent, + thumbShape: _CustomThumbShape(), + valueIndicatorShape: _CustomValueIndicatorShape(), + valueIndicatorTextStyle: theme.primaryTextTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurface), + ), + child: Slider( + min: 0.0, + max: 200.0, + divisions: 10, + label: _bliss.toStringAsFixed(1), + onChanged: (double value) { + setState(() { + _bliss = value; + }); + }, + value: _bliss, + ), + ); + } +} + +class _CustomThumbShape extends SliderComponentShape { + static const double _thumbSize = 4.0; + static const double _disabledThumbSize = 3.0; + + @override + Size getPreferredSize(bool isEnabled, bool isDiscrete) { + return isEnabled + ? const Size.fromRadius(_thumbSize) + : const Size.fromRadius(_disabledThumbSize); + } + + static final Animatable sizeTween = Tween( + begin: _disabledThumbSize, + end: _thumbSize, + ); + + @override + void paint( + PaintingContext context, + Offset center, { + required Animation activationAnimation, + required Animation enableAnimation, + required bool isDiscrete, + required TextPainter labelPainter, + required RenderBox parentBox, + required SliderThemeData sliderTheme, + required TextDirection textDirection, + required double value, + required double textScaleFactor, + required Size sizeWithOverflow, + }) { + final Canvas canvas = context.canvas; + final ColorTween colorTween = ColorTween( + begin: sliderTheme.disabledThumbColor, + end: sliderTheme.thumbColor, + ); + final double size = _thumbSize * sizeTween.evaluate(enableAnimation); + final Path thumbPath = _downTriangle(size, center); + canvas.drawPath(thumbPath, + Paint()..color = colorTween.evaluate(enableAnimation) ?? Colors.blue); + } +} + +Path _upTriangle(double size, Offset thumbCenter) => + _downTriangle(size, thumbCenter, invert: true); + +Path _downTriangle(double size, Offset thumbCenter, {bool invert = false}) { + final Path thumbPath = Path(); + final double height = sqrt(3.0) / 2.0; + final double centerHeight = size * height / 3.0; + final double halfSize = size / 2.0; + final double sign = invert ? -1.0 : 1.0; + thumbPath.moveTo( + thumbCenter.dx - halfSize, thumbCenter.dy + sign * centerHeight); + thumbPath.lineTo(thumbCenter.dx, thumbCenter.dy - 2.0 * sign * centerHeight); + thumbPath.lineTo( + thumbCenter.dx + halfSize, thumbCenter.dy + sign * centerHeight); + thumbPath.close(); + return thumbPath; +} + +class _CustomValueIndicatorShape extends SliderComponentShape { + static const double _indicatorSize = 4.0; + static const double _disabledIndicatorSize = 3.0; + static const double _slideUpHeight = 30.0; + + @override + Size getPreferredSize(bool isEnabled, bool isDiscrete) { + return Size.fromRadius(isEnabled ? _indicatorSize : _disabledIndicatorSize); + } + + static final Animatable sizeTween = Tween( + begin: _disabledIndicatorSize, + end: _indicatorSize, + ); + + @override + void paint(PaintingContext context, Offset center, + {required Animation activationAnimation, + required Animation enableAnimation, + required bool isDiscrete, + required TextPainter labelPainter, + required RenderBox parentBox, + required SliderThemeData sliderTheme, + required TextDirection textDirection, + required double value, + required double textScaleFactor, + required Size sizeWithOverflow}) { + final Canvas canvas = context.canvas; + final ColorTween enableColor = ColorTween( + begin: sliderTheme.disabledThumbColor, + end: sliderTheme.valueIndicatorColor, + ); + final Tween slideUpTween = Tween( + begin: 0.0, + end: _slideUpHeight, + ); + final double size = _indicatorSize * sizeTween.evaluate(enableAnimation); + final Offset slideUpOffset = + Offset(0.0, -slideUpTween.evaluate(activationAnimation)); + final Path thumbPath = _upTriangle(size, center + slideUpOffset); + final Color paintColor = enableColor + .evaluate(enableAnimation) + ?.withAlpha((255.0 * activationAnimation.value).round()) ?? + Colors.black; + canvas.drawPath( + thumbPath, + Paint()..color = paintColor, + ); + canvas.drawLine( + center, + center + slideUpOffset, + Paint() + ..color = paintColor + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0); + labelPainter.paint( + canvas, + center + + slideUpOffset + + Offset(-labelPainter.width / 2.0, -labelPainter.height - 4.0)); + } +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json new file mode 100644 index 00000000..1a1cc3b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Tabellenzelle", + "info": "Muss in den Nachkommen der Table-Komponente verwendet werden, um die vertikale Ausrichtung der Tabellenkinder zu steuern, und hat keine große Bedeutung.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TableCell", + "desc": [ + "【child】 : Komponente 【Widget】", + "【verticalAlignment】 : Vertikale Ausrichtung 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json new file mode 100644 index 00000000..d1228b6f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Table Cell", + "info": "Must be used within the descendants of a Table component to control the vertical alignment of table children, and it doesn't have much significant function.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TableCell", + "desc": [ + "【child】: Component 【Widget】", + "【verticalAlignment】: Vertical Alignment 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json new file mode 100644 index 00000000..9166ac77 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Celda de tabla", + "info": "Debe usarse en los descendientes del componente Table, para controlar la alineación vertical de los hijos de la tabla, y no tiene un gran efecto.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Alineación vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json new file mode 100644 index 00000000..db2ee9d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Cellule de tableau", + "info": "Doit être utilisé dans la descendance du composant Table, pour contrôler l'alignement vertical des enfants du tableau, et n'a pas beaucoup d'effet.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TableCell", + "desc": [ + "【child】 : Composant 【Widget】", + "【verticalAlignment】 : Alignement vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json new file mode 100644 index 00000000..90ae875a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Cella della tabella", + "info": "Deve essere utilizzato all'interno dei discendenti del componente Table, per controllare l'allineamento verticale dei figli della tabella, e non ha un ruolo particolarmente significativo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Allineamento verticale 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json new file mode 100644 index 00000000..cd93b7ea --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "表室", + "info": "Tableコンポーネントの子孫で使用する必要があり、表の子の垂直方向の整列を制御するために使用されますが、大きな役割はありません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCellの基本的な使用法", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【verticalAlignment】 : 垂直方向の整列 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json new file mode 100644 index 00000000..2540d6fd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "테이블 셀", + "info": "Table 컴포넌트의 후손에서 사용해야 하며, 테이블 자식의 수직 정렬 방식을 제어하는 데 사용되며 큰 역할은 없습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCell 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【verticalAlignment】 : 수직 정렬 방식 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json new file mode 100644 index 00000000..df8c90a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Célula da Tabela", + "info": "Deve ser usado nos descendentes do componente Table, para controlar o alinhamento vertical dos filhos da tabela, e não tem um grande impacto.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Alinhamento Vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json new file mode 100644 index 00000000..143246f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Ячейка таблицы", + "info": "Должен использоваться в потомках компонента Table для управления вертикальным выравниванием дочерних элементов таблицы, но не имеет большого значения.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TableCell", + "desc": [ + "【child】 : Компонент 【Widget】", + "【verticalAlignment】 : Вертикальное выравнивание 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json new file mode 100644 index 00000000..ec9d663d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "表室", + "info": "必须在 Table 组件的后代中使用,用于控制表孩子的竖直方向对齐方式,并没是什么太大的作用。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCell基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【verticalAlignment】 : 竖直对齐方式 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart new file mode 100644 index 00000000..cd9dce2c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class TableCellDemo extends StatelessWidget { + const TableCellDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); + _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); + _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); + _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); + _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); + _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); + _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); + _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); + + List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; + + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Table( + columnWidths: const { + 0: FixedColumnWidth(80.0), + 1: FixedColumnWidth(80.0), + 2: FixedColumnWidth(80.0), + 3: FixedColumnWidth(80.0), + 4: FixedColumnWidth(80.0), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + border: TableBorder.all( + color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), + children: data + .map((item) => TableRow(children: [ + TableCell( + verticalAlignment: TableCellVerticalAlignment.bottom, + child: Text( + item.name, + style: const TextStyle(color: Colors.blue), + )), + TableCell( + verticalAlignment: TableCellVerticalAlignment.baseline, + child: Text(item.symbol)), + TableCell( + verticalAlignment: TableCellVerticalAlignment.top, + child: Text(item.unitSymbol)), + TableCell( + verticalAlignment: TableCellVerticalAlignment.fill, + child: Text(item.unitName)), + TableCell( + verticalAlignment: TableCellVerticalAlignment.middle, + child: SizedBox(height: 30, child: Text(item.unit)), + ), + ])) + .toList(), + ), + ); + } +} + +class _ItemBean { + String name; + String symbol; + String unit; + String unitName; + String unitSymbol; + + _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); +} diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json new file mode 100644 index 00000000..b03e2be3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Schaltflächenstil", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende ToggleButtons-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardattribute von ToggleButtons abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ToggleButtonsTheme", + "desc": [ + "Mit ToggleButtonsThemeData können Standardstile wie Rahmenstil, Farbe, Dekoration usw. für nachfolgende ToggleButtons-Komponenten festgelegt werden. Mit ToggleButtonsTheme.of können auch die Themendaten von ToggleButtons abgerufen werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json new file mode 100644 index 00000000..8b9d2017 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Slider Style", + "info": "Mainly used to set default properties for descendant ToggleButtons components uniformly. You can also get the default properties of ToggleButtons through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ToggleButtonsTheme", + "desc": [ + "You can specify the ToggleButtonsThemeData properties to set default styles for descendant ToggleButtons components, such as border style, color, decoration, etc. You can also use ToggleButtonsTheme.of to get the theme data of ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json new file mode 100644 index 00000000..0cfe28b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema de botones de alternancia", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes ToggleButtons descendientes, también se puede obtener las propiedades predeterminadas de ToggleButtons a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ToggleButtonsTheme", + "desc": [ + "Se puede especificar la propiedad de datos ToggleButtonsThemeData para establecer estilos predeterminados para los componentes ToggleButtons descendientes, como estilos de borde, colores, decoraciones, etc. También se puede usar ToggleButtonsTheme.of para obtener los datos del tema de ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json new file mode 100644 index 00000000..34f273ee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Thème des boutons bascule", + "info": "Principalement utilisé pour définir des propriétés par défaut unifiées pour les composants ToggleButtons descendants, ou pour obtenir les propriétés par défaut des ToggleButtons via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ToggleButtonsTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ToggleButtonsThemeData pour définir le style par défaut des composants ToggleButtons descendants, tels que le style de bordure, la couleur, la décoration, etc. Vous pouvez également utiliser ToggleButtonsTheme.of pour obtenir les données de thème des ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json new file mode 100644 index 00000000..2e7b7069 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema dei pulsanti di commutazione", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ToggleButtons dei discendenti. È anche possibile ottenere le proprietà predefinite dei ToggleButtons tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ToggleButtonsTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ToggleButtonsThemeData per impostare lo stile predefinito per i componenti ToggleButtons dei discendenti, come lo stile del bordo, il colore, la decorazione, ecc. È anche possibile utilizzare ToggleButtonsTheme.of per ottenere i dati del tema dei ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json new file mode 100644 index 00000000..dd837f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "スライダースタイル", + "info": "主に子孫のToggleButtonsコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのToggleButtonsのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsThemeの基本使用", + "desc": [ + "ToggleButtonsThemeDataデータプロパティを指定して、子孫のToggleButtonsコンポーネントにデフォルトのスタイル(ボーダースタイル、色、装飾など)を設定できます。また、ToggleButtonsTheme.ofを使用してToggleButtonsのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json new file mode 100644 index 00000000..6083acee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "토글 버튼 스타일", + "info": "주로 후손 ToggleButtons 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 ToggleButtons의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsTheme 기본 사용법", + "desc": [ + "ToggleButtonsThemeData 데이터 속성을 지정하여 후손 ToggleButtons 컴포넌트에 기본 스타일(예: 테두리 스타일, 색상, 장식 등)을 설정할 수 있습니다. 또한 ToggleButtonsTheme.of를 사용하여 ToggleButtons의 테마 데이터를 얻을 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json new file mode 100644 index 00000000..b5f22631 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema dos Botões de Alternância", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes ToggleButtons descendentes, também é possível obter as propriedades padrão do ToggleButtons através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ToggleButtonsTheme", + "desc": [ + "Pode especificar as propriedades de dados do ToggleButtonsThemeData para definir o estilo padrão para componentes ToggleButtons descendentes, como estilo de borda, cor, decoração, etc. Também é possível usar ToggleButtonsTheme.of para obter os dados do tema do ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json new file mode 100644 index 00000000..c5789f62 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Тема переключателей", + "info": "В основном используется для установки стандартных свойств для компонентов ToggleButtons у потомков, также можно получить свойства по умолчанию для ToggleButtons через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ToggleButtonsTheme", + "desc": [ + "Можно указать свойства данных ToggleButtonsThemeData для установки стандартных стилей для компонентов ToggleButtons у потомков, таких как стиль границы, цвет, оформление и т.д. Также можно использовать ToggleButtonsTheme.of для получения тематических данных ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json new file mode 100644 index 00000000..001beb48 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "滑块样式", + "info": "主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsTheme基本使用", + "desc": [ + "可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart new file mode 100644 index 00000000..715cea36 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class ToggleButtonsThemeDemo extends StatelessWidget { + const ToggleButtonsThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ToggleButtonsTheme( + data: ToggleButtonsTheme.of(context).copyWith( + borderWidth: 1, + borderColor: Colors.orangeAccent, + selectedBorderColor: Colors.blue, + splashColor: Colors.purple.withAlpha(66), + borderRadius: BorderRadius.circular(10), + selectedColor: Colors.red, + fillColor: Colors.green.withAlpha(11), + ), + child: _ToggleButtonsSimple(), + ); + } +} + + +class _ToggleButtonsSimple extends StatefulWidget { + @override + _ToggleButtonsSimpleState createState() => _ToggleButtonsSimpleState(); +} + +class _ToggleButtonsSimpleState extends State<_ToggleButtonsSimple> { + var _isSelected = [true, false, false]; + + @override + Widget build(BuildContext context) { + return ToggleButtons( + children: const[ + Icon(Icons.skip_previous), + Icon(Icons.pause), + Icon(Icons.skip_next), + ], + isSelected: _isSelected, + onPressed: (value) => setState(() { + _isSelected = _isSelected.map((e) => false).toList(); + _isSelected[value] = true; + }), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json new file mode 100644 index 00000000..7c6030a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tooltip-Thema", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende Tooltip-Komponenten festzulegen. Es kann auch verwendet werden, um die Attribute des standardmäßigen Tooltip-Themas abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TooltipTheme", + "desc": [ + "Kann die TooltipThemeData-Datenattribute festlegen, um Standardstile für nachfolgende Tooltip-Komponenten zu definieren, wie Dekoration, Textstil, Anzeigedauer, Randabstand usw. Es kann auch TooltipTheme.of verwenden, um die Themenattribute des Tooltips abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json new file mode 100644 index 00000000..a51860c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tooltip Theme", + "info": "Mainly used to set default properties for descendant Tooltip components uniformly. You can also retrieve the properties of the default TooltipTheme through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TooltipTheme", + "desc": [ + "You can specify the TooltipThemeData properties to set default styles for descendant Tooltip components, such as decoration, text style, display duration, margins, etc. You can also use TooltipTheme.of to get the theme properties of Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json new file mode 100644 index 00000000..f9f3e91d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema de Tooltip", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes Tooltip descendientes. También se pueden obtener las propiedades predeterminadas de TooltipTheme a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TooltipTheme", + "desc": [ + "Se pueden especificar las propiedades de TooltipThemeData para establecer estilos predeterminados para los componentes Tooltip descendientes, como decoración, estilo de texto, duración de visualización, márgenes, etc. También se puede usar TooltipTheme.of para obtener las propiedades del tema de Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json new file mode 100644 index 00000000..c8fc68cf --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Thème d'infobulle", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants Tooltip pour les descendants. Il est également possible d'obtenir les propriétés du TooltipTheme par défaut via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TooltipTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de TooltipThemeData pour définir le style par défaut des composants Tooltip pour les descendants, comme la décoration, le style du texte, la durée d'affichage, les marges, etc. Vous pouvez également utiliser TooltipTheme.of pour obtenir les propriétés du thème Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json new file mode 100644 index 00000000..6689bbad --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema del Tooltip", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti Tooltip discendenti. È anche possibile ottenere le proprietà del TooltipTheme predefinito tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TooltipTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di TooltipThemeData per impostare lo stile predefinito per i componenti Tooltip discendenti, come decorazioni, stili di testo, durata di visualizzazione, margini, ecc. È anche possibile utilizzare TooltipTheme.of per ottenere le proprietà del tema del Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json new file mode 100644 index 00000000..a4b3839f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "ツールチップテーマ", + "info": "主に、子孫のTooltipコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのTooltipThemeのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipThemeの基本使用", + "desc": [ + "TooltipThemeDataデータプロパティを指定して、【子孫】のTooltipコンポーネントにデフォルトのスタイルを設定できます。例えば、装飾、テキストスタイル、表示時間、余白など。また、TooltipTheme.ofを使用してTooltipのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json new file mode 100644 index 00000000..bb80ad7c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "툴팁 테마", + "info": "주로 후손의 Tooltip 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 TooltipTheme의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipTheme 기본 사용", + "desc": [ + "TooltipThemeData 데이터 속성을 지정하여 【후손】의 Tooltip 컴포넌트에 기본 스타일을 설정할 수 있습니다. 예를 들어, 장식, 텍스트 스타일, 표시 시간, 여백 등이 있습니다. 또한 TooltipTheme.of를 사용하여 Tooltip의 테마 속성을 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json new file mode 100644 index 00000000..e5fceabe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema de Dica", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes Tooltip descendentes, também é possível obter as propriedades do TooltipTheme padrão através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TooltipTheme", + "desc": [ + "Pode especificar as propriedades de dados do TooltipThemeData para definir o estilo padrão para componentes Tooltip descendentes, como decoração, estilo de texto, duração de exibição, margens, etc. Também é possível usar TooltipTheme.of para obter as propriedades temáticas do Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json new file mode 100644 index 00000000..af7aa3ff --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Тема подсказки", + "info": "В основном используется для установки стандартных свойств для компонентов Tooltip потомков, также можно получить свойства стандартного TooltipTheme через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TooltipTheme", + "desc": [ + "Можно указать свойства данных TooltipThemeData для установки стандартного стиля для компонентов Tooltip потомков, таких как декор, стиль текста, продолжительность отображения, отступы и т.д. Также можно использовать TooltipTheme.of для получения тематических свойств Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json new file mode 100644 index 00000000..ad727ade --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "提示主题", + "info": "主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipTheme基本使用", + "desc": [ + "可指定TooltipThemeData数据属性为【后代】的Tooltip组件设置默认样式,如装饰、文字样式、显示时长、边距等。也可以用TooltipTheme.of获取Tooltip的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart new file mode 100644 index 00000000..0ef30903 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class TooltipThemeDemo extends StatelessWidget { + const TooltipThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return TooltipTheme( + child: const TempTooltip(), + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + padding: const EdgeInsets.all(5), + verticalOffset: 20, + margin: const EdgeInsets.all(2), + textStyle: const TextStyle(color: Colors.red, shadows: [ + Shadow(color: Colors.white, offset: Offset(1, 1)), + ]), + decoration: const BoxDecoration(boxShadow: [ + BoxShadow( + color: Colors.orangeAccent, + offset: Offset(1, 1), + blurRadius: 8) + ]))); + } +} + +class TempTooltip extends StatelessWidget { + const TempTooltip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: const [ + Tooltip(message: "天王盖地虎", child: Icon(Icons.info_outline)), + Tooltip(message: "宝塔镇河妖", child: Icon(Icons.info_outline)), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json new file mode 100644 index 00000000..6f468c5b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Klicks absorbieren", + "info": "Enthält ein Kind-Widget und kann durch das Festlegen des Attributs ignoring entscheiden, ob das Kind Gestenereignisse ignoriert, während es selbst Ereignisse akzeptiert.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AbsorbPointer", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【absorbing】 : Ob Ereignisse absorbiert werden 【bool】", + "Wie unten gezeigt, wenn der Switch ausgewählt ist, ist absorbing true, und die Schaltflächenereignisse werden absorbiert und können nicht geklickt werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json new file mode 100644 index 00000000..d8d6217b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorb Click", + "info": "Contains a child component, and it can decide whether the child ignores gesture events by specifying the ignoring attribute, while it itself accepts events.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AbsorbPointer", + "desc": [ + "【child】: Child component 【Widget】", + "【absorbing】: Whether to absorb events 【bool】", + "As shown below, when the Switch is selected, absorbing is true, and the button event will be absorbed and cannot be clicked." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json new file mode 100644 index 00000000..69fbccce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorber Clics", + "info": "Contiene un componente hijo y puede decidir si el hijo ignora los eventos de gestos especificando la propiedad ignoring, mientras que él mismo acepta los eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AbsorbPointer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【absorbing】 : Si absorbe eventos 【bool】", + "Como se muestra a continuación, cuando el Switch está seleccionado, absorbing es true y los eventos del botón serán absorbidos, no se podrá hacer clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json new file mode 100644 index 00000000..f4e3f32e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorber les clics", + "info": "Contient un composant enfant et peut décider si l'enfant ignore les événements gestuels en spécifiant la propriété ignoring, tout en acceptant les événements lui-même.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AbsorbPointer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【absorbing】 : Si les événements sont absorbés 【bool】", + "Comme ci-dessous, lorsque le Switch est sélectionné, absorbing est true, les événements du bouton seront absorbés et ne pourront pas être cliqués." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json new file mode 100644 index 00000000..3bd4e2e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Assorbi Clic", + "info": "Contiene un componente figlio, è possibile decidere se il figlio ignora gli eventi del gesto specificando l'attributo ignoring, mentre esso stesso accetta gli eventi.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AbsorbPointer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【absorbing】 : Se assorbire gli eventi 【bool】", + "Come mostrato di seguito, quando Switch è selezionato, absorbing è true, gli eventi del pulsante verranno assorbiti e non sarà possibile fare clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json new file mode 100644 index 00000000..87d7845d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "クリックを吸収", + "info": "子コンポーネントを含み、ignoring属性を指定することで、子がジェスチャーイベントを無視するかどうかを決定し、それ自体がイベントを受け取ります。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【absorbing】 : イベントを吸収するかどうか 【bool】", + "以下の例では、Switchが選択されている場合、absorbingがtrueになり、ボタンのイベントが吸収され、クリックできなくなります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json new file mode 100644 index 00000000..5c8c5577 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "클릭 흡수", + "info": "자식 위젯을 포함하며, ignoring 속성을 지정하여 자식이 제스처 이벤트를 무시할지 여부를 결정할 수 있습니다. 그 자체는 이벤트를 받습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointer 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【absorbing】 : 이벤트를 흡수할지 여부 【bool】", + "아래와 같이, Switch가 선택되면 absorbing이 true가 되어 버튼 이벤트가 흡수되어 클릭할 수 없게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json new file mode 100644 index 00000000..8a4c7c7d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorver Clique", + "info": "Contém um componente filho e pode decidir se o filho ignora eventos de gestos especificando o atributo ignoring, enquanto ele próprio aceita eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AbsorbPointer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【absorbing】 : Se absorve eventos 【bool】", + "Como mostrado abaixo, quando o Switch está selecionado, absorbing é true e o evento do botão será absorvido, não podendo ser clicado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json new file mode 100644 index 00000000..c5552f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Поглощение кликов", + "info": "Содержит дочерний компонент, который может игнорировать жестовые события в зависимости от указанного свойства ignoring, при этом сам компонент принимает события.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AbsorbPointer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【absorbing】 : Поглощать ли события 【bool】", + "Как показано ниже, когда Switch выбран, absorbing равно true, и событие кнопки будет поглощено, и нажатие будет невозможно." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json new file mode 100644 index 00000000..e17289d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "吸收点击", + "info": "容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身接受事件。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【absorbing】 : 是否吸收事件 【bool】", + "如下,Switch选中时absorbing为true,按钮事件将被吸收,无法点击。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart new file mode 100644 index 00000000..efca1c01 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + + +class CustomAbsorbPointer extends StatefulWidget { + const CustomAbsorbPointer({Key? key}) : super(key: key); + + @override + _CustomAbsorbPointerState createState() => _CustomAbsorbPointerState(); +} + +class _CustomAbsorbPointerState extends State { + bool _absorbing = false; + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + GestureDetector( + onTap: (){ + print('AbsorbPointer'); + }, + child: AbsorbPointer( + absorbing: _absorbing, + child: _buildButton(), + ), + ), + _buildSwitch(), + Text(!_absorbing ? '允许点击' : '事件已被吸收') + ], + ); + } + + Widget _buildButton() => ElevatedButton( + child: const Text( + 'To About', + style: TextStyle(color: Colors.white), + ), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); + + Widget _buildSwitch() => Switch( + value: _absorbing, + onChanged: (v) { + setState(() { + _absorbing = v; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json new file mode 100644 index 00000000..2fe4515f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Ausrichtungskomponente", + "info": "Kann ein Unterelement aufnehmen und kann das Unterelement durch Ausrichtung an jeder angegebenen Position der Breite und Höhe des übergeordneten Elements positionieren.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Align", + "desc": [ + "【child】: Unterelement 【Widget】", + "【alignment】: Ausrichtung 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Andere Verwendungen von Align", + "desc": [ + "Da das Alignment-Objekt eine Position im Verhältnis zur Breite und Höhe des übergeordneten Containers angeben kann", + "kann Align verwendet werden, um komplexe Layoutanforderungen zu erfüllen, z.B. die Position nach einer bestimmten mathematischen Gleichung zu ändern" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json new file mode 100644 index 00000000..713413e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Align Component", + "info": "Can accommodate a child component, and the child component can be positioned at any specified fraction of the parent component's width and height through alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Align", + "desc": [ + "【child】 : Child component 【Widget】", + "【alignment】 : Alignment method 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Other Usages of Align", + "desc": [ + "Since the Alignment object can specify the fractional position of the width and height in the parent container", + "Align can be used to achieve some complex layout requirements, such as changing positions according to specified mathematical equations" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json new file mode 100644 index 00000000..ca2eee77 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente de Alineación", + "info": "Puede contener un componente hijo, y se puede posicionar en cualquier fracción específica del ancho y alto del componente padre a través de alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Align", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【alignment】: Método de alineación 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Otros usos de Align", + "desc": [ + "Dado que el objeto Alignment puede especificar la posición de la fracción del ancho y alto en el contenedor padre", + "Se puede usar Align para implementar algunas necesidades de disposición complejas, como cambiar la posición según ecuaciones matemáticas específicas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json new file mode 100644 index 00000000..0afdeb17 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Composant d'alignement", + "info": "Peut contenir un composant enfant, et permet de positionner le composant enfant à n'importe quelle fraction spécifiée de la largeur et de la hauteur du composant parent via l'alignement.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Align", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【alignment】 : Méthode d'alignement 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Autres utilisations d'Align", + "desc": [ + "Puisque l'objet Alignment peut spécifier une position fractionnaire dans la largeur et la hauteur du conteneur parent", + "Align peut être utilisé pour répondre à des besoins de mise en page complexes, tels que des changements de position selon des équations mathématiques spécifiées" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json new file mode 100644 index 00000000..c9dec642 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente Allineamento", + "info": "Può contenere un componente figlio, e può posizionare il componente figlio in qualsiasi frazione specificata della larghezza e altezza del componente genitore tramite l'allineamento.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Align", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Altri usi di Align", + "desc": [ + "Poiché l'oggetto Alignment può specificare la posizione della frazione di larghezza e altezza nel contenitore genitore", + "è possibile utilizzare Align per soddisfare alcune esigenze di layout complesse, come cambiare posizione secondo equazioni matematiche specificate" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json new file mode 100644 index 00000000..1a06a336 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "整列コンポーネント", + "info": "1つの子コンポーネントを収容でき、alignmentを使用して子コンポーネントを親コンポーネントの幅と高さの任意の指定された比率に配置できます。", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alignの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【alignment】 : 整列方法 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Alignのその他の使用法", + "desc": [ + "Alignmentオブジェクトは、親コンテナ内の幅と高さの比率位置を指定できるため", + "Alignを使用して、指定された数学的方程式に従って位置を変化させるなど、複雑なレイアウト要件を実現できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json new file mode 100644 index 00000000..d7c244cb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "정렬 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, alignment를 통해 자식 컴포넌트를 부모 컴포넌트의 너비와 높이의 지정된 비율 위치에 배치할 수 있습니다.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Align 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Align 기타 사용법", + "desc": [ + "Alignment 객체는 부모 컨테이너에서 너비와 높이의 비율 위치를 지정할 수 있으므로", + "Align을 사용하여 복잡한 배치 요구 사항을 구현할 수 있습니다. 예를 들어 지정된 수학 방정식에 따라 위치를 변경하는 것과 같은 요구 사항을 구현할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json new file mode 100644 index 00000000..c3da9f49 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente de Alinhamento", + "info": "Pode conter um componente filho, e pode posicionar o componente filho em qualquer fração especificada da largura e altura do componente pai através do alinhamento.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Align", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Outros Usos do Align", + "desc": [ + "Como o objeto Alignment pode especificar a posição da fração de largura e altura no contêiner pai", + "Pode-se usar o Align para implementar algumas necessidades complexas de layout, como mudar a posição de acordo com uma equação matemática especificada" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json new file mode 100644 index 00000000..af7806c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Компонент выравнивания", + "info": "Может содержать один дочерний компонент, который можно расположить в любом указанном месте ширины и высоты родительского компонента с помощью alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Align", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Другие способы использования Align", + "desc": [ + "Поскольку объект Alignment может указывать положение в долях ширины и высоты родительского контейнера", + "Можно использовать Align для реализации сложных требований к расположению, например, для изменения положения по указанному математическому уравнению" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json new file mode 100644 index 00000000..ba46195d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "对齐组件", + "info": "可容纳一个子组件,可以通过alignment让子组件,定位在父组件宽高的任何指定分率出。", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Align基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Align其他用法", + "desc": [ + "由于Alignment对象可指定在父容器中宽高的分率位置", + "可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart new file mode 100644 index 00000000..5e6ae234 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart @@ -0,0 +1,55 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomAlign extends StatelessWidget { + const CustomAlign({Key? key}) : super(key: key); + + final List alignments = const [ + Alignment.topLeft, + Alignment.topCenter, + Alignment.topRight, + Alignment.centerLeft, + Alignment.center, + Alignment.centerRight, + Alignment.bottomLeft, + Alignment.bottomCenter, + Alignment.bottomRight, + ]; + + final List alignmentsInfo = const [ + "topLeft", + "topCenter", + "topRight", + "centerLeft", + "center", + "centerRight", + "bottomLeft", + "bottomCenter", + "bottomRight", + ]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: alignments + .toList() + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 100, + height: 60, + color: Colors.grey.withAlpha(88), + child: Align( + child: Container( + width: 30, + height: 30, + color: Colors.cyanAccent, + ), + alignment: mode)), + Text(alignmentsInfo[alignments.indexOf(mode)]) + ])) + .toList()); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart similarity index 82% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart index c8751eea..3983e6fe 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart @@ -3,15 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 85, -// "name": 'Align其他用法', -// "priority": 2, -// "subtitle": -// "由于Alignment对象可指定在父容器中宽高的分率位置\n" -// "可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置", -// } + class Ball extends StatelessWidget { const Ball({ Key? key, diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json new file mode 100644 index 00000000..cef55e3b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Größenanimation", + "info": "Wenn sich die Größe der Unterkomponente ändert, erfolgt eine animierte Überblendung. Attribute wie Dauer, Ausrichtung, Kurve, vsync usw. können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedSize", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【curve】 : Animationskurve 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json new file mode 100644 index 00000000..8c6d66b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Size Animation", + "info": "When the size of the child component changes, it animates gradually. You can specify properties such as duration, alignment, curve, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedSize", + "desc": [ + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【alignment】 : Alignment 【AlignmentGeometry】", + "【curve】 : Animation curve 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json new file mode 100644 index 00000000..0bd59a18 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animación de Tamaño", + "info": "Cuando el tamaño del componente hijo cambia, se realiza una transición animada. Se pueden especificar propiedades como la duración, la alineación, la curva, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de AnimatedSize", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【curve】 : Curva de la animación 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json new file mode 100644 index 00000000..5acea2c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animation de taille", + "info": "Lorsque la taille du composant enfant change, une transition animée est effectuée. Vous pouvez spécifier des propriétés telles que la durée, l'alignement, la courbe, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedSize", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【curve】 : Courbe de l'animation 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json new file mode 100644 index 00000000..59207c7e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animazione delle dimensioni", + "info": "Quando le dimensioni del componente figlio cambiano, viene eseguita una transizione animata. È possibile specificare proprietà come durata, allineamento, curva, vsync, ecc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedSize", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【curve】 : Curva dell'animazione 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json new file mode 100644 index 00000000..f427d6d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "サイズアニメーション", + "info": "子コンポーネントのサイズが変化する際に、アニメーションで滑らかに変化させます。持続時間、整列方法、曲線、vsyncなどの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSizeの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの持続時間 【Duration】", + "【alignment】 : 整列方法 【AlignmentGeometry】", + "【curve】 : アニメーション曲線 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json new file mode 100644 index 00000000..2060ce8c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "크기 애니메이션", + "info": "자식 컴포넌트의 크기가 변경될 때 애니메이션을 통해 점진적으로 변화시킵니다. 지속 시간, 정렬 방식, 곡선, vsync 등의 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSize 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json new file mode 100644 index 00000000..b6bb9f9f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animação de Tamanho", + "info": "Quando o tamanho do componente filho muda, ocorre uma transição animada, podendo especificar duração, alinhamento, curva, vsync, entre outros atributos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedSize", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【curve】 : Curva da animação 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json new file mode 100644 index 00000000..465dd96f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Анимация размера", + "info": "Когда размер дочернего компонента изменяется, происходит плавная анимация. Можно указать такие свойства, как продолжительность, способ выравнивания, кривая, vsync и другие.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedSize", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【curve】 : Кривая анимации 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json new file mode 100644 index 00000000..b5559c1f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "尺寸动画", + "info": "子组件大小发生变化时,进行动画渐变,可指定时长、对齐方式、曲线、vsync等属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSize基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【curve】 : 动画曲线 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart new file mode 100644 index 00000000..deb0e60d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + + +class CustomAnimatedSize extends StatefulWidget { + const CustomAnimatedSize({Key? key}) : super(key: key); + + @override + _CustomAnimatedSizeState createState() => _CustomAnimatedSizeState(); +} + +class _CustomAnimatedSizeState extends State + with SingleTickerProviderStateMixin { + final double start = 100; + final double end = 200; + + late double _width; + + @override + void initState() { + _width = start; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + alignment: Alignment.center, + child: AnimatedSize( + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + alignment: const Alignment(0, 0), + child: Container( + height: 40, + width: _width, + alignment: Alignment.center, + color: Colors.blue, + child: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.white), + ), + ), + ), + ), + ], + ); + } + + Widget _buildSwitch() => Switch( + value: _width == end, + onChanged: (v) { + setState(() { + _width = v ? end : start; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json new file mode 100644 index 00000000..8b062ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Annotierter Bereich", + "info": "Es gibt einen generischen Typ, der im Quellcode nur in app_bar und nav_bar verwendet wird, um den Zustand und das Styling der Navigationsleiste zu ändern. Der generische Typ ist normalerweise SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion ändert Zustand und Stil", + "desc": [ + "【value】 : Wert 【T】", + "【sized】 : Gibt die Größe an 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json new file mode 100644 index 00000000..f99c679a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Annotation Area", + "info": "There is a generic type, which is only used in app_bar and nav_bar in the source code to change the state variables and navigation bar styles. The generic type is usually SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion Changes State Variables and Styles", + "desc": [ + "【value】 : value 【T】", + "【sized】 : whether to provide size 【bool】", + "【child】 : child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json new file mode 100644 index 00000000..459a57c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Región Anotada", + "info": "Tiene un genérico, en el código fuente solo se usa este componente en app_bar, nav_bar para cambiar el estado y el estilo de la barra de navegación, el genérico suele ser SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion cambia el estilo del estado", + "desc": [ + "【value】 : valor 【T】", + "【sized】 : si proporciona tamaño 【bool】", + "【child】 : componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json new file mode 100644 index 00000000..0f73321e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Région annotée", + "info": "Il y a un générique, dans le code source, il est uniquement utilisé dans app_bar, nav_bar pour modifier les variables d'état et le style de la barre de navigation, le générique est généralement SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion modifie le style des variables d'état", + "desc": [ + "【value】 : valeur 【T】", + "【sized】 : fournit-il une taille 【bool】", + "【child】 : composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json new file mode 100644 index 00000000..05a27dc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Area Annotata", + "info": "Ha un generico, nel codice sorgente viene utilizzato solo in app_bar, nav_bar per modificare lo stato e lo stile della barra di navigazione, il generico è solitamente SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion cambia lo stile dello stato", + "desc": [ + "【value】 : valore 【T】", + "【sized】 : se fornisce dimensione 【bool】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json new file mode 100644 index 00000000..4c1e0e95 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "注釈領域", + "info": "ジェネリックがあり、ソースコードでは app_bar と nav_bar でのみ使用され、状態量やナビゲーションバーのスタイルを変更するために使用されます。ジェネリックは通常 SystemUiOverlayStyle です。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegionが状態量のスタイルを変更", + "desc": [ + "【value】 : 値 【T】", + "【sized】 : サイズを提供するかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json new file mode 100644 index 00000000..fc2a0df6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "주석 영역", + "info": "제네릭이 있으며, 소스 코드에서는 app_bar, nav_bar에서만 이 컴포넌트를 사용하여 상태 변수와 네비게이션 바 스타일을 변경합니다. 제네릭은 일반적으로 SystemUiOverlayStyle입니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion 상태 변수 스타일 변경", + "desc": [ + "【value】 : 값 【T】", + "【sized】 : 크기 제공 여부 【bool】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json new file mode 100644 index 00000000..91c03b45 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Região Anotada", + "info": "Tem um genérico, no código-fonte, este componente é usado apenas em app_bar e nav_bar para alterar variáveis de estado e o estilo da barra de navegação, o genérico geralmente é SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion altera o estilo da variável de estado", + "desc": [ + "【value】 : valor 【T】", + "【sized】 : se fornece tamanho 【bool】", + "【child】 : componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json new file mode 100644 index 00000000..8a65397d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Область аннотации", + "info": "Имеет обобщение, в исходном коде используется только в app_bar, nav_bar для изменения состояния и стиля навигационной панели, обобщение обычно SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion изменяет состояние и стиль", + "desc": [ + "【value】 : значение 【T】", + "【sized】 : предоставляет ли размер 【bool】", + "【child】 : дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json new file mode 100644 index 00000000..f8aee6e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "标注区域", + "info": "有一个泛型,源码中仅在 app_bar, nav_bar 中使用该组件改变状态量、导航栏样式,泛型通常为 SystemUiOverlayStyle。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion改变状态量样式", + "desc": [ + "【value】 : 值 【T】", + "【sized】 : 是否提供大小 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart new file mode 100644 index 00000000..1b518dbf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + + +class AnnotatedRegionDemo extends StatelessWidget { + const AnnotatedRegionDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(10), + child: ElevatedButton( + onPressed: (){ + Navigator.push(context, + MaterialPageRoute(builder: (context) => const AnnotatedRegionTestPage()), + ); + }, + child: const Text("进入 AnnotatedRegion 测试页"), + ), + ); + } +} + + +class AnnotatedRegionTestPage extends StatelessWidget{ + const AnnotatedRegionTestPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + const SystemUiOverlayStyle overlayStyle = SystemUiOverlayStyle( + systemNavigationBarColor: Colors.green, + // 导航栏颜色 + systemNavigationBarDividerColor: Colors.red, + statusBarColor: Colors.blue, + systemNavigationBarIconBrightness: Brightness.light, + statusBarIconBrightness: Brightness.light, + statusBarBrightness: Brightness.light, + ); + + return AnnotatedRegion( + value: overlayStyle, + child: Scaffold( + body: Column( + children: [ + Container(height: 56+30.0,color: Colors.blue, + alignment: const Alignment(0,0.55), + child: Row( + children: const [ + BackButton(color: Colors.white,), + Text("AnnotatedRegion测试",style: TextStyle(color: Colors.white,fontSize: 18),) + ], + ), + ), + const SizedBox(height: 30,), + const Text( + "上面标题栏背景颜色为蓝色\n" + "上面标题栏图标为亮调", + + style: TextStyle(color: Colors.black,fontSize: 18),), + const Spacer(), + const Text( + "下面导航栏背景颜色为绿色\n" + "下面导航栏图标为亮调", + + style: TextStyle(color: Colors.black,fontSize: 18),), + const SizedBox(height: 30,), + ], + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json new file mode 100644 index 00000000..5c92c3eb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Proportion Box", + "info": "Kann ein Kindelement aufnehmen und durch die Angabe des Seitenverhältnisses aspectRatio den Bereich für das Kindelement begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AspectRatio", + "desc": [ + "【child】: Kindelement 【Widget】", + "【aspectRatio】: Seitenverhältnis 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json new file mode 100644 index 00000000..b70c7005 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Aspect Ratio Box", + "info": "Can contain a child component, and limit the area of the child component by specifying the aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AspectRatio", + "desc": [ + "【child】: Child component 【Widget】", + "【aspectRatio】: Aspect ratio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json new file mode 100644 index 00000000..9965faeb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Caja de proporción", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando la relación de aspecto aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AspectRatio", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【aspectRatio】 : Relación de aspecto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json new file mode 100644 index 00000000..77b231b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Boîte de proportion", + "info": "Peut contenir un composant enfant, en spécifiant le rapport largeur/hauteur aspectRatio pour limiter la zone d'accueil du composant enfant.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AspectRatio", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【aspectRatio】 : Rapport largeur/hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json new file mode 100644 index 00000000..720e84a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Scatola delle proporzioni", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando il rapporto larghezza-altezza aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AspectRatio", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【aspectRatio】 : Rapporto larghezza-altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json new file mode 100644 index 00000000..489aa460 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "アスペクト比ボックス", + "info": "一つの子コンポーネントを収容し、aspectRatioを指定して子コンポーネントの収容領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatioの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【aspectRatio】 : アスペクト比 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json new file mode 100644 index 00000000..edbafc88 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "비율 상자", + "info": "하위 컴포넌트를 포함할 수 있으며, aspectRatio를 지정하여 하위 컴포넌트의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatio 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【aspectRatio】 : 너비 높이 비율 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json new file mode 100644 index 00000000..510b1676 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Caixa de Proporção", + "info": "Pode conter um componente filho, limitando a área do componente filho ao especificar a proporção de aspecto aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AspectRatio", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【aspectRatio】 : Proporção de largura e altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json new file mode 100644 index 00000000..17a1611f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Пропорциональная коробка", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента, задавая соотношение сторон aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AspectRatio", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【aspectRatio】 : Соотношение сторон 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json new file mode 100644 index 00000000..89fffc05 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "比例盒", + "info": "可容纳一个子组件,通过指定宽高比aspectRatio,来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatio基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【aspectRatio】 : 宽高比例 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart new file mode 100644 index 00000000..eb74f52e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomAspectRatio extends StatefulWidget { + const CustomAspectRatio({Key? key}) : super(key: key); + + @override + _CustomAspectRatioState createState() => _CustomAspectRatioState(); +} + +class _CustomAspectRatioState extends State { + double _ratio = 0.75; + + @override + Widget build(BuildContext context) { + Widget child = Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 50, + height: 50, + child: const Text("Static"), + ); + + Widget box = AspectRatio( + aspectRatio: _ratio, + child: Container( + color: Colors.orange, + child: const Icon( + Icons.android, + color: Colors.white, + )), + ); + + return Column( + children: [ + _buildSlider(), + Container( + color: Colors.grey.withAlpha(22), + width: 300, + height: 100, + child: Row( + children: [child, box, child], + ), + ), + ], + ); + } + + Widget _buildSlider() => Slider( + divisions: 20, + min: 0.1, + max: 2.0, + label: _ratio.toStringAsFixed(2), + value: _ratio, + onChanged: (v) => setState(() => _ratio = v), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json new file mode 100644 index 00000000..c9c76df7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Hintergrundfilter", + "info": "Kann ein Kind aufnehmen und den Hintergrund mit einem Unschärfefilter versehen. Durch Stack kann der Hintergrund unscharf gemacht werden, um den Unschärfeeffekt der Komponente zu erreichen.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BackdropFilter", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【filter】 : Filter 【ImageFilter】", + "ImageFilter.blur kann eine Gaußsche Unschärfe erzeugen, indem die x- und y-Unschärfefaktoren angegeben werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json new file mode 100644 index 00000000..1f60983e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Background Filter", + "info": "Can hold a child and apply a blur filter to the background. The background blur effect of the component can be achieved through Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BackdropFilter", + "desc": [ + "【child】: Child component 【Widget】", + "【filter】: Filter 【ImageFilter】", + "ImageFilter.blur can achieve Gaussian blur by specifying the x and y blur factors." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json new file mode 100644 index 00000000..742f80d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro de fondo", + "info": "Puede contener un hijo y aplicar un filtro de desenfoque al fondo. El efecto de desenfoque en los componentes se puede lograr utilizando Stack para desenfocar el fondo.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BackdropFilter", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur puede implementar un desenfoque gaussiano, especificando los factores de desenfoque x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json new file mode 100644 index 00000000..bf45ee80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtre d'arrière-plan", + "info": "Peut contenir un enfant et appliquer un filtre de flou à l'arrière-plan. Le flou de l'arrière-plan peut être réalisé via Stack pour obtenir l'effet de flou du composant.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BackdropFilter", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【filter】 : Filtre 【ImageFilter】", + "ImageFilter.blur peut réaliser un flou gaussien en spécifiant les facteurs de flou x et y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json new file mode 100644 index 00000000..6ec0f087 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro Sfondo", + "info": "Può contenere un figlio e applica un filtro di sfocatura allo sfondo. È possibile ottenere l'effetto di sfocatura del componente utilizzando Stack per sfocare lo sfondo.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BackdropFilter", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur può realizzare una sfocatura gaussiana, specificando i fattori di sfocatura x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json new file mode 100644 index 00000000..6e54a9ae --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "背景フィルター", + "info": "子を1つ収容し、背景にぼかしフィルターを適用します。Stackを使用して背景をぼかすことで、コンポーネントのぼかし効果を実現できます。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilterの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【filter】 : フィルター 【ImageFilter】", + "ImageFilter.blurはガウスぼかしを実現し、x、yのぼかし係数を指定できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json new file mode 100644 index 00000000..30eb7655 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "배경 필터", + "info": "하나의 자식을 포함할 수 있고, 배경에 흐림 필터를 적용합니다. Stack을 통해 배경 흐림 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilter 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【filter】 : 필터 【ImageFilter】", + "ImageFilter.blur를 통해 가우시안 흐림 효과를 구현할 수 있으며, x, y 흐림 인자를 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json new file mode 100644 index 00000000..6599ff51 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro de Fundo", + "info": "Pode conter uma criança e aplicar um filtro de desfoque ao fundo. O efeito de desfoque do componente pode ser alcançado através do Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BackdropFilter", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur pode realizar um desfoque gaussiano, especificando os fatores de desfoque x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json new file mode 100644 index 00000000..e0840323 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Фоновый фильтр", + "info": "Может содержать один дочерний элемент и применять размытие к фону. Эффект размытия компонента можно реализовать с помощью Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BackdropFilter", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【filter】 : Фильтр 【ImageFilter】", + "ImageFilter.blur может реализовать гауссово размытие, задавая коэффициенты размытия по x и y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json new file mode 100644 index 00000000..c3403a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "背景滤镜", + "info": "可容纳一个孩子,并将背景进行模糊滤镜。可以通过Stack将背景模糊实现组件的模糊效果。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilter基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【filter】 : 过滤器 【ImageFilter】", + "ImageFilter.blur可以实现高斯模糊,指定x,y模糊因子。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart new file mode 100644 index 00000000..3cddf48a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart @@ -0,0 +1,94 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + + +class CustomBackdropFilter extends StatefulWidget { + const CustomBackdropFilter({Key? key}) : super(key: key); + + @override + _CustomBackdropFilterState createState() => _CustomBackdropFilterState(); +} + +class _CustomBackdropFilterState extends State { + double _sigmaX = 1.2; + double _sigmaY = 1.2; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Stack( + children: [ + _buildImage(), + Positioned.fill( + child: ClipRect( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: _sigmaX, sigmaY: _sigmaY), + child: Container( + color: Colors.black.withAlpha(0), + ), + ), + ), + ) + ], + ), + _buildSliders() + ], + ); + } + + Widget _buildImage() { + return Wrap( + spacing: 20, + children: [ + SizedBox( + height: 150, + width: 150, + child: Image.asset( + 'assets/images/sabar.webp', + fit: BoxFit.cover, + ), + ), + SizedBox( + height: 150, + width: 150, + child: Image.asset( + 'assets/images/wy_200x300.webp', + fit: BoxFit.cover, + ), + ), + ], + ); + } + + Widget _buildSliders() => Column( + children: [ + Slider( + min: 0, + max: 4, + value: _sigmaX, + divisions: 360, + label: 'x:' + _sigmaX.toStringAsFixed(1), + onChanged: (v) { + setState(() { + _sigmaX = v; + }); + }), + Slider( + min: 0, + max: 4, + value: _sigmaY, + divisions: 360, + label: 'beta:' + _sigmaY.toStringAsFixed(1), + onChanged: (v) { + setState(() { + _sigmaY = v; + }); + }) + ], + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json new file mode 100644 index 00000000..974fe193 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Baseline-Komponente", + "info": "Kann ein Unterelement aufnehmen und die Position des Unterelements durch die Kontrolle der Baseline-Höhe steuern. Wird normalerweise für Textkomponenten verwendet.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Baseline", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【baseline】 : Baseline-Position 【double】", + "【baselineType】 : Baseline-Typ 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json new file mode 100644 index 00000000..f347bd8f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Baseline Component", + "info": "Can contain a child component, and control the position of the child component by adjusting the baseline height. Generally used for text components.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Baseline", + "desc": [ + "【child】 : Child component 【Widget】", + "【baseline】 : Baseline position 【double】", + "【baselineType】 : Baseline type 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json new file mode 100644 index 00000000..9bf361d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente de línea base", + "info": "Puede contener un componente hijo, controlando la posición del componente hijo mediante la altura de la línea base. Generalmente se utiliza para componentes de texto.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Baseline", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【baseline】 : Posición de la línea base 【double】", + "【baselineType】 : Tipo de línea base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json new file mode 100644 index 00000000..d6b66c03 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Composant de base", + "info": "Peut contenir un composant enfant, en contrôlant la hauteur de la ligne de base pour positionner le composant enfant. Généralement utilisé pour les composants de texte.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Baseline", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【baseline】 : Position de la ligne de base 【double】", + "【baselineType】 : Type de ligne de base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json new file mode 100644 index 00000000..10f820e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente di base", + "info": "Può contenere un componente figlio, controllando la posizione del componente figlio attraverso il controllo dell'altezza della linea di base. Generalmente utilizzato per i componenti di testo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Baseline", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【baseline】 : Posizione della linea di base 【double】", + "【baselineType】 : Tipo di linea di base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json new file mode 100644 index 00000000..9f1296d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "ベースラインコンポーネント", + "info": "1つの子コンポーネントを収容し、ベースラインの高さを制御して子コンポーネントの位置を制御します。一般的にテキストコンポーネントに使用されます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baselineの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【baseline】 : ベースライン位置 【double】", + "【baselineType】 : ベースラインタイプ 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json new file mode 100644 index 00000000..e55ad0e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "기준선 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 기준선 높이를 조절하여 자식 컴포넌트의 위치를 제어합니다. 일반적으로 텍스트 컴포넌트에 사용됩니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baseline 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【baseline】 : 기준선 위치 【double】", + "【baselineType】 : 기준선 유형 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json new file mode 100644 index 00000000..b89e2c88 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente de Linha de Base", + "info": "Pode acomodar um componente filho, controlando a posição do componente filho através da altura da linha de base. Geralmente usado para componentes de texto.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Baseline", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【baseline】 : Posição da linha de base 【double】", + "【baselineType】 : Tipo de linha de base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json new file mode 100644 index 00000000..a1b8ed3f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Базовый компонент", + "info": "Может содержать один дочерний компонент, контролируя положение дочернего компонента через управление высотой базовой линии. Обычно используется для текстовых компонентов.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Baseline", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【baseline】 : Позиция базовой линии 【double】", + "【baselineType】 : Тип базовой линии 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json new file mode 100644 index 00000000..387bf89f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "基线组件", + "info": "可容纳一个子组件,通过控制基线高度来控制子组件的位置。一般用于文字组件。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baseline基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【baseline】 : 基线位置 【double】", + "【baselineType】 : 基线类型 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart new file mode 100644 index 00000000..f418a548 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomBaseline extends StatefulWidget { + const CustomBaseline({Key? key}) : super(key: key); + + @override + _CustomBaselineState createState() => _CustomBaselineState(); +} + +class _CustomBaselineState extends State { + double _baseline=20; + + @override + Widget build(BuildContext context) { + Widget childBox = const Text( + '你好,Flutter', + style: TextStyle(fontSize: 20, fontFamily: "Menlo"), + ); + + + Widget baseline = Baseline( + child: childBox, + baseline: _baseline, + baselineType: TextBaseline.alphabetic); + + return Column( + children: [ + _buildSlider(), + Container( + width: 100/0.618, + height: 100, + color: Colors.grey.withAlpha(22), + child: baseline, + ), + ], + ); + } + + Widget _buildSlider() => Slider( + divisions: 20, + min: 0, + max: 60, + label: _baseline.toString(), + value: _baseline, + onChanged: (v) => setState(() => _baseline = v), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json new file mode 100644 index 00000000..b87f8589 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Tastenkombinationen-Rückruf", + "info": "Kombinationen können als Tastenkombinationen festgelegt werden, die nach dem Erhalt des Fokus auf Tastenkombinationsereignisse reagieren.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von Tastenkombinationen", + "desc": [ + "Nach der Aktivierung des Fokus im Beispiel können die Kombinationen Strg+↑ und Strg+↓ die Zahl erhöhen oder verringern", + "【enabled】 : Ob verfügbar 【bool】", + "【onTapOutside】 : Außenklick-Listener 【TapRegionCallback?】", + "【onTapInside】 : Innenklick-Listener 【TapRegionCallback?】", + "【groupId】 : Kennung der Klickbereichsgruppe 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json new file mode 100644 index 00000000..4b0b9a70 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Shortcut Callback", + "info": "You can set combinations as shortcuts, and after gaining focus, respond to shortcut events.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Shortcut Usage", + "desc": [ + "After activating focus in the example, the Ctrl+↑ and Ctrl+↓ key combinations can increase or decrease the number", + "【enabled】: Whether it is available 【bool】", + "【onTapOutside】: Click outside listener 【TapRegionCallback?】", + "【onTapInside】: Click inside listener 【TapRegionCallback?】", + "【groupId】: Click area group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json new file mode 100644 index 00000000..1d33d303 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Accesos directos de devolución de llamada", + "info": "Se pueden configurar combinaciones como accesos directos, que responderán a eventos de teclas rápidas después de obtener el foco.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de accesos directos", + "desc": [ + "En el caso, después de activar el foco, las combinaciones de teclas Ctrl+↑ y Ctrl+↓ pueden aumentar o disminuir el número", + "【enabled】: Si está disponible 【bool】", + "【onTapOutside】: Escucha de clic fuera 【TapRegionCallback?】", + "【onTapInside】: Escucha de clic dentro 【TapRegionCallback?】", + "【groupId】: Identificador del grupo de área de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json new file mode 100644 index 00000000..b248d152 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Raccourcis de rappel", + "info": "Vous pouvez définir des combinaisons comme raccourcis clavier, qui répondront aux événements de raccourci après avoir obtenu le focus.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation des raccourcis", + "desc": [ + "Dans l'exemple, après activation du focus, les combinaisons Ctrl+↑ et Ctrl+↓ peuvent augmenter ou diminuer le nombre", + "【enabled】 : Disponible 【bool】", + "【onTapOutside】 : Écouteur de clic extérieur 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic intérieur 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json new file mode 100644 index 00000000..18986c20 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Scorciatoie di callback", + "info": "È possibile impostare combinazioni come scorciatoie da tastiera, che rispondono agli eventi delle scorciatoie dopo aver ottenuto il focus.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso delle scorciatoie", + "desc": [ + "Nel caso attivato, le combinazioni Ctrl+↑ e Ctrl+↓ possono aumentare o diminuire il numero", + "【enabled】 : Disponibile 【bool】", + "【onTapOutside】 : Ascolto del clic esterno 【TapRegionCallback?】", + "【onTapInside】 : Ascolto del clic interno 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo di area di clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json new file mode 100644 index 00000000..7af909d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "ショートカットコールバック", + "info": "組み合わせをショートカットとして設定し、フォーカスを取得した後にショートカットイベントに応答できます。", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "ショートカットの使用", + "desc": [ + "ケースでフォーカスをアクティブにした後、Ctrl+↑ と Ctrl+↓ の組み合わせキーで数字を増減できます", + "【enabled】 : 使用可能かどうか 【bool】", + "【onTapOutside】 : 外部クリックリスナー 【TapRegionCallback?】", + "【onTapInside】 : 内部クリックリスナー 【TapRegionCallback?】", + "【groupId】 : クリック領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json new file mode 100644 index 00000000..1eb94cfc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "단축키 콜백", + "info": "조합을 단축키로 설정할 수 있으며, 포커스를 얻은 후 단축키 이벤트에 응답합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "단축키 사용", + "desc": [ + "예제에서 포커스를 활성화한 후, Ctrl+↑ 및 Ctrl+↓ 조합키로 숫자를 증가 또는 감소시킬 수 있습니다.", + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 클릭 리스너 【TapRegionCallback?】", + "【onTapInside】 : 내부 클릭 리스너 【TapRegionCallback?】", + "【groupId】 : 클릭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json new file mode 100644 index 00000000..b9117fb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Atalhos de Teclado", + "info": "Pode definir combinações como atalhos de teclado, que respondem a eventos de atalhos após obter o foco.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de Atalhos", + "desc": [ + "No exemplo, após ativar o foco, as combinações de teclas Ctrl+↑ e Ctrl+↓ podem aumentar ou diminuir o número", + "【enabled】 : Disponível 【bool】", + "【onTapOutside】 : Ouvinte de clique externo 【TapRegionCallback?】", + "【onTapInside】 : Ouvinte de clique interno 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo de área de clique 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json new file mode 100644 index 00000000..124c280f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Горячие клавиши обратного вызова", + "info": "Можно настроить комбинации как горячие клавиши, которые будут реагировать на события горячих клавиш после получения фокуса.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование горячих клавиш", + "desc": [ + "В примере после активации фокуса комбинации клавиш Ctrl+↑ и Ctrl+↓ могут увеличивать или уменьшать число", + "【enabled】 : Доступно ли 【bool】", + "【onTapOutside】 : Прослушивание клика снаружи 【TapRegionCallback?】", + "【onTapInside】 : Прослушивание клика внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области клика 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_zh-CN.json new file mode 100644 index 00000000..260ccc34 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "快捷键回调", + "info": "可以设置组合作为快捷键,在获取焦点后, 响应快捷键事件。", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "快捷键使用", + "desc": [ + "案例中激活焦点后,Ctrl+↑ 和 Ctrl+↓ 组合键可以增加或减少数字", + "【enabled】 : 是否可用 【bool】", + "【onTapOutside】 : 点击外界监听 【TapRegionCallback?】", + "【onTapInside】 : 点击内部监听 【TapRegionCallback?】", + "【groupId】 : 点击区域组标识 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart new file mode 100644 index 00000000..046532ed --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart @@ -0,0 +1,127 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class CallbackShortcutsDemo1 extends StatefulWidget { + const CallbackShortcutsDemo1({super.key}); + + @override + State createState() => _CallbackShortcutsDemo1State(); +} + +class _CallbackShortcutsDemo1State extends State { + FocusNode focusNode = FocusNode(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + _initActionBindings(); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + + super.dispose(); + } + + void _onFocusChange() { + setState(() {}); + } + + int count = 0; + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) => focusNode.requestFocus(), + onTapOutside: (_) => focusNode.unfocus(), + child: CallbackShortcuts( + bindings: _actionBindings, + child: Focus(autofocus: true, focusNode: focusNode, child: _display()), + ), + ), + ); + } + + Map _actionBindings = {}; + + void _initActionBindings() { + _actionBindings = { + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.arrowUp): increase, + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.arrowDown): decrease, + const SingleActivator(LogicalKeyboardKey.keyR, control: true): reset, + }; + } + + void increase() { + setState(() => count = count + 1); + } + + void decrease() { + setState(() => count = count - 1); + } + + void reset() { + setState(() => count = 0); + } + + Widget _display() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: const EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: focusNode.hasFocus + ? _CounterDisplay(counter: count) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class _CounterDisplay extends StatelessWidget { + final int counter; + + const _CounterDisplay({ + super.key, + required this.counter, + }); + + @override + Widget build(BuildContext context) { + TextStyle style = TextStyle(fontSize: 12, color: Colors.grey); + + return Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + 'count: $counter', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Theme.of(context).primaryColor), + ), + Wrap( + spacing: 6, + children: [ + Text('【Ctrl+↑】:数字+1', style: style), + Text('【Ctrl+↓】:数字-1', style: style), + Text('【Ctrl+R】:归 0', style: style), + ], + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json new file mode 100644 index 00000000..9380e9a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Zentrierungskomponente", + "info": "Kann ein Unterelement aufnehmen und es im übergeordneten Element zentrieren. Es ist eine vereinfachte Version der Align-Komponente.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Center", + "desc": [ + "【child】 : Unterelement 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json new file mode 100644 index 00000000..c69385b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Center Component", + "info": "Can contain a child component and center it within the parent component, serving as a simplified mode of the Align component.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Center", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json new file mode 100644 index 00000000..88bed554 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centrado", + "info": "Puede contener un componente hijo y centrarlo en el componente padre, es un modo simplificado del componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Center", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json new file mode 100644 index 00000000..89548fc7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Composant centré", + "info": "Peut contenir un composant enfant et le centrer dans le composant parent, c'est une version simplifiée du composant Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Center", + "desc": [ + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json new file mode 100644 index 00000000..c09ac191 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centrato", + "info": "Può contenere un componente figlio e centrarlo rispetto al componente genitore, è una versione semplificata del componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Center", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json new file mode 100644 index 00000000..aa9c2c65 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "中央コンポーネント", + "info": "一つの子コンポーネントを収容し、それを親コンポーネントの中央に配置します。Alignコンポーネントの簡易版です。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Centerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json new file mode 100644 index 00000000..0f48acb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "중앙 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용하고 부모 컴포넌트의 중앙에 위치시킬 수 있습니다. Align 컴포넌트의 간소화된 모드입니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Center 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json new file mode 100644 index 00000000..7c4a44ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centralizado", + "info": "Pode conter um componente filho e centralizá-lo no componente pai, sendo uma versão simplificada do componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Center", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json new file mode 100644 index 00000000..c9df7850 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Центрирующий компонент", + "info": "Может содержать один дочерний компонент и центрировать его внутри родительского компонента. Это упрощенная версия компонента Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Center", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json new file mode 100644 index 00000000..b3e2a548 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "居中组件", + "info": "可容纳一个子组件,并使其居中于父组件,是Align组件的一种精简模式。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Center基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart new file mode 100644 index 00000000..7a753a4b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart @@ -0,0 +1,23 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomCenter extends StatelessWidget { + const CustomCenter({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(5), + width: 200, + height: 100, + color: Colors.grey.withAlpha(88), + child: Center( + child: Container( + width: 80, + height: 60, + color: Colors.cyanAccent, + ))); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json new file mode 100644 index 00000000..904c5f80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Ovale Zuschneidung", + "info": "Kann ein Unterelement aufnehmen und es entlang der Haupt- und Nebenachse der Breite und Höhe elliptisch zuschneiden.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipOval", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json new file mode 100644 index 00000000..dc93ef5e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Oval Clipping", + "info": "Can contain a child component and clip it into an ellipse with the width and height as the major and minor axes.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipOval", + "desc": [ + "【child】: Child component 【Widget】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json new file mode 100644 index 00000000..4904d945 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Recorte Ovalado", + "info": "Puede contener un componente hijo y lo recorta en forma de elipse utilizando el ancho y la altura como ejes mayor y menor.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipOval", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json new file mode 100644 index 00000000..6d4bf5a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Découpe ovale", + "info": "Peut contenir un composant enfant et le découper en forme ovale avec la largeur et la hauteur comme axes majeur et mineur.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipOval", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpe 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json new file mode 100644 index 00000000..22398369 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Ritaglio ovale", + "info": "Può contenere un componente figlio e lo ritaglia in un'ellisse con larghezza e altezza come assi maggiore e minore.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ClipOval", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json new file mode 100644 index 00000000..bf02d466 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "楕円クリップ", + "info": "1つの子コンポーネントを収容し、幅と高さを長軸と短軸として楕円形にクリップします。", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOvalの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json new file mode 100644 index 00000000..5d5c72fe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "타원 자르기", + "info": "하위 컴포넌트를 포함할 수 있으며, 너비와 높이를 장축과 단축으로 하여 타원형으로 자릅니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOval 기본 사용법", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【clipBehavior】 : 자르기 동작 【Clip】", + "【clipper】 : 자르기 도구 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json new file mode 100644 index 00000000..b0cee887 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Recorte Oval", + "info": "Pode conter um componente filho e cortá-lo em forma de elipse com os eixos maior e menor como largura e altura.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipOval", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【clipper】 : Cortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json new file mode 100644 index 00000000..237cf0e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Эллиптическое обрезание", + "info": "Может содержать один дочерний компонент и обрезать его по эллипсу с большой и малой осями, равными ширине и высоте.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipOval", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезания 【Clip】", + "【clipper】 : Обрезатель 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json new file mode 100644 index 00000000..ff1be8e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "椭圆裁剪", + "info": "可容纳一个子组件,并将其以宽高为长轴和短轴进行椭圆裁切。", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOval基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart new file mode 100644 index 00000000..71028125 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomClipOval extends StatelessWidget { + const CustomClipOval({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + ClipOval( + child: Image.asset( + "assets/images/wy_300x200.webp", + width: 150, + height: 100, + ), + ), + ClipOval( + child: Image.asset( + "assets/images/wy_300x200.webp", + width: 100, + height: 100, + fit: BoxFit.cover, + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json new file mode 100644 index 00000000..7f30af8b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Pfadausschnitt", + "info": "Kann ein Kindelement aufnehmen und es entlang eines angegebenen Pfads zuschneiden. Ermöglicht die Anpassung der Pfadform und ist ein sehr flexibles Zuschneidelement.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipPath", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json new file mode 100644 index 00000000..658b062d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Path Clipping", + "info": "Can contain a child component and clip it according to the specified path. The path shape can be customized, making it a very flexible clipping component.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipPath", + "desc": [ + "【child】 : Child component 【Widget】", + "【clipBehavior】 : Clipping behavior 【Clip】", + "【clipper】 : Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json new file mode 100644 index 00000000..81ad23f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Recorte de ruta", + "info": "Puede contener un componente hijo y recortarlo según la ruta especificada. Se puede personalizar la forma de la ruta, es un componente de recorte muy flexible.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipPath", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json new file mode 100644 index 00000000..2e55bb95 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Découpage de chemin", + "info": "Peut contenir un composant enfant et le découper selon un chemin spécifié. Permet de personnaliser la forme du chemin, c'est un composant de découpage très flexible.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipPath", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json new file mode 100644 index 00000000..bd535f5b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Ritaglio percorso", + "info": "Può contenere un componente figlio e ritagliarlo secondo un percorso specificato. È possibile personalizzare la forma del percorso, rendendolo un componente di ritaglio molto flessibile.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ClipPath", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json new file mode 100644 index 00000000..ed0eeff1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "パスクリップ", + "info": "子コンポーネントを1つ収容し、指定されたパスに従ってクリップします。パスの形状をカスタマイズでき、非常に柔軟なクリップコンポーネントです。", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPathの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json new file mode 100644 index 00000000..a5a7fada --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "경로 클리핑", + "info": "하위 컴포넌트를 수용하고 지정된 경로에 따라 클리핑할 수 있습니다. 경로 모양을 사용자 정의할 수 있어 매우 유연한 클리핑 컴포넌트입니다.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPath 기본 사용", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json new file mode 100644 index 00000000..68b9446a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Recorte de Caminho", + "info": "Pode conter um componente filho e recortá-lo de acordo com o caminho especificado. Permite personalizar a forma do caminho, sendo um componente de recorte muito flexível.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipPath", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【clipBehavior】 : Comportamento de Recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json new file mode 100644 index 00000000..70914212 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Обрезка по пути", + "info": "Может содержать один дочерний компонент и обрезать его по указанному пути. Можно настроить форму пути, это очень гибкий компонент для обрезки.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipPath", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【clipper】 : Обрезчик 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json new file mode 100644 index 00000000..c913d438 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "路径裁剪", + "info": "可容纳一个子组件,并将其按指定路径进行裁剪。可以自定义路径形状,是一个很灵活的裁剪组件。", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPath基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart new file mode 100644 index 00000000..f2c5e67f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart @@ -0,0 +1,62 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomClipPath extends StatelessWidget { + const CustomClipPath({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: ShapeBorderClipper(shape: _StarShapeBorder()), + child: Image.asset( + "assets/images/wy_300x200.webp", + width: 150, + height: 100, + fit: BoxFit.cover, + ), + ); + } +} + +class _StarShapeBorder extends ShapeBorder { + final Path _path = Path(); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) { + return Path(); + } + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) => + nStarPath(20, rect.height / 2, rect.height / 2 * 0.85, + dx: rect.width / 2, dy: rect.height / 2); + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {} + + Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) { + double perRad = 2 * pi / num; + double radA = perRad / 2 / 2; + double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA; + _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; + } + + @override + ShapeBorder scale(double t) { + return this; + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json new file mode 100644 index 00000000..abddb8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Abgerundetes Rechteck zuschneiden", + "info": "Kann ein Kindelement aufnehmen und es mit abgerundeten Ecken zuschneiden. Geben Sie borderRadius als Eckradius an.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipRRect", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【borderRadius】 : Randradius 【BorderRadius】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json new file mode 100644 index 00000000..46e2e47a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Rounded Rectangle Clipping", + "info": "Can contain a child component and perform rounded rectangle clipping on it. Specify borderRadius as the corner radius.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipRRect", + "desc": [ + "【child】: Child component 【Widget】", + "【borderRadius】: Border radius 【BorderRadius】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json new file mode 100644 index 00000000..81bb5ffb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Recorte rectangular con esquinas redondeadas", + "info": "Puede contener un componente hijo y realizar un recorte rectangular con esquinas redondeadas. Especifica borderRadius como el radio de las esquinas.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipRRect", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【borderRadius】 : Radio del borde 【BorderRadius】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json new file mode 100644 index 00000000..e7fcbc89 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Rognage rectangulaire arrondi", + "info": "Peut contenir un composant enfant et le rogner en forme de rectangle arrondi. Spécifiez borderRadius comme rayon des coins.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipRRect", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【borderRadius】 : Rayon des bords 【BorderRadius】", + "【clipBehavior】 : Comportement de rognage 【Clip】", + "【clipper】 : Rogneur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json new file mode 100644 index 00000000..032a195b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Ritaglio rettangolo arrotondato", + "info": "Può contenere un componente figlio e ritagliarlo in un rettangolo con angoli arrotondati. Specifica borderRadius come raggio degli angoli.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ClipRRect", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【borderRadius】 : Raggio del bordo 【BorderRadius】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json new file mode 100644 index 00000000..6b4c29dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "角丸矩形クリップ", + "info": "子コンポーネントを収容し、角丸矩形でクリップできます。borderRadiusを角の半径として指定します。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRectの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【borderRadius】 : 角の半径 【BorderRadius】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json new file mode 100644 index 00000000..a1786f7a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "둥근 사각형 클리핑", + "info": "하위 위젯을 포함하고 둥근 사각형으로 클리핑할 수 있습니다. borderRadius를 모서리 반지름으로 지정합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRect 기본 사용법", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【borderRadius】 : 모서리 반지름 【BorderRadius】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json new file mode 100644 index 00000000..2cd1570a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Recorte de Retângulo com Cantos Arredondados", + "info": "Pode conter um componente filho e aplica um recorte de retângulo com cantos arredondados. Especifique o borderRadius como o raio dos cantos.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipRRect", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【borderRadius】 : Raio da Borda 【BorderRadius】", + "【clipBehavior】 : Comportamento de Recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json new file mode 100644 index 00000000..43ae1b60 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Обрезка прямоугольника с закругленными углами", + "info": "Может содержать один дочерний компонент и обрезать его в форме прямоугольника с закругленными углами. Укажите borderRadius как радиус углов.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipRRect", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【borderRadius】 : Радиус границы 【BorderRadius】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【clipper】 : Обрезчик 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json new file mode 100644 index 00000000..79edf1a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "圆角矩形裁剪", + "info": "可容纳一个子组件,并将其进行圆角矩形裁剪。指定borderRadius作为边角半径。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRect基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【borderRadius】 : 边线半径 【BorderRadius】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart new file mode 100644 index 00000000..afd15096 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomClipRRect extends StatelessWidget { + const CustomClipRRect({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.all(Radius.elliptical(35, 30)), + child: Image.asset( + "assets/images/wy_300x200.webp", + width: 150, + height: 100, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json new file mode 100644 index 00000000..bfb91cc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Rechteckiger Zuschnitt", + "info": "Kann ein Unterelement aufnehmen und es rechteckig zuschneiden. Kann mit SizedBox, Align, AspectRadio usw. eingeschränkt werden, um den Bereich zu begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipRect", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json new file mode 100644 index 00000000..52b73167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Rectangular Clipping", + "info": "Can contain a child component and perform rectangular clipping. Can be localized using components such as SizedBox, Align, AspectRatio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipRect", + "desc": [ + "【child】: Child component 【Widget】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json new file mode 100644 index 00000000..56331eb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Recorte rectangular", + "info": "Puede contener un componente hijo y recortarlo en forma rectangular. Se puede delimitar utilizando componentes como SizedBox, Align, AspectRadio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipRect", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json new file mode 100644 index 00000000..c01fb51d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Découpage rectangulaire", + "info": "Peut contenir un composant enfant et le découper en forme rectangulaire. Peut être limité à une zone spécifique en utilisant des composants tels que SizedBox, Align, AspectRatio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipRect", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json new file mode 100644 index 00000000..8478d887 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Ritaglio rettangolare", + "info": "Può contenere un componente figlio e ritagliarlo in forma rettangolare. Può essere delimitato utilizzando componenti come SizedBox, Align, AspectRadio, ecc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ClipRect", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json new file mode 100644 index 00000000..cca70308 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "矩形クリップ", + "info": "子コンポーネントを収容し、それを矩形にクリップします。SizedBox、Align、AspectRadioなどの限定コンポーネントを使用して領域を指定できます。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRectの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json new file mode 100644 index 00000000..36c4a05c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "사각형 클리핑", + "info": "하위 위젯을 포함하고 사각형으로 클리핑할 수 있습니다. SizedBox, Align, AspectRadio 등을 사용하여 영역을 제한할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRect 기본 사용", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json new file mode 100644 index 00000000..a2eaffb7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Recorte Retangular", + "info": "Pode conter um componente filho e cortá-lo em forma retangular. Pode ser delimitado com componentes como SizedBox, Align, AspectRadio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipRect", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【clipBehavior】 : Comportamento de Corte 【Clip】", + "【clipper】 : Cortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json new file mode 100644 index 00000000..535825d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Прямоугольное обрезание", + "info": "Может содержать один дочерний компонент и обрезать его в прямоугольной форме. Может быть ограничен с помощью таких компонентов, как SizedBox, Align, AspectRatio и других.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipRect", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезания 【Clip】", + "【clipper】 : Обрезатель 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json new file mode 100644 index 00000000..6ed05fa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "矩形裁剪", + "info": "可容纳一个子组件,并将其进行矩形裁切。可借助SizedBox、Align、AspectRadio等限定组件进行定域。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRect基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart new file mode 100644 index 00000000..c0b4698d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomClipRect extends StatelessWidget { + const CustomClipRect({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ClipRect( + child: SizedBox( + height: 100, + width: 100, + child: Image.asset( + "assets/images/wy_300x200.webp", + fit: BoxFit.cover, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json new file mode 100644 index 00000000..f6876531 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Farbfilter", + "info": "Kann ein Kindelement aufnehmen und das Element mit 29 Überblendungsmodi und beliebigen Komponenten mischen, so leistungsstark, dass ich nicht weiß, was ich sagen soll. Erfahren Sie mehr über die App, die mit einem Klick alles grau macht.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ColorFiltered", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【colorFilter】 : Farbfilter 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json new file mode 100644 index 00000000..526d50cb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Color Filter", + "info": "Can accommodate a child component, and can mix the component with any other component using 29 blending modes, so powerful that I don't know what to say. Learn about the one-click grayscale app feature.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ColorFiltered", + "desc": [ + "【child】: Child component 【Widget】", + "【colorFilter】: Color filter 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json new file mode 100644 index 00000000..0edca167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro de color", + "info": "Puede contener un componente hijo y mezclar el componente con cualquier otro componente en 29 modos de superposición de colores, tan poderoso que no sé qué decir. Conoce la función de convertir toda la aplicación a gris con un solo clic.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ColorFiltered", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【colorFilter】 : Filtro de color 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json new file mode 100644 index 00000000..43ac7ce0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtre de couleur", + "info": "Peut contenir un composant enfant et peut mélanger le composant avec n'importe quel composant selon 29 modes de superposition de couleurs, si puissant que je ne sais pas quoi dire. Découvrez comment rendre toute l'application en niveaux de gris en un clic.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ColorFiltered", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【colorFilter】 : Filtre de couleur 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json new file mode 100644 index 00000000..773bace4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro colore", + "info": "Può contenere un componente figlio e può mescolare il componente con qualsiasi altro componente in 29 modalità di sovrapposizione del colore, così potente che non so cosa dire. Scopri come rendere tutto grigio con un solo clic nell'app.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ColorFiltered", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【colorFilter】 : Filtro colore 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json new file mode 100644 index 00000000..4de51818 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "カラーフィルター", + "info": "1つの子コンポーネントを収容でき、29種類のオーバーレイモードと任意のコンポーネントを混合できます。その強力さに言葉を失います。アプリのワンクリックで全体をグレーにする機能もご覧ください。", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFilteredの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【colorFilter】 : カラーフィルター 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json new file mode 100644 index 00000000..dc8dd199 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "색상 필터", + "info": "하위 컴포넌트를 포함할 수 있으며, 29가지 색상 혼합 모드와 임의의 컴포넌트를 혼합할 수 있습니다. 너무 강력해서 뭐라고 말해야 할지 모르겠습니다. 앱에서 한 번에 전체를 회색으로 만드는 기능을 확인해 보세요.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFiltered 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【colorFilter】 : 색상 필터 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json new file mode 100644 index 00000000..49091b01 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro de Cor", + "info": "Pode conter um componente filho e pode misturar o componente com qualquer outro componente em 29 modos de sobreposição de cores, tão poderoso que não sei o que dizer. Saiba mais sobre o aplicativo que transforma tudo em cinza com um toque.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ColorFiltered", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【colorFilter】 : Filtro de cor 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json new file mode 100644 index 00000000..382d73c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Фильтр цвета", + "info": "Может содержать дочерний компонент, который можно смешивать с любым компонентом по 29 режимам наложения цветов. Настолько мощный, что я не знаю, что сказать. Узнайте, как сделать приложение полностью серым одним кликом.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ColorFiltered", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【colorFilter】 : Фильтр цвета 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json new file mode 100644 index 00000000..05a6ea0c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "滤色器", + "info": "可容纳一个子组件,可以并将组件按照29中叠色模式和任意组件混合,强大到我不知道该说什么好。app一键全灰了解一下。", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFiltered基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【colorFilter】 : 滤色器 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart new file mode 100644 index 00000000..934aa597 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:widgets/utils/color_utils.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomColorFiltered extends StatefulWidget { + const CustomColorFiltered({Key? key}) : super(key: key); + + @override + _CustomColorFilteredState createState() => _CustomColorFilteredState(); +} + +class _CustomColorFilteredState extends State { + Color _color = Colors.blue.withAlpha(88); + + @override + Widget build(BuildContext context) { + _color = ColorUtils.randomColor(); + return Column( + children: [ + Wrap(spacing: 10, runSpacing: 10, children: [ + _buildRandomColor(), + ...BlendMode.values + .map((mode) => Column( + children: [ + _buildChild(mode), + const SizedBox(height: 10), + Text( + mode.toString().split('.')[1], + style: const TextStyle(fontSize: 10), + ) + ], + )) + .toList() + ]), + ], + ); + } + + Widget _buildChild(m) => SizedBox( + width: 58, + height: 58, + child: ColorFiltered( + child: + const Image(image: AssetImage("assets/images/icon_head.webp")), + colorFilter: ColorFilter.mode(_color, m)), + ); + + Widget _buildRandomColor() => GestureDetector( + onTap: () => setState(() {}), + child: Container( + alignment: Alignment.center, + width: 60, + height: 60, + decoration: BoxDecoration(color: _color, shape: BoxShape.circle), + child: const Text('点我'), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json new file mode 100644 index 00000000..cca1d143 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Farbbox", + "info": "Zeichnet die angegebene Farbe auf dem Layoutbereich des Unterelements und zeichnet dann das Unterelement auf dem Hintergrund.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ColoredBox", + "desc": [ + "【color】 : Komponente 【Color】", + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json new file mode 100644 index 00000000..bc61c3b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Color Box", + "info": "Draws a specified color on the layout area of the child component, then draws the child component on the background color.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ColoredBox", + "desc": [ + "【color】: Component 【Color】", + "【child】: Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json new file mode 100644 index 00000000..664143d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Caja de colores", + "info": "Dibuja un color especificado en el área de diseño del componente hijo, y luego dibuja el componente hijo sobre el color de fondo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json new file mode 100644 index 00000000..569999dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Boîte de couleur", + "info": "Dessine une couleur spécifiée sur la zone de mise en page du composant enfant, puis dessine le composant enfant sur la couleur de fond.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ColoredBox", + "desc": [ + "【color】 : composant 【Color】", + "【child】 : composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json new file mode 100644 index 00000000..d610aeaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Scatola dei colori", + "info": "Disegna un colore specifico nell'area di layout del componente figlio, quindi disegna il componente figlio sullo sfondo colorato.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json new file mode 100644 index 00000000..fbf34b6c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "カラーボックス", + "info": "子コンポーネントのレイアウト領域に指定された色を描画し、その後、子コンポーネントを背景色の上に描画します。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBoxの基本使用", + "desc": [ + "【color】 : コンポーネント 【Color】", + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json new file mode 100644 index 00000000..53d44163 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "색상 상자", + "info": "하위 구성 요소의 레이아웃 영역에 지정된 색상을 그린 다음 배경색 위에 하위 구성 요소를 그립니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBox 기본 사용", + "desc": [ + "【color】 : 구성 요소 【Color】", + "【child】 : 구성 요소 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json new file mode 100644 index 00000000..51b8903d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Caixa de Cores", + "info": "Desenha uma cor especificada na área de layout do componente filho e, em seguida, desenha o componente filho sobre a cor de fundo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json new file mode 100644 index 00000000..308f2719 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Цветная коробка", + "info": "Рисует указанный цвет на области макета дочернего компонента, а затем рисует дочерний компонент на фоновом цвете.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ColoredBox", + "desc": [ + "【color】 : компонент 【Color】", + "【child】 : компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json new file mode 100644 index 00000000..590fc2ff --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "颜色盒", + "info": "在子组件的布局区域上绘制指定颜色,然后将子组件绘制在背景色上。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBox基本使用", + "desc": [ + "【color】 : 组件 【Color】", + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart new file mode 100644 index 00000000..714effeb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ColoredBoxDemo extends StatelessWidget { + const ColoredBoxDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ColoredBox( + color: Colors.red, + child: Container( + margin: const EdgeInsets.all(20), + padding: const EdgeInsets.all(20), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10)), + color: Colors.blue + ), + alignment: Alignment.center, + width: 250, + height: 100, + child: const Text( + "蓝色是加了 margin 和圆角的 Container,外层包裹红色的 ColoredBox,注意作用范围。", + style: TextStyle(color: Colors.white), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json new file mode 100644 index 00000000..8e4dcbfb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Synthetischer Transformationsfolger", + "info": "Wird in der Regel in Verbindung mit der Komponente CompositedTransformTarget verwendet, um das Overlay an die Zieltransformation anzupassen.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von CompositedTransformFollower", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【link】 : Verknüpfung 【LayerLink】", + "【offset】 : Versatz 【Offset】", + "【targetAnchor】 : Zielankerpunkt 【Alignment】", + "【followerAnchor】 : Ankerpunkt des Folgers 【Alignment】", + "【showWhenUnlinked】 : Anzeige bei Nichtverknüpfung 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json new file mode 100644 index 00000000..d4f07044 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Composited Transform Follower", + "info": "Generally used in conjunction with the CompositedTransformTarget component to enable the Overlay to follow the target transformation.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usage of CompositedTransformFollower", + "desc": [ + "【child】 : Child widget 【Widget】", + "【link】 : Link 【LayerLink】", + "【offset】 : Offset 【Offset】", + "【targetAnchor】 : Target anchor 【Alignment】", + "【followerAnchor】 : Follower anchor 【Alignment】", + "【showWhenUnlinked】 : Whether to show when unlinked 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json new file mode 100644 index 00000000..7b7667b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguidor de Transformación Compuesta", + "info": "Generalmente se usa junto con el componente CompositedTransformTarget, lo que permite que el Overlay siga la transformación del objetivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CompositedTransformFollower", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【link】 : Enlace 【LayerLink】", + "【offset】 : Desplazamiento 【Offset】", + "【targetAnchor】 : Punto de anclaje del objetivo 【Alignment】", + "【followerAnchor】 : Punto de anclaje del seguidor 【Alignment】", + "【showWhenUnlinked】 : Mostrar cuando no está enlazado 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json new file mode 100644 index 00000000..4292fa56 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Suiveur de transformation composite", + "info": "Généralement utilisé conjointement avec le composant CompositedTransformTarget, permet à l'Overlay de suivre la transformation de la cible.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CompositedTransformFollower", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【link】 : Lien 【LayerLink】", + "【offset】 : Décalage 【Offset】", + "【targetAnchor】 : Point d'ancrage de la cible 【Alignment】", + "【followerAnchor】 : Point d'ancrage du suiveur 【Alignment】", + "【showWhenUnlinked】 : Afficher si non lié 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json new file mode 100644 index 00000000..cf13a2de --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguace di Trasformazione Composta", + "info": "Generalmente utilizzato in combinazione con il componente CompositedTransformTarget, consente a Overlay di seguire le trasformazioni dell'obiettivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di CompositedTransformFollower", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【link】 : Collegamento 【LayerLink】", + "【offset】 : Offset 【Offset】", + "【targetAnchor】 : Ancoraggio obiettivo 【Alignment】", + "【followerAnchor】 : Ancoraggio seguace 【Alignment】", + "【showWhenUnlinked】 : Mostra quando non collegato 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json new file mode 100644 index 00000000..db21d167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "合成変換フォロワー", + "info": "通常、CompositedTransformTarget コンポーネントと組み合わせて使用され、Overlay をターゲットの変換に伴わせることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【link】 : リンク 【LayerLink】", + "【offset】 : オフセット 【Offset】", + "【targetAnchor】 : ターゲットアンカー 【Alignment】", + "【followerAnchor】 : フォロワーアンカー 【Alignment】", + "【showWhenUnlinked】 : リンクされていない場合に表示するか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json new file mode 100644 index 00000000..6d54eabc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "합성 변형 팔로워", + "info": "일반적으로 CompositedTransformTarget 컴포넌트와 함께 사용되어 Overlay가 대상 변형을 따라가도록 합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【link】 : 링크 【LayerLink】", + "【offset】 : 오프셋 【Offset】", + "【targetAnchor】 : 타겟 앵커 【Alignment】", + "【followerAnchor】 : 팔로워 앵커 【Alignment】", + "【showWhenUnlinked】 : 링크되지 않을 때 표시 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json new file mode 100644 index 00000000..df81a3ce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguidor de Transformação Composta", + "info": "Geralmente usado em conjunto com o componente CompositedTransformTarget, permite que o Overlay acompanhe a transformação do alvo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CompositedTransformFollower", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【link】 : Link 【LayerLink】", + "【offset】 : Deslocamento 【Offset】", + "【targetAnchor】 : Âncora do alvo 【Alignment】", + "【followerAnchor】 : Âncora do seguidor 【Alignment】", + "【showWhenUnlinked】 : Mostrar quando não estiver vinculado 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json new file mode 100644 index 00000000..2d7e6572 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Следователь композитного преобразования", + "info": "Обычно используется совместно с компонентом CompositedTransformTarget, позволяя Overlay следовать за преобразованием цели.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CompositedTransformFollower", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【link】 : Ссылка 【LayerLink】", + "【offset】 : Смещение 【Offset】", + "【targetAnchor】 : Якорь цели 【Alignment】", + "【followerAnchor】 : Якорь следящего 【Alignment】", + "【showWhenUnlinked】 : Показывать при отсутствии связи 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json new file mode 100644 index 00000000..174d72c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "合成变换跟随者", + "info": "一般与 CompositedTransformTarget 组件联合使用,可以使 Overlay 伴随目标变换。", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【link】 : 链接 【LayerLink】", + "【offset】 : 偏移 【Offset】", + "【targetAnchor】 : 目标锚点 【Alignment】", + "【followerAnchor】 : 伴随者锚点 【Alignment】", + "【showWhenUnlinked】 : 为链接是否显示 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart new file mode 100644 index 00000000..e18ed3c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart @@ -0,0 +1,106 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/3/31 +/// contact me by email 1981462002@qq.com +/// + + +class CompositedTransformFollowerDemo extends StatelessWidget { + + const CompositedTransformFollowerDemo({Key? key}) : super(key: key); + + static const List colors =[Colors.red,Colors.yellow,Colors.blue,Colors.green]; + + + @override + Widget build(BuildContext context) { + return Container( + transform: Matrix4.rotationZ(-15/180*pi), + height: 250, + padding: const EdgeInsets.all(50.0), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [_LogoTips(), const Text('点击图标\n显隐弹框')], + ), + ...colors.map((color) => Container(width: 80, color: color)) + ], + ), + ); + } + + +} + +class _LogoTips extends StatefulWidget { + @override + _LogoTipsState createState() => _LogoTipsState(); +} + +class _LogoTipsState extends State<_LogoTips> { + OverlayEntry? _overlayEntry; + + final LayerLink _layerLink = LayerLink(); + + bool show = false; + + OverlayEntry _createOverlayEntry() { + return OverlayEntry( + builder: (context) => Positioned( + width: 150, + child: CompositedTransformFollower( + link: _layerLink, + showWhenUnlinked: false, + offset: const Offset(0,-10), + targetAnchor: Alignment.topRight, + child: const Card( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text('我是一个 Overlay,目标组件为图标,当它变换时,我会伴随变换。'), + ), + ), + ), + )); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _toggleOverlay, + child: CompositedTransformTarget( + link: _layerLink, + child: + const FlutterLogo( + size: 80, + ), + )); + } + + void _toggleOverlay() { + if (!show) { + _showOverlay(); + } else { + _hideOverlay(); + } + show = !show; + } + + void _showOverlay() { + _overlayEntry = _createOverlayEntry(); + Overlay.of(context)?.insert(_overlayEntry!); + } + + void _hideOverlay() { + _overlayEntry?.remove(); + } + + @override + void dispose() { + _hideOverlay(); + super.dispose(); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json new file mode 100644 index 00000000..9f212b54 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Zusammengesetztes Transformationsziel", + "info": "Wird in der Regel in Verbindung mit der CompositedTransformFollower-Komponente verwendet, um das Overlay an die Zieltransformation anzupassen.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von CompositedTransformTarget", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【link】 : Verknüpfung 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json new file mode 100644 index 00000000..25b5ad35 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Composite Transform Target", + "info": "Generally used in conjunction with the CompositedTransformFollower component, it allows the Overlay to follow the target transformation.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget Usage", + "desc": [ + "【child】 : Child component 【Widget】", + "【link】 : Link 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json new file mode 100644 index 00000000..0fe0dd5d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Objetivo de transformación compuesta", + "info": "Generalmente se usa junto con el componente CompositedTransformFollower, lo que permite que el Overlay siga la transformación del objetivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CompositedTransformTarget", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【link】 : Enlace 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json new file mode 100644 index 00000000..714f08cf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Cible de transformation composite", + "info": "Généralement utilisé conjointement avec le composant CompositedTransformFollower, il permet à l'Overlay de suivre les transformations de la cible.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CompositedTransformTarget", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【link】 : Lien 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json new file mode 100644 index 00000000..0440bbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Obiettivo di trasformazione composita", + "info": "Generalmente utilizzato insieme al componente CompositedTransformFollower, consente all'Overlay di seguire le trasformazioni dell'obiettivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di CompositedTransformTarget", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【link】 : Collegamento 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json new file mode 100644 index 00000000..c6b8469c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "合成変換ターゲット", + "info": "一般的に CompositedTransformFollower コンポーネントと組み合わせて使用され、Overlay をターゲットの変換に伴わせることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget の使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【link】 : リンク 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json new file mode 100644 index 00000000..a82981b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "합성 변환 대상", + "info": "일반적으로 CompositedTransformFollower 컴포넌트와 함께 사용되며, Overlay가 대상 변환을 따라가도록 할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【link】 : 링크 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json new file mode 100644 index 00000000..56e64b59 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Alvo de Transformação Composta", + "info": "Geralmente usado em conjunto com o componente CompositedTransformFollower, pode fazer com que o Overlay acompanhe a transformação do alvo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CompositedTransformTarget", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【link】 : Link 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json new file mode 100644 index 00000000..291a2959 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Цель составного преобразования", + "info": "Обычно используется совместно с компонентом CompositedTransformFollower, что позволяет Overlay следовать за преобразованием цели.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CompositedTransformTarget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【link】 : Ссылка 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json new file mode 100644 index 00000000..8bc37647 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "合成变换目标", + "info": "一般与 CompositedTransformFollower 组件联合使用,可以使 Overlay 伴随目标变换。", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【link】 : 链接 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart new file mode 100644 index 00000000..57ef07e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart @@ -0,0 +1,103 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/3/31 +/// contact me by email 1981462002@qq.com +/// + + +class CompositedTransformTargetDemo extends StatelessWidget { + + const CompositedTransformTargetDemo({Key? key}) : super(key: key); + + static const List colors =[Colors.red,Colors.yellow,Colors.blue,Colors.green]; + + @override + Widget build(BuildContext context) { + return Container( + transform: Matrix4.rotationZ(-15/180*pi), + height: 250, + padding: const EdgeInsets.all(50.0), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [_LogoTips(), const Text('点击图标\n显隐弹框')], + ), + ...colors.map((color) => Container(width: 80, color: color)) + ], + ), + ); + } + +} + +class _LogoTips extends StatefulWidget { + @override + _LogoTipsState createState() => _LogoTipsState(); +} + +class _LogoTipsState extends State<_LogoTips> { + OverlayEntry? _overlayEntry; + + final LayerLink _layerLink = LayerLink(); + + bool show = false; + + OverlayEntry _createOverlayEntry() { + return OverlayEntry( + builder: (context) => Positioned( + width: 150, + child: CompositedTransformFollower( + link: _layerLink, + showWhenUnlinked: false, + targetAnchor: Alignment.topRight, + child: const Card( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text('我是一个 Overlay,目标组件为图标,当它变换时,我会伴随变换。'), + ), + ), + ), + )); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _toggleOverlay, + child: CompositedTransformTarget( + link: _layerLink, + child: + const FlutterLogo( + size: 80, + ), + )); + } + + void _toggleOverlay() { + if (!show) { + _showOverlay(); + } else { + _hideOverlay(); + } + show = !show; + } + + void _showOverlay() { + _overlayEntry = _createOverlayEntry(); + Overlay.of(context)?.insert(_overlayEntry!); + } + + void _hideOverlay() { + _overlayEntry?.remove(); + } + + @override + void dispose() { + _hideOverlay(); + super.dispose(); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json new file mode 100644 index 00000000..5f54b474 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Eingeschränkte Box", + "info": "Kann ein Unterelement aufnehmen und durch die Angabe von maximaler und minimaler Breite und Höhe den Bereich des Unterelements begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BoxConstraints", + "desc": [ + "【child】 : Kind-Komponente 【Widget】", + "【minWidth】 : Minimale Breite 【double】", + "【minHeight】 : Minimale Höhe 【double】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json new file mode 100644 index 00000000..c1d16da0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Constrained Box", + "info": "Can contain a child component, and limit the area of the child component by specifying the maximum and minimum width and height.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BoxConstraints", + "desc": [ + "【child】 : Child component 【Widget】", + "【minWidth】 : Minimum width 【double】", + "【minHeight】 : Minimum height 【double】", + "【maxHeight】 : Maximum height 【double】", + "【maxWidth】 : Maximum width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json new file mode 100644 index 00000000..5b3675ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Caja con restricciones", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y alto máximo y mínimo.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BoxConstraints", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【minWidth】 : Ancho mínimo 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json new file mode 100644 index 00000000..857eb2d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Boîte de contraintes", + "info": "Peut contenir un composant enfant, en spécifiant la largeur et la hauteur maximales et minimales pour limiter la zone du composant enfant.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BoxConstraints", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【minWidth】 : Largeur minimale 【double】", + "【minHeight】 : Hauteur minimale 【double】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json new file mode 100644 index 00000000..5147457f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Scatola Vincolata", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando larghezza e altezza massime e minime.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BoxConstraints", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【minWidth】 : Larghezza minima 【double】", + "【minHeight】 : Altezza minima 【double】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json new file mode 100644 index 00000000..57709223 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "制約ボックス", + "info": "子コンポーネントを収容でき、最大・最小の幅と高さを指定して、子コンポーネントの領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraintsの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【minWidth】 : 最小幅 【double】", + "【minHeight】 : 最小高さ 【double】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json new file mode 100644 index 00000000..02b077fb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "제한 상자", + "info": "하위 위젯을 수용할 수 있으며, 최대 및 최소 너비와 높이를 지정하여 하위 위젯의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraints 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【minWidth】 : 최소 너비 【double】", + "【minHeight】 : 최소 높이 【double】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json new file mode 100644 index 00000000..585ab4ef --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Caixa Restrita", + "info": "Pode conter um componente filho, limitando a área onde o componente filho pode estar, especificando a largura e altura mínima e máxima.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de BoxConstraints", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【minWidth】 : Largura mínima 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json new file mode 100644 index 00000000..65a5a04f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Ограниченный контейнер", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента путем указания минимальной и максимальной ширины и высоты.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BoxConstraints", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【minWidth】 : Минимальная ширина 【double】", + "【minHeight】 : Минимальная высота 【double】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json new file mode 100644 index 00000000..05755076 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "约束盒", + "info": "可容纳一个子组件,通过指定最大、最小宽高,来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraints基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【minWidth】 : 最小宽 【double】", + "【minHeight】 : 最小高 【double】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart new file mode 100644 index 00000000..59a656e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomConstrainedBox extends StatefulWidget { + const CustomConstrainedBox({Key? key}) : super(key: key); + + @override + _CustomConstrainedBoxState createState() => _CustomConstrainedBoxState(); +} + +class _CustomConstrainedBoxState extends State { + String _text = ''; + + @override + Widget build(BuildContext context) { + Widget child = Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 40, + height: 40, + child: const Text("Static"), + ); + + Widget box = ConstrainedBox( + constraints: const BoxConstraints( + minHeight: 50, + minWidth: 20, + maxHeight: 80, + maxWidth: 150, + ), + child: Container(color: Colors.orange, child: Text(_text)), + ); + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(22), + width: 300, + height: 100, + child: Row( + children: [child, UnconstrainedBox(child: box), child], + ), + ), + _buildInput(), + ], + ); + } + + Widget _buildInput() { + return Padding( + padding: const EdgeInsets.all(18.0), + child: TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: '请输入', + ), + onChanged: (v) { + setState(() { + _text = v; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json new file mode 100644 index 00000000..924c857c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOS-Textauswahl-Werkzeugleiste", + "info": "Eine iOS-stil Werkzeugleiste, die auf Textauswahl reagiert", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Diese Komponente kann nicht verwendet werden", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json new file mode 100644 index 00000000..9b985784 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOS Text Selection Toolbar", + "info": "An iOS-style toolbar that responds to text selection", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "This component is not available", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json new file mode 100644 index 00000000..1fefc04f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra de herramientas de selección de texto iOS", + "info": "Barra de herramientas de estilo iOS que responde a la selección de texto", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Este componente no se puede usar", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json new file mode 100644 index 00000000..39d455a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barre d'outils de sélection de texte iOS", + "info": "Barre d'outils de style iOS qui répond à la sélection de texte", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ce composant ne peut pas être utilisé", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json new file mode 100644 index 00000000..0837589c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra degli strumenti di selezione del testo per iOS", + "info": "Barra degli strumenti in stile iOS che risponde alla selezione del testo", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Questo componente non può essere utilizzato", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json new file mode 100644 index 00000000..ffbb4028 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOSテキスト選択ツールバー", + "info": "テキスト選択に応答するiOSスタイルのツールバー", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "このコンポーネントは使用できません", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json new file mode 100644 index 00000000..2040ec18 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "ios 텍스트 선택 도구 모음", + "info": "텍스트 선택에 반응하는 ios 스타일의 도구 모음", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "이 컴포넌트는 사용할 수 없습니다", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json new file mode 100644 index 00000000..531eaca3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra de ferramentas de seleção de texto iOS", + "info": "Barra de ferramentas no estilo iOS que responde à seleção de texto", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Este componente não pode ser usado", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json new file mode 100644 index 00000000..5c65d5a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Панель инструментов для выбора текста iOS", + "info": "Панель инструментов в стиле iOS, реагирующая на выбор текста", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Этот компонент недоступен", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json new file mode 100644 index 00000000..c1cf4999 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "ios文字选择工具条", + "info": "对文本选择做出响应的 ios 风格的工具栏", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "该组件无法使用", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart new file mode 100644 index 00000000..aebf20b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class CupertinoTextSelectionToolbarDemo extends StatelessWidget { + const CupertinoTextSelectionToolbarDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(10), + width: 300, + child: const Text( + "注:此组件私有构造器,外部无法使用,并没有使用价值。", + style: TextStyle(color: Colors.red, fontSize: 18), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json new file mode 100644 index 00000000..c4e97d67 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Zeichnungskomponente", + "info": "Durch CustomPainter können komplexe benutzerdefinierte Zeichnungskomponenten erstellt werden, was die Seele der benutzerdefinierten Komponenten in Flutter darstellt.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint Linienzeichnung", + "desc": [ + "【painter】 : Zeichnungsgerät 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint Bézier-Kurven", + "desc": [ + "Flutter unterstützt auch komplexe Zeichnungen wie Bézier-Kurven." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json new file mode 100644 index 00000000..6f131930 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Drawing Component", + "info": "Drawing through CustomPainter can achieve some complex custom drawing components, and it is the soul of custom components in Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint Line Drawing", + "desc": [ + "【painter】: Painter 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint Bezier Curve", + "desc": [ + "Flutter also supports complex drawings such as Bezier curves." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json new file mode 100644 index 00000000..ca8bd5f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente de dibujo", + "info": "A través de CustomPainter, se pueden implementar algunos componentes de dibujo personalizados complejos, siendo el alma de los componentes personalizados en Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint dibuja formas de línea", + "desc": [ + "【painter】: pintor 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint dibuja curvas de Bézier", + "desc": [ + "Flutter también admite dibujos complejos como curvas de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json new file mode 100644 index 00000000..7eaf8e7f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Composant de dessin", + "info": "En utilisant CustomPainter, il est possible de réaliser des composants de dessin personnalisés complexes, ce qui en fait une figure essentielle des composants personnalisés dans Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Dessin de lignes avec CustomPaint", + "desc": [ + "【painter】 : Peintre 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Dessin de courbes de Bézier avec CustomPaint", + "desc": [ + "Flutter prend également en charge des dessins complexes comme les courbes de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json new file mode 100644 index 00000000..698e0db3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente di disegno", + "info": "Attraverso CustomPainter, è possibile realizzare alcuni componenti di disegno personalizzati complessi, che rappresentano l'anima dei componenti personalizzati in Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Disegno di linee con CustomPaint", + "desc": [ + "【painter】 : strumento di disegno 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Curva di Bézier con CustomPaint", + "desc": [ + "Flutter supporta anche disegni complessi come le curve di Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json new file mode 100644 index 00000000..98a0fa61 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "描画コンポーネント", + "info": "CustomPainterを使用して描画することで、複雑なカスタム描画コンポーネントを実現できます。これはFlutterのカスタムコンポーネントの中心的な存在です。", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaintで線と図形を描画", + "desc": [ + "【painter】 : ペインター 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaintでベジェ曲線を描画", + "desc": [ + "Flutterはベジェ曲線などの複雑な描画もサポートしています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json new file mode 100644 index 00000000..7fd754bb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "그리기 컴포넌트", + "info": "CustomPainter를 통해 그리기를 수행하며, 복잡한 사용자 정의 그리기 컴포넌트를 구현할 수 있습니다. Flutter에서 사용자 정의 컴포넌트의 핵심 요소입니다.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint로 선 그리기", + "desc": [ + "【painter】 : 페인터 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint로 베지어 곡선 그리기", + "desc": [ + "Flutter는 베지어 곡선과 같은 복잡한 그리기도 지원합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json new file mode 100644 index 00000000..4cdbd577 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente de Desenho", + "info": "Através do CustomPainter, é possível realizar alguns componentes de desenho personalizados complexos, sendo uma figura central na criação de componentes personalizados no Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Desenho de Linhas com CustomPaint", + "desc": [ + "【painter】 : Pintor 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Desenho de Curvas de Bézier com CustomPaint", + "desc": [ + "O Flutter também suporta desenhos complexos como curvas de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json new file mode 100644 index 00000000..27456915 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Компонент рисования", + "info": "Рисование с помощью CustomPainter позволяет реализовать сложные пользовательские компоненты рисования, являясь ключевым элементом пользовательских компонентов во Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Рисование линий с помощью CustomPaint", + "desc": [ + "【painter】 : рисовальщик 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Рисование кривых Безье с помощью CustomPaint", + "desc": [ + "Flutter также поддерживает сложное рисование, такое как кривые Безье." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json new file mode 100644 index 00000000..c950ad8e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "绘制组件", + "info": "通过CustomPainter进行绘制,可实现一些复杂的自定义绘制组件,是Flutter中自定义组件的灵魂人物。", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint绘线图形", + "desc": [ + "【painter】 : 绘画器 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint绘线贝塞尔曲线", + "desc": [ + "Flutter也支持贝塞尔曲线等复杂绘制。" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart similarity index 96% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart index 92deaabe..df2cdebf 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 166, -// "name": 'CustomPaint绘线图形', -// "priority": 1, -// "subtitle": -// "【painter】 : 绘画器 【CustomPainter】", -// } + class ClockPage extends StatelessWidget { const ClockPage({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart similarity index 95% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart index 24835a5e..d59250e6 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 166, -// "name": 'CustomPaint绘线贝塞尔曲线', -// "priority": 2, -// "subtitle": " Flutter也支持贝塞尔曲线等复杂绘制。", -// } + class PlayBezier3Page extends StatefulWidget { const PlayBezier3Page({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json new file mode 100644 index 00000000..e87b36dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Allgemeines Einzelkind-Layout", + "info": "Kann ein Unterelement aufnehmen und eine Delegiertenklasse angeben, um das Unterelement anzuordnen. Die Delegiertenklasse kann den Bereich des übergeordneten Containers und die Bereichsgröße des Unterelements sowie die Bereichsbeschränkungen abrufen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CustomSingleChildLayout", + "desc": [ + "【delegate】 : Delegat 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Verschiebungsverwendung von CustomSingleChildLayout", + "desc": [ + "Kann die Verschiebungsfähigkeit des Delegaten nutzen, um das Unterelement zu positionieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json new file mode 100644 index 00000000..377116b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Universal Single Child Layout", + "info": "Can accommodate one child component and specify a delegate class to arrange the child component. The delegate class can obtain the parent container area, the child component's area size, and the area constraints.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegate 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Offset Usage of CustomSingleChildLayout", + "desc": [ + "The offset capability of the delegate can be used to position the child component with an offset." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json new file mode 100644 index 00000000..f829cee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Diseño de un solo hijo personalizado", + "info": "Puede contener un componente hijo y especificar una clase delegada para organizar el componente hijo. La clase delegada puede obtener el área del contenedor padre y el tamaño del área del componente hijo, así como las restricciones del área.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegado 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso de desplazamiento en CustomSingleChildLayout", + "desc": [ + "Se puede utilizar la capacidad de desplazamiento del delegado para posicionar el componente hijo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json new file mode 100644 index 00000000..819d6eaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Disposition personnalisée à un seul enfant", + "info": "Peut contenir un seul composant enfant et spécifie une classe déléguée pour organiser le composant enfant. La classe déléguée peut obtenir la zone du conteneur parent et la taille de la zone du composant enfant, ainsi que les contraintes de zone.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CustomSingleChildLayout", + "desc": [ + "【delegate】 : délégué 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Utilisation du décalage de CustomSingleChildLayout", + "desc": [ + "Peut utiliser la capacité de décalage du délégué pour positionner le composant enfant avec un décalage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json new file mode 100644 index 00000000..43ddc574 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Layout Singolo Figlio Personalizzato", + "info": "Può contenere un componente figlio e specificare una classe delegata per disporre il componente figlio. La classe delegata può ottenere l'area del contenitore padre e le dimensioni dell'area del componente figlio, nonché i vincoli dell'area.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegato 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso dello spostamento in CustomSingleChildLayout", + "desc": [ + "È possibile utilizzare la capacità di spostamento del delegato per posizionare il componente figlio." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json new file mode 100644 index 00000000..5c5db389 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "汎用シングルチャイルドレイアウト", + "info": "1つの子コンポーネントを収容し、代理クラスを指定して子コンポーネントをレイアウトします。代理クラスは、親コンテナ領域と子コンポーネントの領域サイズ、および領域の制約状況を取得できます。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayoutの基本使用", + "desc": [ + "【delegate】 : 代理 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayoutのオフセット使用", + "desc": [ + "代理のオフセット能力を利用して、子コンポーネントをオフセット位置に配置できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json new file mode 100644 index 00000000..20753e7d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "일반 단일 자식 레이아웃", + "info": "하나의 자식 위젯을 수용하고, 대리 클래스를 지정하여 자식 위젯을 배치합니다. 대리 클래스는 부모 컨테이너 영역과 자식 위젯의 영역 크기 및 영역 제약 조건을 얻을 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayout 기본 사용", + "desc": [ + "【delegate】 : 대리 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayout의 오프셋 사용", + "desc": [ + "대리의 오프셋 기능을 활용하여 자식 위젯을 오프셋 위치시킬 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json new file mode 100644 index 00000000..6a3704d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Layout de Filho Único Personalizado", + "info": "Pode acomodar um componente filho e especificar uma classe de proxy para organizar o componente filho. A classe de proxy pode obter a área do contêiner pai e o tamanho da área do componente filho, bem como as restrições da área.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CustomSingleChildLayout", + "desc": [ + "【delegate】 : proxy 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso de Deslocamento do CustomSingleChildLayout", + "desc": [ + "Pode utilizar a capacidade de deslocamento do proxy para posicionar o componente filho com deslocamento." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json new file mode 100644 index 00000000..d25be61c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Универсальный макет с одним дочерним элементом", + "info": "Может содержать один дочерний компонент и задавать класс-делегат для размещения дочернего компонента. Класс-делегат может получить область родительского контейнера и размер области дочернего компонента, а также ограничения области.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CustomSingleChildLayout", + "desc": [ + "【delegate】 : делегат 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Использование смещения в CustomSingleChildLayout", + "desc": [ + "Можно использовать возможности смещения делегата для позиционирования дочернего компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json new file mode 100644 index 00000000..d45b2202 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "通用单子布局", + "info": "可容纳一个子组件,并指定代理类对子组件进行排布。代理类可获取父容器区域和子组件的区域大小,及区域约束情况。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayout基本使用", + "desc": [ + "【delegate】 : 代理 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayout的偏移使用", + "desc": [ + "可以利用代理的偏移能力,对子组件进行偏移定位。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart new file mode 100644 index 00000000..6295eac5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/3 +/// contact me by email 1981462002@qq.com + + +class CustomSingleChildLayoutDemo extends StatelessWidget { + const CustomSingleChildLayoutDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + print('-------CustomSingleChildLayoutDemo------'); + return Container( + width: 300, + height: 200, + color: Colors.grey.withAlpha(11), + child: CustomSingleChildLayout( + delegate: _TolySingleChildLayoutDelegate(), + child: Container( + color: Colors.orange, + ), + ), + ); + } +} + +class _TolySingleChildLayoutDelegate extends SingleChildLayoutDelegate { + @override + bool shouldRelayout(SingleChildLayoutDelegate oldDelegate) { + return true; + } + + @override + Size getSize(BoxConstraints constraints) { + print('----getSize:----constraints:$constraints----'); + return super.getSize(constraints); + } + + @override + Offset getPositionForChild(Size size, Size childSize) { + print('----getPositionForChild: size:$size----childSize:$childSize----'); + return Offset(size.width / 2, 0); + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + print('----getConstraintsForChild:----constraints:$constraints----'); + return BoxConstraints( + maxWidth: constraints.maxWidth / 2, + maxHeight: constraints.maxHeight / 2, + minHeight: constraints.maxHeight / 4, + minWidth: constraints.maxWidth / 4, + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart similarity index 92% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart index f43a815c..cfa45dbc 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 285, -// "name": 'CustomSingleChildLayout的偏移使用', -// "priority": 2, -// "subtitle": -// "可以利用代理的偏移能力,对子组件进行偏移定位。", -// } class OffSetWidgetDemo extends StatelessWidget { const OffSetWidgetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json new file mode 100644 index 00000000..00a0aab8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Dekorationsbox", + "info": "Kann ein Kindelement aufnehmen und es dekorieren. Die Kerneigenschaft ist decoration, mit der Rahmen, Verläufe, Schatten, Hintergrundbilder usw. festgelegt werden können.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DecoratedBox", + "desc": [ + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【position】 : Vordergrundfarbe (links)/Hintergrundfarbe (rechts) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Form und Bilddekoration von DecoratedBox", + "desc": [ + "【shape】 : Form 【BoxShape】", + "【image】 : Hintergrundbild 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Rahmendekoration von DecoratedBox", + "desc": [ + "【border】 : Rahmen 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Formdekoration von DecoratedBox", + "desc": [ + "Mit dem ShapeDecoration-Objekt kann die Rahmenform angegeben werden," + ] + }, + { + "file": "node5_line.dart", + "name": "Unterstreichungsdekoration von DecoratedBox", + "desc": [ + "Mit dem UnderlineTabIndicator-Objekt kann die Unterstreichung angegeben werden," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration-Dekoration", + "desc": [ + "Mit dem FlutterLogoDecoration-Objekt kann die Flutter-Icon-Dekoration angegeben werden (hat keine große Bedeutung)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json new file mode 100644 index 00000000..6fa9323e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Decorated Box", + "info": "Can contain a child component and decorate it. The core property is decoration, which can set borders, gradients, shadows, background images, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DecoratedBox", + "desc": [ + "【decoration】: Decoration object 【Decoration】", + "【position】: Foreground color (left)/Background color (right) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Shape and Image Decoration of DecoratedBox", + "desc": [ + "【shape】: Shape 【BoxShape】", + "【image】: Background image 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Border Decoration of DecoratedBox", + "desc": [ + "【border】: Border 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Shape Decoration of DecoratedBox", + "desc": [ + "You can specify the border shape through the ShapeDecoration object," + ] + }, + { + "file": "node5_line.dart", + "name": "Bottom Line Decoration of DecoratedBox", + "desc": [ + "You can specify the bottom line through the UnderlineTabIndicator object," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration Decoration", + "desc": [ + "You can specify Flutter icon decoration through the FlutterLogoDecoration object (not very useful)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json new file mode 100644 index 00000000..c21db3db --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Caja Decorada", + "info": "Puede contener un componente hijo y decorarlo. La propiedad principal es decoration, que permite configurar bordes, degradados, sombras, imágenes de fondo, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DecoratedBox", + "desc": [ + "【decoration】 : Objeto de decoración 【Decoration】", + "【position】 : Color de primer plano (izquierda)/Color de fondo (derecha) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Decoración de forma e imagen en DecoratedBox", + "desc": [ + "【shape】 : Forma 【BoxShape】", + "【image】 : Imagen de fondo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decoración de borde en DecoratedBox", + "desc": [ + "【border】 : Borde 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decoración de forma en DecoratedBox", + "desc": [ + "Se puede especificar la forma del borde mediante el objeto ShapeDecoration," + ] + }, + { + "file": "node5_line.dart", + "name": "Decoración de línea inferior en DecoratedBox", + "desc": [ + "Se puede especificar la línea inferior mediante el objeto UnderlineTabIndicator," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decoración con FlutterLogoDecoration", + "desc": [ + "Se puede especificar la decoración del ícono de Flutter mediante el objeto FlutterLogoDecoration (no tiene mucho uso)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json new file mode 100644 index 00000000..dc641c56 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Boîte décorée", + "info": "Peut contenir un composant enfant et le décorer. La propriété principale est decoration, qui permet de définir des bordures, des dégradés, des ombres, des images de fond, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DecoratedBox", + "desc": [ + "【decoration】 : Objet de décoration 【Decoration】", + "【position】 : Couleur de premier plan (gauche)/couleur d'arrière-plan (droite) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Forme et image de décoration de DecoratedBox", + "desc": [ + "【shape】 : Forme 【BoxShape】", + "【image】 : Image de fond 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Bordure de décoration de DecoratedBox", + "desc": [ + "【border】 : Bordure 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Forme de décoration de DecoratedBox", + "desc": [ + "L'objet ShapeDecoration permet de spécifier la forme de la bordure," + ] + }, + { + "file": "node5_line.dart", + "name": "Ligne de décoration de DecoratedBox", + "desc": [ + "L'objet UnderlineTabIndicator permet de spécifier la ligne de fond," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Décoration FlutterLogoDecoration", + "desc": [ + "L'objet FlutterLogoDecoration permet de spécifier la décoration de l'icône Flutter (sans grande utilité)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json new file mode 100644 index 00000000..9fbe1046 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Scatola decorata", + "info": "Può contenere un componente figlio e decorarlo. La proprietà principale è decoration, che può impostare bordi, gradienti, ombre, immagini di sfondo, ecc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DecoratedBox", + "desc": [ + "【decoration】 : oggetto decorativo 【Decoration】", + "【position】 : colore in primo piano (sinistra)/colore di sfondo (destra) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Decorazione di forma e immagine di DecoratedBox", + "desc": [ + "【shape】 : forma 【BoxShape】", + "【image】 : immagine di sfondo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decorazione del bordo di DecoratedBox", + "desc": [ + "【border】 : bordo 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decorazione della forma di DecoratedBox", + "desc": [ + "È possibile specificare la forma del bordo tramite l'oggetto ShapeDecoration," + ] + }, + { + "file": "node5_line.dart", + "name": "Decorazione della linea di base di DecoratedBox", + "desc": [ + "È possibile specificare la linea di base tramite l'oggetto UnderlineTabIndicator," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decorazione FlutterLogoDecoration", + "desc": [ + "È possibile specificare la decorazione dell'icona Flutter tramite l'oggetto FlutterLogoDecoration (non ha un grande utilità)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json new file mode 100644 index 00000000..21dabc4f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "装飾ボックス", + "info": "子コンポーネントを収容し、装飾することができます。コアプロパティはdecorationで、枠線、グラデーション、影、背景画像などを設定できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxの基本使用", + "desc": [ + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【position】 : 前景色(左)/背景色(右) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBoxの形状と画像装飾", + "desc": [ + "【shape】 : 形状 【BoxShape】", + "【image】 : 背景画像 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBoxの枠線装飾", + "desc": [ + "【border】 : 枠線 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBoxの形状装飾", + "desc": [ + "ShapeDecorationオブジェクトを使用して枠線の形状を指定できます," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBoxの下線装飾", + "desc": [ + "UnderlineTabIndicatorオブジェクトを使用して下線を指定できます," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration装飾", + "desc": [ + "FlutterLogoDecorationオブジェクトを使用してFlutterアイコン装飾を指定できます(特に大きな効果はありません)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json new file mode 100644 index 00000000..feff512f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "장식 상자", + "info": "하위 컴포넌트를 포함할 수 있으며, 이를 장식할 수 있습니다. 핵심 속성은 decoration으로, 테두리, 그라데이션, 그림자, 배경 이미지 등을 설정할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBox 기본 사용", + "desc": [ + "【decoration】 : 장식 객체 【Decoration】", + "【position】 : 전경색(왼쪽)/배경색(오른쪽) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBox 형태와 이미지 장식", + "desc": [ + "【shape】 : 형태 【BoxShape】", + "【image】 : 배경 이미지 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBox 테두리 장식", + "desc": [ + "【border】 : 테두리 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBox 형태 장식", + "desc": [ + "ShapeDecoration 객체를 통해 테두리 형태를 지정할 수 있습니다," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBox 밑줄 장식", + "desc": [ + "UnderlineTabIndicator 객체를 통해 밑줄을 지정할 수 있습니다," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration 장식", + "desc": [ + "FlutterLogoDecoration 객체를 통해 Flutter 아이콘 장식을 지정할 수 있습니다(별다른 기능은 없습니다)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json new file mode 100644 index 00000000..c8a9195b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Caixa Decorada", + "info": "Pode conter um componente filho e decorá-lo. A propriedade principal é decoration, que pode definir bordas, gradientes, sombras, imagens de fundo, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DecoratedBox", + "desc": [ + "【decoration】 : Objeto de decoração 【Decoration】", + "【position】 : Cor de primeiro plano (esquerda)/Cor de fundo (direita) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Forma e Decoração de Imagem do DecoratedBox", + "desc": [ + "【shape】 : Forma 【BoxShape】", + "【image】 : Imagem de fundo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decoração de Borda do DecoratedBox", + "desc": [ + "【border】 : Borda 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decoração de Forma do DecoratedBox", + "desc": [ + "O objeto ShapeDecoration pode especificar a forma da borda," + ] + }, + { + "file": "node5_line.dart", + "name": "Decoração de Linha de Base do DecoratedBox", + "desc": [ + "O objeto UnderlineTabIndicator pode especificar a linha de base," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decoração com FlutterLogoDecoration", + "desc": [ + "O objeto FlutterLogoDecoration pode especificar a decoração do ícone Flutter (não tem grande utilidade)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json new file mode 100644 index 00000000..afd56ba9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Декорированный блок", + "info": "Может содержать один дочерний компонент и декорировать его. Основное свойство - decoration, которое позволяет настроить границы, градиенты, тени, фоновые изображения и т.д.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DecoratedBox", + "desc": [ + "【decoration】 : Объект декора 【Decoration】", + "【position】 : Передний план (слева)/Задний план (справа) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Форма и изображение декора в DecoratedBox", + "desc": [ + "【shape】 : Форма 【BoxShape】", + "【image】 : Фоновое изображение 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Декорирование границ в DecoratedBox", + "desc": [ + "【border】 : Граница 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Декорирование формы в DecoratedBox", + "desc": [ + "С помощью объекта ShapeDecoration можно указать форму границы," + ] + }, + { + "file": "node5_line.dart", + "name": "Декорирование нижней линии в DecoratedBox", + "desc": [ + "С помощью объекта UnderlineTabIndicator можно указать нижнюю линию," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Декорирование FlutterLogoDecoration", + "desc": [ + "С помощью объекта FlutterLogoDecoration можно указать декорирование иконкой Flutter (не имеет особого значения)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json new file mode 100644 index 00000000..1a57df64 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "装饰盒", + "info": "可容纳一个子组件,可将其进行装饰。核心属性为decoration,可设置边线、渐变、阴影、背景图等。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBox基本使用", + "desc": [ + "【decoration】 : 装饰对象 【Decoration】", + "【position】 : 前景色(左)/后景色(右) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBox形状和图片装饰", + "desc": [ + "【shape】 : 形状 【BoxShape】", + "【image】 : 背景图片 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBox边线装饰", + "desc": [ + "【border】 : 边线 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBox形状装饰", + "desc": [ + "通过ShapeDecoration对象可指定边线形状," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBox底线装饰", + "desc": [ + "通过UnderlineTabIndicator对象可指定底线," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration装饰", + "desc": [ + "通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart new file mode 100644 index 00000000..bfd90d69 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class BoxDecorationDemo extends StatelessWidget { + const BoxDecorationDemo({Key? key}) : super(key: key); + + final List rainbow = const [ + 0xffff0000, + 0xffFF7F00, + 0xffFFFF00, + 0xff00FF00, + 0xff00FFFF, + 0xff0000FF, + 0xff8B00FF + ]; + + @override + Widget build(BuildContext context) { + return DecoratedBox( + position: DecorationPosition.background, + decoration: BoxDecoration( + gradient: LinearGradient( + stops: const [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], + colors: rainbow.map((e) => Color(e)).toList()), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + ), + boxShadow: const [ + BoxShadow( + color: Colors.orangeAccent, + offset: Offset(1, 1), + blurRadius: 10, + spreadRadius: 1), + ]), + child: Icon( + Icons.android, + size: 80, + color: Colors.black.withAlpha(123), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart new file mode 100644 index 00000000..850cfb04 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class ShapeImageDemo extends StatelessWidget { + const ShapeImageDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/wy_200x300.webp', + ))), + child: SizedBox( + height: 80, + width: 80, + child: Icon( + Icons.ac_unit, + color: Colors.white, + size: 40, + ), + ), + ); + } +} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart similarity index 80% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart index 81a6dc1e..a1aec5cd 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox边线装饰', -// "priority": 3, -// "subtitle": "【border】 : 边线 【BoxBorder】\n", -// } + class BorderDemo extends StatelessWidget { const BorderDemo({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart similarity index 84% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart index c7fe0d74..14000014 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox形状装饰', -// "priority": 4, -// "subtitle": "通过ShapeDecoration对象可指定边线形状\n", -// } + class ShapeDecorationDemo extends StatelessWidget { const ShapeDecorationDemo({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart similarity index 76% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart index 4befaeee..95ed6d9f 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox底线装饰', -// "priority": 5, -// "subtitle": "通过UnderlineTabIndicator对象可指定底线\n", -// } + class UnderlineTabIndicatorDemo extends StatelessWidget { const UnderlineTabIndicatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart new file mode 100644 index 00000000..644f732a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + + +class FlutterLogoDecorationDemo extends StatelessWidget { + const FlutterLogoDecorationDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const DecoratedBox( + decoration: FlutterLogoDecoration( +// darkColor: Colors.orange, +// lightColor: Colors.deepPurpleAccent, + margin: EdgeInsets.all(8), + style: FlutterLogoStyle.stacked), + child: SizedBox( + width: 100, + height: 100, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json new file mode 100644 index 00000000..72b9e13a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transparenzübergang", + "info": "Kann ein Kindelement aufnehmen und eine Transparenzverlaufsanimation durchführen, wobei ein Animator opacity erforderlich ist.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FadeTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json new file mode 100644 index 00000000..78215438 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Fade Transition", + "info": "Can contain a child component and make it perform a fade animation, requires an animator opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FadeTransition", + "desc": [ + "【child】 : Child Component 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json new file mode 100644 index 00000000..b40ee163 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transición de desvanecimiento", + "info": "Puede contener un componente hijo y hacer que realice una animación de cambio de opacidad, requiere un animador de opacidad.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FadeTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【opacity】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json new file mode 100644 index 00000000..a0336dee --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transition de transparence", + "info": "Peut contenir un composant enfant et lui appliquer une animation de transition d'opacité, nécessite un animateur opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FadeTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json new file mode 100644 index 00000000..9ba5f410 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transizione di trasparenza", + "info": "Può contenere un componente figlio e fargli eseguire un'animazione di dissolvenza della trasparenza, richiede un animatore opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di FadeTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【opacity】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json new file mode 100644 index 00000000..5dbe65a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "フェードトランジション", + "info": "1つの子コンポーネントを収容し、透明度の変化アニメーションを行わせることができます。アニメーターopacityを提供する必要があります。", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【opacity】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json new file mode 100644 index 00000000..1bae8dc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "투명도 전환", + "info": "하나의 자식 위젯을 포함할 수 있으며, 투명도가 점진적으로 변하는 애니메이션을 수행합니다. 애니메이터 opacity를 제공해야 합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【opacity】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json new file mode 100644 index 00000000..20a6bf53 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transição de Transparência", + "info": "Pode conter um componente filho e fazer com que ele realize uma animação de transição de transparência, é necessário fornecer o animador opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FadeTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【opacity】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json new file mode 100644 index 00000000..3814c364 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Прозрачное преобразование", + "info": "Может содержать один дочерний компонент и выполнять анимацию изменения прозрачности, требует предоставления аниматора opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FadeTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【opacity】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json new file mode 100644 index 00000000..540920f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "透明变换", + "info": "可容纳一个子组件,并使其进行透明度渐变动画,需要提供动画器opacity。", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【opacity】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart new file mode 100644 index 00000000..83332841 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomFadeTransition extends StatefulWidget { + const CustomFadeTransition({Key? key}) : super(key: key); + + @override + _CustomFadeTransitionState createState() => _CustomFadeTransitionState(); +} + +class _CustomFadeTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + ); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + color: Colors.grey.withAlpha(22), + width: 100, + height: 100, + child: FadeTransition( + opacity: CurvedAnimation(parent: _ctrl, curve: Curves.linear), + child: const Icon(Icons.android, color: Colors.green, size: 60), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json new file mode 100644 index 00000000..3a4aa12f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Anpassungsbox", + "info": "Kann ein Kindelement aufnehmen, verwendet die fit-Eigenschaft, um den Anpassungsmodus des Kindelements im Verhältnis zum Elternelement zu bestimmen, und verfügt über die Ausrichtungseigenschaft alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FittedBox", + "desc": [ + "【child】: Kindelement 【Widget】", + "【fit】: Anpassungsmodus 【BoxFit】", + "【alignment】: Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json new file mode 100644 index 00000000..8c894a01 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Fitted Box", + "info": "Can accommodate a child component, using the fit property to determine the adaptation mode of the child component area relative to the parent component, and has the alignment property.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FittedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【fit】: Adaptation mode 【BoxFit】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json new file mode 100644 index 00000000..144cf6a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Caja ajustada", + "info": "Puede contener un componente hijo, utiliza la propiedad fit para determinar el modo de adaptación del área del componente hijo en relación con el componente padre, y tiene la propiedad de alineación alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FittedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【fit】 : Modo de adaptación 【BoxFit】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json new file mode 100644 index 00000000..2e8ade46 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Boîte ajustée", + "info": "Peut contenir un composant enfant, utilise la propriété fit pour déterminer le mode d'adaptation de la zone du composant enfant par rapport au composant parent, possède la propriété d'alignement alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FittedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【fit】 : Mode d'adaptation 【BoxFit】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json new file mode 100644 index 00000000..2a64e52a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Scatola adattata", + "info": "Può contenere un componente figlio, utilizza la proprietà fit per determinare la modalità di adattamento dell'area del componente figlio rispetto al componente padre, ha la proprietà di allineamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di FittedBox", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【fit】 : modalità di adattamento 【BoxFit】", + "【alignment】 : modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json new file mode 100644 index 00000000..0e7173dd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "フィットボックス", + "info": "1つの子コンポーネントを収容でき、fitプロパティを使用して子コンポーネントの領域を親コンポーネントに対する適応モードを決定し、alignmentプロパティを持っています。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【fit】 : 適応モード 【BoxFit】", + "【alignment】 : 整列方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json new file mode 100644 index 00000000..bfee7328 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "적응 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, fit 속성을 사용하여 하위 컴포넌트 영역이 상위 컴포넌트에 대한 적응 모드를 결정합니다. alignment 속성을 가지고 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【fit】 : 적응 모드 【BoxFit】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json new file mode 100644 index 00000000..4f31e07c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Caixa Ajustada", + "info": "Pode conter um componente filho, usando a propriedade fit para determinar o modo de ajuste da área do componente filho em relação ao componente pai, possui a propriedade de alinhamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FittedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【fit】 : Modo de ajuste 【BoxFit】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json new file mode 100644 index 00000000..e8f902e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Адаптивный бокс", + "info": "Может содержать один дочерний компонент, использует свойство fit для определения режима адаптации области дочернего компонента относительно родительского компонента, имеет свойство выравнивания alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FittedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【fit】 : Режим адаптации 【BoxFit】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json new file mode 100644 index 00000000..3304f774 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "适应盒", + "info": "可容纳一个子组件,使用fit属性决定子组件区域相当于父组件的适应模式,拥有对齐属性alignment。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【fit】 : 适应模式 【BoxFit】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart new file mode 100644 index 00000000..8eeabb96 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomFittedBox extends StatefulWidget { + const CustomFittedBox({Key? key}) : super(key: key); + + @override + _CustomFittedBoxState createState() => _CustomFittedBoxState(); +} + +class _CustomFittedBoxState extends State { + double _childW = 20; + double _childH = 30; + + final List rainbow = const [ + 0xffff0000, + 0xffFF7F00, + 0xffFFFF00, + 0xff00FF00, + 0xff00FFFF, + 0xff0000FF, + 0xff8B00FF + ]; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Wrap( + spacing: 10, + runSpacing: 10, + children: BoxFit.values + .map((mode) => Column( + children: [ + _buildChild(mode), + const SizedBox(height: 10), + Text(mode.toString().split('.')[1]) + ], + )) + .toList()), + _buildSlider() + ], + ); + } + + Widget _buildChild(BoxFit m) { + return Container( + color: Colors.grey.withAlpha(44), + width: 80, + height: 60, + child: FittedBox( + fit: m, + child: Container( + width: _childW, + height: _childH, + decoration: BoxDecoration( + //添加渐变色 + gradient: LinearGradient( + stops: const[0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], + colors: rainbow.map((e) => Color(e)).toList()), + ), + ), + ), + ); + } + + Widget _buildSlider() => Column( + children: [ + Slider( + min: 10, + max: 150, + divisions: 100, + label: '子宽度:' + _childW.toStringAsFixed(1), + value: _childW, + onChanged: (v) => setState(() => _childW = v)), + Slider( + min: 10, + max: 150, + divisions: 100, + label: '子高度:' + _childH.toStringAsFixed(1), + value: _childH, + onChanged: (v) => setState(() => _childH = v)), + ], + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json new file mode 100644 index 00000000..c0c0f1a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Teilverschiebung", + "info": "Verschiebt das Kindelement durch die offset-Eigenschaft, die Verschiebung ist OffSet horizontal/vertikal * Größe des Kindelements.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FractionalTranslation", + "desc": [ + "【translation】 : Verschiebungsteilungswert 【Offset】", + "【child】: Kindelement 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json new file mode 100644 index 00000000..aaad7c9a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Fractional Translation", + "info": "Offset the child component through the offset property, the offset is the horizontal and vertical OffSet * the size of the child component.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FractionalTranslation", + "desc": [ + "【translation】: Offset fraction value 【Offset】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json new file mode 100644 index 00000000..aab50acb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Desplazamiento fraccional", + "info": "Desplaza el componente hijo mediante la propiedad offset, la cantidad de desplazamiento es el tamaño del componente hijo multiplicado por el OffSet horizontal y vertical.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FractionalTranslation", + "desc": [ + "【translation】: Valor de desplazamiento fraccional 【Offset】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json new file mode 100644 index 00000000..34d54e5c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Translation fractionnaire", + "info": "Déplace le composant enfant via la propriété offset, le déplacement est égal à la taille du composant enfant multipliée par les valeurs horizontale et verticale de l'Offset.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FractionalTranslation", + "desc": [ + "【translation】 : Valeur de déplacement fractionnaire 【Offset】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json new file mode 100644 index 00000000..38fac9c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Traduzione Frazionaria", + "info": "Sposta il componente figlio tramite la proprietà offset, dove lo spostamento è determinato da OffSet orizzontale e verticale moltiplicato per la dimensione del componente figlio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di FractionalTranslation", + "desc": [ + "【translation】 : Valore di spostamento frazionario 【Offset】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json new file mode 100644 index 00000000..b74f4b4a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "分度オフセット", + "info": "offsetプロパティを使用して子コンポーネントをオフセットします。オフセット量はOffSetの横縦×子コンポーネントのサイズです。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslationの基本使用", + "desc": [ + "【translation】 : オフセット分度値 【Offset】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json new file mode 100644 index 00000000..670b7fc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "분할 오프셋", + "info": "offset 속성을 통해 자식 컴포넌트를 오프셋하며, 오프셋량은 OffSet의 가로 및 세로 * 자식 컴포넌트 크기입니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslation 기본 사용", + "desc": [ + "【translation】 : 오프셋 분할 값 【Offset】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json new file mode 100644 index 00000000..b988006f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Deslocamento Fracionado", + "info": "Desloca o componente filho através da propriedade offset, onde o deslocamento é o tamanho do componente filho multiplicado pelo valor horizontal e vertical do Offset.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FractionalTranslation", + "desc": [ + "【translation】 : Valor de deslocamento fracionado 【Offset】", + "【child】: Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json new file mode 100644 index 00000000..a8e84089 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Дробное смещение", + "info": "Смещение дочернего компонента с помощью свойства offset, величина смещения равна OffSet по горизонтали и вертикали * размер дочернего компонента.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FractionalTranslation", + "desc": [ + "【translation】 : Значение дробного смещения 【Offset】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json new file mode 100644 index 00000000..e04c12b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "分度偏移", + "info": "通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslation基本使用", + "desc": [ + "【translation】 : 偏移分度值 【Offset】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart new file mode 100644 index 00000000..76789681 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class FractionalTranslationDemo extends StatefulWidget { + const FractionalTranslationDemo({Key? key}) : super(key: key); + + @override + _FractionalTranslationDemoState createState() => + _FractionalTranslationDemoState(); +} + +class _FractionalTranslationDemoState extends State { + double dx = 0.0; + double dy = 0.0; + + @override + Widget build(BuildContext context) { + print(dx); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 200, + height: 100, + alignment: Alignment.topLeft, + color: Colors.grey.withAlpha(33), + child: FractionalTranslation( + translation: Offset(dx, dy), + child: const Icon( + Icons.android, + color: Colors.green, + ), + ), + ), + _buildSliderX(), + _buildSliderY() + ], + ); + } + + Widget _buildSliderX() => Slider( + min: -2.0, + max: 10.0, + value: dx, + divisions: 100, + label: 'dx:${dx.toStringAsFixed(1)}', + onChanged: (v) => setState(() => dx = v), + ); + + + Widget _buildSliderY() => Slider( + min: -2.0, + max: 6.0, + value: dy, + divisions: 100, + label: 'dy:${dy.toStringAsFixed(1)}', + onChanged: (v) => setState(() => dy = v), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json new file mode 100644 index 00000000..6b1d6f63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Teilweise Größenbox", + "info": "Kann ein Kindelement aufnehmen, gibt die Breiten- und Höhenanteile an, begrenzt den Bereich des Kindelements auf die Breite und Höhe des Elterncontainers * die jeweiligen Anteile sowie die Ausrichtung alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FractionallySizedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【widthFactor】 : Breitenanteil 【double】", + "【heightFactor】 : Höhenanteil 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json new file mode 100644 index 00000000..f2f27034 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "FractionallySizedBox", + "info": "Can contain a child component, specify width and height fractions, limit the child component area to the parent container's width and height * each fraction, and alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FractionallySizedBox", + "desc": [ + "【child】 : Child component 【Widget】", + "【widthFactor】 : Width fraction 【double】", + "【heightFactor】 : Height fraction 【double】", + "【alignment】 : Alignment 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json new file mode 100644 index 00000000..b78005e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Caja de tamaño fraccional", + "info": "Puede contener un componente hijo, especifica la proporción de ancho y alto, limita el área del componente hijo al ancho y alto del contenedor padre multiplicado por cada proporción, y la alineación.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FractionallySizedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【widthFactor】 : Proporción de ancho 【double】", + "【heightFactor】 : Proporción de alto 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json new file mode 100644 index 00000000..0dc0f2a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Boîte à taille fractionnée", + "info": "Peut contenir un composant enfant, spécifie le taux de largeur et de hauteur, limite la zone du composant enfant à la largeur et à la hauteur du conteneur parent * chaque taux, ainsi que l'alignement.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FractionallySizedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【widthFactor】 : Taux de largeur 【double】", + "【heightFactor】 : Taux de hauteur 【double】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json new file mode 100644 index 00000000..dd2e681f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Scatola a Frazione", + "info": "Può contenere un componente figlio, specifica la frazione di larghezza e altezza, limita l'area del componente figlio alla larghezza e altezza del contenitore padre * ciascuna frazione, e il modo di allineamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di FractionallySizedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【widthFactor】 : Frazione di larghezza 【double】", + "【heightFactor】 : Frazione di altezza 【double】", + "【alignment】 : Modo di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json new file mode 100644 index 00000000..ca0219d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "分率ボックス", + "info": "子コンポーネントを収容し、幅と高さの分率を指定し、子コンポーネントの領域を親コンテナの幅と高さ×各分率に制限し、および配置方法alignmentを指定します。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【widthFactor】 : 幅分率 【double】", + "【heightFactor】 : 高さ分率 【double】", + "【alignment】 : 配置方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json new file mode 100644 index 00000000..a9b98329 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "분율 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, 너비와 높이의 분율을 지정하여 하위 컴포넌트의 영역을 부모 컨테이너의 너비와 높이에 각 분율을 곱한 값으로 제한하고, 정렬 방식을 지정합니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBox 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【widthFactor】 : 너비 분율 【double】", + "【heightFactor】 : 높이 분율 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json new file mode 100644 index 00000000..291294b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Caixa de Tamanho Fracionado", + "info": "Pode conter um componente filho, especifica a taxa de largura e altura, limitando a área do componente filho à largura e altura do contêiner pai * cada taxa, e o alinhamento.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do FractionallySizedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【widthFactor】 : Taxa de largura 【double】", + "【heightFactor】 : Taxa de altura 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json new file mode 100644 index 00000000..65d44be0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Дробный контейнер", + "info": "Может содержать один дочерний компонент, задает дробные значения ширины и высоты, ограничивая область дочернего компонента шириной и высотой родительского контейнера, умноженными на соответствующие дроби, а также способ выравнивания alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FractionallySizedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【widthFactor】 : Дробное значение ширины 【double】", + "【heightFactor】 : Дробное значение высоты 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json new file mode 100644 index 00000000..fd62f807 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "分率盒", + "info": "可容纳一个子组件,指定宽高分率,限定子组件区域为父容器宽高*各分率,及对齐方式alignment。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【widthFactor】 : 宽分率 【double】", + "【heightFactor】 : 高分率 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart new file mode 100644 index 00000000..66b97ef3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomFractionallySizedBox extends StatefulWidget { + const CustomFractionallySizedBox({Key? key}) : super(key: key); + + @override + _CustomFractionallySizedBoxState createState() => + _CustomFractionallySizedBoxState(); +} + +class _CustomFractionallySizedBoxState + extends State { + double _hf = 0.5; + double _wf = 0.4; + + @override + Widget build(BuildContext context) { + Widget box = FractionallySizedBox( + widthFactor: _wf, + heightFactor: _hf, + alignment: Alignment.center, + child: Container(color: Colors.orange), + ); + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + child: box), + _buildSlider() + ], + ); + } + + Widget _buildSlider() => Column( + children: [ + Slider( + divisions: 20, + min: 0.0, + max: 2, + label: '宽分率:' + _wf.toStringAsFixed(1), + value: _wf, + onChanged: (v) => setState(() => _wf = v)), + Slider( + divisions: 20, + min: 0.0, + max: 2, + label: '高分率:' + _hf.toStringAsFixed(1), + value: _hf, + onChanged: (v) => setState(() => _hf = v)), + ], + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json new file mode 100644 index 00000000..05561221 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignoriere Klicks", + "info": "Enthält ein Kind-Widget und kann durch Festlegen der Eigenschaft ignoring entscheiden, ob das Kind Gestenereignisse ignoriert. Es selbst empfängt keine Ereignisse.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IgnorePointer", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【ignoring】 : Ob Ereignisse ignoriert werden sollen 【bool】", + "Wie unten gezeigt, wenn der Switch ausgewählt ist, ist ignoring true, und die Schaltflächenereignisse werden gesperrt und können nicht geklickt werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json new file mode 100644 index 00000000..9c643e1e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignore Click", + "info": "Contains a child component, and it can decide whether the child ignores gesture events by specifying the ignoring property. It does not accept events itself.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IgnorePointer", + "desc": [ + "【child】 : Child component 【Widget】", + "【ignoring】 : Whether to ignore events 【bool】", + "As shown below, when the Switch is selected, ignoring is true, and the button event will be locked and cannot be clicked." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json new file mode 100644 index 00000000..1c1c9c8f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorar clic", + "info": "Contiene un componente hijo, y puede decidir si el hijo ignora los eventos de gestos especificando la propiedad ignoring, mientras que él mismo no acepta eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IgnorePointer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【ignoring】 : Si se ignoran los eventos 【bool】", + "A continuación, cuando el Switch está seleccionado, ignoring es true, y los eventos del botón se bloquearán, no se podrá hacer clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json new file mode 100644 index 00000000..9cf81b6e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorer les clics", + "info": "Contient un composant enfant, et peut décider si l'enfant ignore les événements de geste en spécifiant la propriété ignoring, lui-même n'accepte pas les événements.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IgnorePointer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【ignoring】 : Ignorer les événements 【bool】", + "Comme ci-dessous, lorsque le Switch est sélectionné, ignoring est true, l'événement du bouton sera verrouillé et ne pourra pas être cliqué." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json new file mode 100644 index 00000000..cae053ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignora Clic", + "info": "Contiene un componente figlio e può decidere se il figlio ignora gli eventi del gesto specificando l'attributo ignoring, mentre esso stesso non accetta eventi.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IgnorePointer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【ignoring】 : Se ignorare gli eventi 【bool】", + "Come mostrato di seguito, quando Switch è selezionato, ignoring è true e l'evento del pulsante sarà bloccato, non cliccabile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json new file mode 100644 index 00000000..433c594c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "クリックを無視", + "info": "子コンポーネントを含み、ignoring属性を指定することで、子がジェスチャーイベントを無視するかどうかを決定できます。それ自体はイベントを受け取りません。", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointerの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【ignoring】 : イベントを無視するかどうか 【bool】", + "以下のように、Switchが選択されている場合、ignoringがtrueになり、ボタンイベントがロックされ、クリックできなくなります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json new file mode 100644 index 00000000..15024f6d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "클릭 무시", + "info": "하위 위젯을 포함하며, ignoring 속성을 지정하여 하위 위젯이 제스처 이벤트를 무시할지 여부를 결정할 수 있습니다. 그 자체는 이벤트를 받지 않습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointer 기본 사용법", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【ignoring】 : 이벤트 무시 여부 【bool】", + "아래 예시에서 Switch가 선택되면 ignoring이 true가 되어 버튼 이벤트가 잠기고 클릭할 수 없게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json new file mode 100644 index 00000000..27dfa846 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorar Cliques", + "info": "Contém um componente filho e pode decidir se o filho ignora eventos de gestos especificando o atributo ignoring, ele próprio não aceita eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IgnorePointer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【ignoring】 : Se deve ignorar eventos 【bool】", + "Abaixo, quando o Switch está selecionado, ignoring é true, e o evento do botão será bloqueado, não podendo ser clicado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json new file mode 100644 index 00000000..5acc7320 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Игнорировать клик", + "info": "Содержит дочерний компонент, который может игнорировать жестовые события в зависимости от указанного свойства ignoring, сам по себе не принимает события.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IgnorePointer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【ignoring】 : Игнорировать ли события 【bool】", + "Как показано ниже, когда Switch выбран, ignoring становится true, и события кнопки блокируются, делая её неактивной для кликов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json new file mode 100644 index 00000000..19964c2b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "忽视点击", + "info": "容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身不接受事件。", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【ignoring】 : 是否忽视事件 【bool】", + "如下,Switch选中时ignoring为true,按钮事件将被锁定,无法点击。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart new file mode 100644 index 00000000..699d88a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + + +class CustomIgnorePointer extends StatefulWidget { + const CustomIgnorePointer({Key? key}) : super(key: key); + + @override + _CustomIgnorePointerState createState() => _CustomIgnorePointerState(); +} + +class _CustomIgnorePointerState extends State { + bool _ignore = false; + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + GestureDetector( + onTap: (){ + print('IgnorePointer'); + }, + child: IgnorePointer( + ignoring: _ignore, + child: _buildButton(), + ), + ), + _buildSwitch(), + Text(!_ignore ? '允许点击' : '点击已锁定') + ], + ); + } + + Widget _buildButton() => ElevatedButton( + child: const Text( + 'To About', + style: TextStyle(color: Colors.white), + ), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); + + Widget _buildSwitch() => Switch( + value: _ignore, + onChanged: (v) { + setState(() { + _ignore = v; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json new file mode 100644 index 00000000..03f46e2e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Bildfilter", + "info": "Mit dem ImageFilter-Bildfilter können beliebige Komponenten mit Effekten wie Gaußscher Unschärfe, Farbfiltern, Transformationen usw. verarbeitet werden.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Gaußsche Unschärfe", + "desc": [ + "【imageFilter】 : Bildfilter 【ImageFilter】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Farbeffekt", + "desc": [ + "Farbfilter wird durch das ColorFilter-Objekt implementiert." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Transformationseffekt", + "desc": [ + "Matrix-Transformation durch ImageFilter.matrix-Konstruktion, aber eher unbrauchbar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json new file mode 100644 index 00000000..3501a59e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Image Filter", + "info": "Through the ImageFilter image filter, any component can be processed with special effects, including but not limited to Gaussian blur, color filter, transformation, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Gaussian Blur", + "desc": [ + "【imageFilter】 : Image filter 【ImageFilter】", + "【child】 : Child component 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Color Effect", + "desc": [ + "Achieve color filter through the ColorFilter object." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Transformation Effect", + "desc": [ + "Perform matrix transformation through the ImageFilter.matrix constructor, but it is relatively weak." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json new file mode 100644 index 00000000..66a8d1dd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro de imagen", + "info": "Con el filtro de imagen ImageFilter, se pueden aplicar efectos especiales a cualquier componente, incluyendo pero no limitado a desenfoque gaussiano, filtros de color, transformaciones, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Desenfoque gaussiano ImageFilter", + "desc": [ + "【imageFilter】 : Filtro de imagen 【ImageFilter】", + "【child】 : Componente hijo 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Efecto de filtro de color ImageFilter", + "desc": [ + "Se implementa un filtro de color a través del objeto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Efecto de transformación ImageFilter", + "desc": [ + "Se realiza una transformación de matriz a través de la construcción ImageFilter.matrix, pero es bastante limitado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json new file mode 100644 index 00000000..a9b78902 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtre d'image", + "info": "Avec le filtre d'image ImageFilter, vous pouvez appliquer des effets spéciaux à n'importe quel composant, y compris mais sans s'y limiter, le flou gaussien, les filtres de couleur, les transformations, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Flou Gaussien", + "desc": [ + "【imageFilter】 : Filtre d'image 【ImageFilter】", + "【child】 : Composant enfant 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Effet de Filtre de Couleur", + "desc": [ + "Réalisez un filtre de couleur via l'objet ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Effet de Transformation", + "desc": [ + "Effectuez une transformation matricielle via la construction ImageFilter.matrix, mais c'est assez limité." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json new file mode 100644 index 00000000..49690509 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro Immagine", + "info": "Con il filtro immagine ImageFilter, è possibile applicare effetti speciali a qualsiasi componente, inclusi ma non limitati a sfocatura gaussiana, filtri colore, trasformazioni, ecc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Sfocatura Gaussiana ImageFilter", + "desc": [ + "【imageFilter】 : Filtro immagine 【ImageFilter】", + "【child】 : Componente figlio 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Effetto Filtro Colore ImageFilter", + "desc": [ + "Implementazione del filtro colore tramite l'oggetto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Effetto Trasformazione ImageFilter", + "desc": [ + "Trasformazione della matrice tramite la costruzione ImageFilter.matrix, ma è piuttosto limitata." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json new file mode 100644 index 00000000..53bdef98 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "画像フィルター", + "info": "ImageFilter 画像フィルターを使用すると、任意のコンポーネントに特殊効果を適用できます。これには、ガウスぼかし、カラーフィルター、変形などが含まれます。", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter ガウスぼかし", + "desc": [ + "【imageFilter】 : 画像フィルター 【ImageFilter】", + "【child】 : 子コンポーネント 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter カラーフィルター効果", + "desc": [ + "ColorFilter オブジェクトを使用してカラーフィルターを実現します。" + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 変形効果", + "desc": [ + "ImageFilter.matrix コンストラクタを使用して行列変換を行いますが、あまり役に立ちません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json new file mode 100644 index 00000000..7b4088e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "이미지 필터", + "info": "ImageFilter 이미지 필터를 통해 모든 컴포넌트에 효과를 적용할 수 있습니다. 이는 가우시안 블러, 색상 필터, 변환 등을 포함하지만 이에 국한되지 않습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter 가우시안 블러", + "desc": [ + "【imageFilter】 : 이미지 필터 【ImageFilter】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter 색상 필터 효과", + "desc": [ + "ColorFilter 객체를 통해 색상 필터를 구현합니다." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 변환 효과", + "desc": [ + "ImageFilter.matrix 생성자를 통해 매트릭스 변환을 수행하지만, 다소 실용성이 떨어집니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json new file mode 100644 index 00000000..da190d40 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro de Imagem", + "info": "Com o filtro de imagem ImageFilter, você pode aplicar efeitos especiais a qualquer componente, incluindo, mas não se limitando a, desfoque gaussiano, filtros de cores, transformações, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Desfoque Gaussiano ImageFilter", + "desc": [ + "【imageFilter】 : filtro de imagem 【ImageFilter】", + "【child】 : componente filho 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Efeito de Filtro de Cor ImageFilter", + "desc": [ + "Implementa o filtro de cor através do objeto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Efeito de Transformação ImageFilter", + "desc": [ + "Realiza transformações de matriz através da construção ImageFilter.matrix, mas é um pouco limitado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json new file mode 100644 index 00000000..6a00e147 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Фильтр изображений", + "info": "С помощью фильтра изображений ImageFilter можно применять эффекты к любому компоненту, включая, но не ограничиваясь, размытием по Гауссу, цветовыми фильтрами, преобразованиями и т.д.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter размытие по Гауссу", + "desc": [ + "【imageFilter】 : фильтр изображений 【ImageFilter】", + "【child】 : дочерний компонент 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter цветовой фильтр", + "desc": [ + "Реализация цветового фильтра через объект ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter эффект преобразования", + "desc": [ + "Преобразование матрицы через конструкцию ImageFilter.matrix, но это довольно неудобно." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json new file mode 100644 index 00000000..8e82b476 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "图像滤镜", + "info": "通过 ImageFilter 图像滤镜,可以对任意组件进行特效处理,包括但不限于高斯模糊、颜色滤镜、变换等。", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter 高斯模糊", + "desc": [ + "【imageFilter】 : 图像滤镜 【ImageFilter】", + "【child】 : 子组件 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter 滤色效果", + "desc": [ + "通过 ColorFilter 对象实现颜色滤镜。" + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 变换效果", + "desc": [ + "通过 ImageFilter.matrix 构造,进行矩阵变换,但比较鸡肋。" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart similarity index 92% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart index 738743f7..d6132adc 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart @@ -3,14 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/04/23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 高斯模糊', -// "priority": 1, -// "subtitle": "【imageFilter】 : 图像滤镜 【ImageFilter】\n" -// "【child】 : 子组件 【Widget】", -// } + class ImageFilteredBlur extends StatefulWidget { const ImageFilteredBlur({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart new file mode 100644 index 00000000..0ac1d653 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart @@ -0,0 +1,138 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2022/04/23 +/// contact me by email 1981462002@qq.com + +class ImageFilteredColor extends StatefulWidget { + const ImageFilteredColor({Key? key}) : super(key: key); + + @override + State createState() => _ImageFilteredColorState(); +} + +class _ImageFilteredColorState extends State { + + String _currentFilter = 'srgbToLinear'; + + ColorFilter greyscale = const ColorFilter.matrix([ + 0.2126, 0.7152, 0.0722, 0, 0, + 0.2126, 0.7152, 0.0722, 0, 0, + 0.2126, 0.7152, 0.0722, 0, 0, + 0, 0, 0, 1, 0, + ]); + ColorFilter sepia = const ColorFilter.matrix([ + 0.393, 0.769, 0.189, 0, 0, + 0.349, 0.686, 0.168, 0, 0, + 0.272, 0.534, 0.131, 0, 0, + 0, 0, 0, 1, 0, + ]); + ColorFilter invert = const ColorFilter.matrix([ + -1, 0, 0, 0, 255, + 0, -1, 0, 0, 255, + 0, 0, -1, 0, 255, + 0, 0, 0, 1, 0, + ]); + ColorFilter identity = const ColorFilter.matrix([ + 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, + ]); + + + ColorFilter darken = const ColorFilter.matrix([ + 1,0,0,0,-126.0, + 0,1,0,0,-126.0, + 0,0,1,0,-126.0, + 0,0,0,1,0 + ]); + + ColorFilter light = const ColorFilter.matrix([ + 1,0,0,0,90, + 0,1,0,0,90, + 0,0,1,0,90, + 0,0,0,1,0 + ]); + + late Map filterMap={ + '原图': identity, + 'light': light, + 'darken': darken, + 'greyscale': greyscale, + 'sepia': sepia, + 'invert': invert, + 'srgbToLinear':const ColorFilter.srgbToLinearGamma(), + 'linearToSrgb':const ColorFilter.linearToSrgbGamma(), + }; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ImageFiltered( + imageFilter: filterMap[_currentFilter]??identity, + child: const _TargetContent(), + ), + buildTileModeCheck() + ], + ); + } + + + Widget buildTileModeCheck() => Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Wrap( + children: filterMap.keys.map((e) { + TextStyle style; + if (e == _currentFilter) { + Color color = Theme.of(context).primaryColor; + style = TextStyle(fontWeight: FontWeight.bold, color: color); + } else { + style = const TextStyle( + fontWeight: FontWeight.bold, color: Colors.grey); + } + return GestureDetector( + onTap: () => setState(() => _currentFilter = e), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8,vertical: 2), + child: Text( + e, + style: style, + ), + ), + ); + }).toList(), + ), + ); +} + +class _TargetContent extends StatelessWidget { + const _TargetContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + SizedBox( + height: 150, + width: 150, + child: Image.asset( + 'assets/images/sabar.webp', + fit: BoxFit.cover, + ), + ), + SizedBox( + height: 150, + width: 150, + child: Image.asset( + 'assets/images/wy_200x300.webp', + fit: BoxFit.cover, + ), + ), + ], + ); + } +} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart similarity index 88% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart index 92344b7b..56d9ea89 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart @@ -5,13 +5,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/04/23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 变换效果', -// "priority": 3, -// "subtitle": "通过 ImageFilter.matrix 构造,进行矩阵变换,但比较鸡肋。", -// } + class ImageFilteredMatrix extends StatefulWidget { const ImageFilteredMatrix({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json new file mode 100644 index 00000000..9a0619c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Intrinsische Höhe", + "info": "Eine Komponente, die die Größe ihrer Kindelemente basierend auf deren intrinsischer Höhe anpasst. Sie kann viele Layoutprobleme lösen, ist aber relativ teuer.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IntrinsicHeight", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "Wie im Beispiel: Die Höhe auf der linken Seite ist variabel, die Höhe in der Mitte ist fest, und die Höhe auf der rechten Seite nimmt den höchsten Wert der beiden vorherigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json new file mode 100644 index 00000000..427b01c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Intrinsic Height", + "info": "A component that adjusts the size of its children based on their intrinsic height, which can solve many layout issues, but is relatively expensive.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IntrinsicHeight", + "desc": [ + "【child】: Child component 【Widget】", + "As shown in the example: the height on the left can vary, the height in the middle is fixed, and the height on the right takes the highest value of the previous two." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json new file mode 100644 index 00000000..7bc26a1a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altura intrínseca", + "info": "Un componente que ajusta el tamaño de sus hijos según la altura intrínseca de los elementos hijos, puede resolver muchos problemas de diseño, pero es relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IntrinsicHeight", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "Como en el ejemplo: la altura del lado izquierdo puede variar, la altura del centro es fija, y la altura del lado derecho toma el valor más alto de los dos anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json new file mode 100644 index 00000000..e20b1c23 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Hauteur intrinsèque", + "info": "Un composant qui ajuste la taille de ses enfants en fonction de leur hauteur intrinsèque, résout de nombreux problèmes de mise en page, mais est relativement coûteux.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IntrinsicHeight", + "desc": [ + "【child】 : Enfant 【Widget】", + "Comme dans l'exemple : la hauteur de gauche est variable, la hauteur du milieu est fixe, la hauteur de droite prend la valeur maximale des deux premières." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json new file mode 100644 index 00000000..14ca5a63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altezza intrinseca", + "info": "Un componente che regola le dimensioni dei suoi elementi figli in base all'altezza intrinseca degli elementi figli, risolve molti problemi di layout, ma è relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IntrinsicHeight", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Come nell'esempio: l'altezza a sinistra è variabile, l'altezza al centro è fissa, l'altezza a destra prende il valore più alto dei due precedenti." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json new file mode 100644 index 00000000..cbaaf8df --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "固有高", + "info": "子要素の固有の高さに基づいてその子要素のサイズを調整するコンポーネントで、多くのレイアウトの問題を解決できますが、比較的高価です。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeightの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例: 左側の高さは可変、中央の高さは固定、右側の高さは前2つの最大値を取ります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json new file mode 100644 index 00000000..de0dd7d9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "고유 높이", + "info": "자식 요소의 고유 높이에 따라 자식 요소의 크기를 조정하는 컴포넌트로, 많은 레이아웃 문제를 해결할 수 있지만 상대적으로 비용이 많이 듭니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeight 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "예시: 왼쪽 높이는 변동 가능, 중간 높이는 고정, 오른쪽 높이는 앞 두 개의 최대값을 취합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json new file mode 100644 index 00000000..b0ba3243 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altura Intrínseca", + "info": "Um componente que ajusta o tamanho dos seus filhos com base na altura intrínseca dos elementos filhos, pode resolver muitos problemas de layout, mas é relativamente caro.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IntrinsicHeight", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Como no exemplo: a altura à esquerda pode variar, a altura do meio é fixa, e a altura à direita assume o valor mais alto dos dois anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json new file mode 100644 index 00000000..560076bf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Встроенная высота", + "info": "Компонент, который регулирует размер своих дочерних элементов в зависимости от их собственной высоты, может решить множество проблем с макетом, но относительно дорог.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IntrinsicHeight", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Как в примере: высота слева может изменяться, высота в середине фиксирована, высота справа берет максимальное значение из первых двух." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json new file mode 100644 index 00000000..71305b0a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "固有高", + "info": "根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeight基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart new file mode 100644 index 00000000..68e9dbde --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com + + +class IntrinsicHeightDemo extends StatefulWidget { + const IntrinsicHeightDemo({Key? key}) : super(key: key); + + @override + _IntrinsicHeightDemoState createState() => _IntrinsicHeightDemoState(); +} + +class _IntrinsicHeightDemoState extends State { + double _height =120.0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + buildChild(_height), + const SizedBox(height: 10), + _buildSlider() + ], + ); + } + + Widget buildChild(double leftHeight) { + return IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: leftHeight, + width: 120, + color: Colors.yellow, + alignment: Alignment.center, + child: Text("height:${leftHeight.toStringAsFixed(1)}"), + ), + Container( + color: Colors.blue, + width: 150, + height: 80, + alignment: Alignment.center, + child: const Text("固定高"), + ), + Container( + color: Colors.red, + width: 60, + alignment: Alignment.center, + child: const Text("最高"), + ) + ], + ), + ); + } + + Widget _buildSlider() =>Slider( + value: _height, + max: 200.0, + min: 30.0, + divisions: 17, + onChanged: (v)=> setState(() => _height= v), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json new file mode 100644 index 00000000..441cf9af --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Intrinsische Breite", + "info": "Eine Komponente, die die Größe ihrer Kinder basierend auf deren intrinsischer Breite anpasst, kann viele Layoutprobleme lösen, ist jedoch relativ teuer.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IntrinsicWidth", + "desc": [ + "【child】: Kindkomponente 【Widget】", + "Wie im Beispiel: Die Breite oben kann variieren, die Breite in der Mitte ist fest, und die Breite unten nimmt den höchsten Wert der beiden vorherigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json new file mode 100644 index 00000000..9b103bc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Intrinsic Width", + "info": "A component that adjusts the size of its child elements based on their intrinsic width, which can solve many layout issues but is relatively expensive.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IntrinsicWidth", + "desc": [ + "【child】: Child component 【Widget】", + "As shown in the example: the width above can be changed, the width in the middle is fixed, and the width below takes the highest value of the former two." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json new file mode 100644 index 00000000..4db7a69f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Ancho intrínseco", + "info": "Componente que ajusta el tamaño de sus elementos secundarios según el ancho intrínseco de los mismos, puede resolver muchos problemas de diseño, pero es relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IntrinsicWidth", + "desc": [ + "【child】 : Componente secundario 【Widget】", + "Como en el ejemplo: el ancho de arriba puede variar, el ancho del medio es fijo, el ancho de abajo toma el valor más alto de los dos anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json new file mode 100644 index 00000000..1b96204e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Largeur intrinsèque", + "info": "Un composant qui ajuste la taille de ses enfants en fonction de leur largeur intrinsèque, résout de nombreux problèmes de mise en page, mais est relativement coûteux.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IntrinsicWidth", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Comme dans l'exemple : la largeur du haut peut varier, celle du milieu est fixe, et celle du bas prend la valeur maximale des deux précédentes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json new file mode 100644 index 00000000..91edb57c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Larghezza intrinseca", + "info": "Un componente che regola le dimensioni dei suoi elementi figli in base alla larghezza intrinseca degli elementi figli, risolve molti problemi di layout, ma è relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IntrinsicWidth", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Come nell'esempio: la larghezza superiore è variabile, quella centrale è fissa, quella inferiore prende il valore più alto tra le prime due." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json new file mode 100644 index 00000000..eecce94f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "固有幅", + "info": "子要素の固有の幅に基づいて子要素のサイズを調整するコンポーネントで、多くのレイアウトの問題を解決できますが、比較的高コストです。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidthの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例: 上の幅は可変、中間の幅は固定、下の幅は前2つの最大値を取ります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json new file mode 100644 index 00000000..a0fd16f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "고유 너비", + "info": "자식 요소의 고유 너비에 따라 크기를 조정하는 컴포넌트로, 많은 레이아웃 문제를 해결할 수 있지만 상대적으로 비용이 많이 듭니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidth 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "예시: 위쪽 너비는 변동 가능, 중간 너비는 고정, 아래쪽 너비는 앞 두 값 중 최대값을 취합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json new file mode 100644 index 00000000..908e1280 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Largura Intrínseca", + "info": "Componente que ajusta o tamanho dos seus elementos filhos com base na largura intrínseca dos mesmos, resolvendo muitos problemas de layout, mas relativamente caro.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IntrinsicWidth", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Como no exemplo: a largura acima pode variar, a largura do meio é fixa, e a largura abaixo assume o valor mais alto dos dois anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json new file mode 100644 index 00000000..af6625d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Встроенная ширина", + "info": "Компонент, который регулирует размер своих дочерних элементов в зависимости от их внутренней ширины, решает множество проблем с макетом, но относительно дорогостоящий.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IntrinsicWidth", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Как в примере: ширина сверху может изменяться, ширина в середине фиксирована, ширина снизу принимает максимальное значение из первых двух." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json new file mode 100644 index 00000000..7bce5535 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "固有宽", + "info": "根据子元素的固有宽度度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidth基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart new file mode 100644 index 00000000..823cdb9d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com + + +class IntrinsicWidthDemo extends StatefulWidget { + const IntrinsicWidthDemo({Key? key}) : super(key: key); + + @override + _IntrinsicWidthDemoState createState() => _IntrinsicWidthDemoState(); +} + +class _IntrinsicWidthDemoState extends State { + double _height =120.0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + buildChild(_height), + const SizedBox(height: 10), + _buildSlider() + ], + ); + } + + Widget buildChild(double leftWidth) { + return IntrinsicWidth( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 50, + width: leftWidth, + color: Colors.yellow, + alignment: Alignment.center, + child: Text("width:${leftWidth.toStringAsFixed(1)}"), + ), + Container( + color: Colors.blue, + width: 150, + height: 60, + alignment: Alignment.center, + child: const Text("固定宽"), + ), + Container( + color: Colors.red, + height: 40, + alignment: Alignment.center, + child: const Text("最宽"), + ) + ], + ), + ); + } + + Widget _buildSlider() =>Slider( + value: _height, + max: 200.0, + min: 80.0, + divisions: 17, + onChanged: (v)=> setState(() => _height= v), + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json new file mode 100644 index 00000000..a084cd4f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Layout-Builder", + "info": "Kann die Größe des übergeordneten Containers erkennen und eine benutzerdefinierte Layout basierend auf den Abmessungen des übergeordneten Containers erstellen. Es ist ein sehr nützliches Layout-Komponente.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegendes Verständnis von LayoutBuilder", + "desc": [ + "【builder】: Layout-Builder 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Anpassungsfähiges Layout von LayoutBuilder", + "desc": [ + "Kann das Design der Komponentenanzeige basierend auf der Größe des Bereichs durchführen.", + "Zum Beispiel können unterschiedliche Layout-Strukturen in verschiedenen Breitenbereichen angezeigt werden.", + "Schließlich ist es an vielen Stellen nicht einfach, den Bereich der übergeordneten Komponente zu erhalten, und die Verwendung von LayoutBuilder wird sehr angenehm sein." + ] + }, + { + "file": "node3_expend.dart", + "name": "Erweiterte Verwendung von LayoutBuilder", + "desc": [ + "Verwenden Sie TextPainter, um die Anzahl der Textzeilen zu überprüfen und die Funktion zum Erweitern oder Reduzieren zu implementieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json new file mode 100644 index 00000000..266ade59 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Layout Constructor", + "info": "Can detect the size of the parent container and complete custom layouts based on the size information of the parent container. It is a very practical layout component.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Understanding of LayoutBuilder", + "desc": [ + "【builder】: Layout Constructor 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptive Layout of LayoutBuilder", + "desc": [ + "Can design component display based on the size of the area.", + "For example, displaying different layout structures in different width areas.", + "After all, it is not easy to obtain the parent component area in many places, and using LayoutBuilder will be very refreshing." + ] + }, + { + "file": "node3_expend.dart", + "name": "Expanded Use of LayoutBuilder", + "desc": [ + "Use TextPainter to detect the number of lines of text to implement expand or collapse functionality." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json new file mode 100644 index 00000000..e88b9cec --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Constructor de diseño", + "info": "Puede detectar el tamaño del área del contenedor padre y completar el diseño personalizado según la información de tamaño del contenedor padre. Es un componente de diseño muy práctico.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conocimiento básico de LayoutBuilder", + "desc": [ + "【builder】: Constructor de diseño 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptación de diseño de LayoutBuilder", + "desc": [ + "Puede diseñar la presentación de componentes según el tamaño del área.", + "Por ejemplo, mostrar diferentes estructuras de diseño en áreas de diferentes anchos.", + "Después de todo, en muchos lugares no es fácil obtener el área del componente padre, y usar LayoutBuilder será muy útil." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso extendido de LayoutBuilder", + "desc": [ + "Usar TextPainter para detectar el número de líneas de texto y lograr la función de expandir o contraer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json new file mode 100644 index 00000000..24c1445f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Constructeur de mise en page", + "info": "Peut détecter la taille de la zone du conteneur parent et compléter la mise en page personnalisée en fonction des informations de taille du conteneur parent. C'est un composant de mise en page très pratique.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Connaissance de base de LayoutBuilder", + "desc": [ + "【builder】 : Constructeur de mise en page 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptation de la mise en page de LayoutBuilder", + "desc": [ + "Peut concevoir l'affichage des composants en fonction de la taille de la zone.", + "Par exemple, afficher différentes structures de mise en page dans des zones de largeur différente.", + "Après tout, il n'est pas facile d'obtenir la zone du composant parent dans de nombreux endroits, l'utilisation de LayoutBuilder sera très agréable." + ] + }, + { + "file": "node3_expend.dart", + "name": "Utilisation étendue de LayoutBuilder", + "desc": [ + "Utilisez TextPainter pour détecter le nombre de lignes de texte et implémenter la fonction d'expansion ou de réduction." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json new file mode 100644 index 00000000..c1ac0694 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Costruttore di layout", + "info": "Può rilevare le dimensioni dell'area del contenitore padre e completare il layout personalizzato in base alle informazioni sulle dimensioni del contenitore padre. È un componente di layout molto pratico.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conoscenza di base di LayoutBuilder", + "desc": [ + "【builder】: Costruttore di layout 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adattamento del layout di LayoutBuilder", + "desc": [ + "È possibile progettare la visualizzazione dei componenti in base alle dimensioni dell'area.", + "Ad esempio, mostrare diverse strutture di layout in aree di larghezza diversa.", + "Dopotutto, in molti posti non è facile ottenere l'area del componente padre, usare LayoutBuilder sarà molto utile." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso esteso di LayoutBuilder", + "desc": [ + "Usa TextPainter per rilevare il numero di righe del testo e implementare la funzione di espansione o di chiusura." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json new file mode 100644 index 00000000..2e7598ac --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "レイアウトビルダー", + "info": "親コンテナの領域サイズを検出し、親コンテナのサイズ情報に基づいてカスタムレイアウトを完成させることができます。非常に実用的なレイアウトコンポーネントです。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilderの基本認識", + "desc": [ + "【builder】 : レイアウトビルダー 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilderの適応レイアウト", + "desc": [ + "領域のサイズに基づいてコンポーネントの表示デザインを行うことができます。\"", + "たとえば、異なる幅の領域で異なるレイアウト構造を表示します。\"", + "結局のところ、多くの場所で親コンポーネントの領域を取得するのは容易ではなく、LayoutBuilderを使用すると非常に便利です。" + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilderの展開使用", + "desc": [ + "TextPainterを使用してテキストの行数を検出し、展開または折りたたみ機能を実装します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json new file mode 100644 index 00000000..ace16c97 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "레이아웃 빌더", + "info": "부모 컨테이너의 영역 크기를 감지하고, 부모 컨테이너의 크기 정보를 기반으로 사용자 정의 레이아웃을 완성할 수 있습니다. 매우 실용적인 레이아웃 구성 요소입니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilder 기본 이해", + "desc": [ + "【builder】 : 레이아웃 빌더 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilder의 적응형 레이아웃", + "desc": [ + "영역의 크기에 따라 컴포넌트 디스플레이를 설계할 수 있습니다.", + "예를 들어, 다른 너비 영역에서 다른 레이아웃 구조를 표시할 수 있습니다.", + "결국 많은 곳에서 부모 컴포넌트 영역을 쉽게 얻을 수 없기 때문에 LayoutBuilder를 사용하면 매우 편리합니다." + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilder의 확장 사용", + "desc": [ + "TextPainter를 사용하여 텍스트의 줄 수를 감지하고, 확장 또는 축소 기능을 구현합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json new file mode 100644 index 00000000..5c983efd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Construtor de Layout", + "info": "Pode detectar o tamanho da área do contêiner pai e completar o layout personalizado de acordo com as informações de dimensão do contêiner pai. É um componente de layout muito útil.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conhecimento Básico do LayoutBuilder", + "desc": [ + "【builder】 : Construtor de Layout 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptação de Layout do LayoutBuilder", + "desc": [ + "Pode projetar a exibição dos componentes de acordo com o tamanho da área.", + "Por exemplo, exibir diferentes estruturas de layout em áreas de diferentes larguras.", + "Afinal, em muitos lugares não é fácil obter a área do componente pai, usar o LayoutBuilder será muito conveniente." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso Expandido do LayoutBuilder", + "desc": [ + "Usar TextPainter para detectar o número de linhas de texto e implementar a função de expandir ou recolher." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json new file mode 100644 index 00000000..a0fa492e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Конструктор макета", + "info": "Может обнаружить размер области родительского контейнера и выполнить пользовательский макет на основе информации о размере родительского контейнера. Это очень полезный компонент макета.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное понимание LayoutBuilder", + "desc": [ + "【builder】 : Конструктор макета 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Адаптация макета LayoutBuilder", + "desc": [ + "Можно проектировать отображение компонентов в зависимости от размера области.", + "Например, отображать различные структуры макета в областях с разной шириной.", + "Ведь во многих местах нелегко получить область родительского компонента, и использование LayoutBuilder будет очень удобным." + ] + }, + { + "file": "node3_expend.dart", + "name": "Расширенное использование LayoutBuilder", + "desc": [ + "Использование TextPainter для обнаружения количества строк текста и реализации функции развертывания или сворачивания." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json new file mode 100644 index 00000000..2763c28d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "布局构造器", + "info": "可以检测到父容器的区域大小,并根据父容器的尺寸信息可以完成自定义布局。是一个非常实用的布局组件。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilder基本认识", + "desc": [ + "【builder】 : 布局构造器 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilder的适应布局", + "desc": [ + "可以根据区域的大小进行组件展示设计。\"", + "比如在不同的宽度区域显示不同的布局结构。\"", + "毕竟很多地方不容易获取父组件区域,使用LayoutBuilder就会非常爽口。" + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilder的展开使用", + "desc": [ + "使用TextPainter来检测文字的行数,实现展开或收起功能。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart new file mode 100644 index 00000000..367af2cf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomLayoutBuilder extends StatelessWidget { + const CustomLayoutBuilder({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + print('CustomLayoutBuild'); + return Container( + alignment: Alignment.center, + height: 80, + width: 150, + color: Colors.green, + child: LayoutBuilder( + builder: (_, zone) { + return Text( + '父容器宽:${zone.maxWidth}\n' + '父容器高:${zone.maxHeight}', + style: const TextStyle(color: Colors.white, fontSize: 16), + ); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart new file mode 100644 index 00000000..118b09eb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + + +class FitByLayoutBuilder extends StatefulWidget { + const FitByLayoutBuilder({Key? key}) : super(key: key); + + @override + _FitByLayoutBuilderState createState() => _FitByLayoutBuilderState(); +} + +class _FitByLayoutBuilderState extends State { + double _width = 100; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + SizedBox( + width: _width, + child: LayoutBuilder( + builder: (_, zone) { + if (zone.maxWidth <= 150) { + return _buildType1(); + } else { + return _buildType2(zone); + } + }, + ), + ), + _buildSlider(), + ], + ); + } + + Widget _buildSlider() => Slider( + min: 50, + max: 300, + label: "父宽:${_width.toStringAsFixed(1)}", + value: _width, + onChanged: (v) => setState(() { + _width = v; + })); + + Widget _buildType1() => Container( + color: Colors.blue, + child: Column( + children: [ + _buildTitle(), + Padding( + padding: const EdgeInsets.all(8.0), + child: _buildContent(), + ), + ], + ), + ); + + Widget _buildType2(BoxConstraints zone) => Container( + height: 100, + width: zone.maxWidth, + color: Colors.orange, + child: Row( + children: [ + Container( + margin: const EdgeInsets.all(10), + height: 80, + width: 30, + color: Colors.grey, + ), + Expanded(child: _buildContent()) + ], + ), + ); + + Widget _buildTitle() => Container( + margin: const EdgeInsets.only(left: 10, right: 10, top: 10), + color: Colors.grey, + height: 30, + ); + + Widget _buildContent() => Wrap( + runSpacing: 3, + children: [ + Container( + color: Colors.red, + height: 30, + ), + Container( + color: Colors.yellow, + height: 30, + ), + Container( + color: Colors.green, + height: 30, + ), + ], + ); +} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart similarity index 91% rename from packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart index 40921327..33c13c01 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 287, -// "name": 'LayoutBuilder的展开使用', -// "priority": 3, -// "subtitle": "使用TextPainter来检测文字的行数,实现展开或收起功能。", -// } + class SimpleExpandableText extends StatefulWidget { const SimpleExpandableText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json new file mode 100644 index 00000000..658010b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Begrenzungsbox", + "info": "Kann ein Unterelement aufnehmen und den Bereich des Unterelements durch Angabe der maximalen Breite und Höhe begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LimitedBox", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json new file mode 100644 index 00000000..0fa69576 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Limited Box", + "info": "Can contain one child component, limiting the area where the child component can reside by specifying the maximum width and height.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LimitedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【maxHeight】: Maximum height 【double】", + "【maxWidth】: Maximum width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json new file mode 100644 index 00000000..3558aa47 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Caja Limitada", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y alto máximos.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LimitedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json new file mode 100644 index 00000000..99cb8f71 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Boîte limitée", + "info": "Peut contenir un composant enfant, en limitant la zone de ce composant par une largeur et une hauteur maximales spécifiées.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LimitedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json new file mode 100644 index 00000000..61900467 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Scatola Limitata", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando l'altezza e la larghezza massime.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di LimitedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json new file mode 100644 index 00000000..2bb36c0b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "制限ボックス", + "info": "子コンポーネントを1つ収容でき、最大幅と高さを指定して子コンポーネントの収容領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBoxの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json new file mode 100644 index 00000000..6123b09c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "제한 상자", + "info": "하나의 하위 구성 요소를 수용할 수 있으며, 최대 너비와 높이를 지정하여 하위 구성 요소의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox 기본 사용", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json new file mode 100644 index 00000000..a84a0299 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Caixa Limitada", + "info": "Pode conter um componente filho, limitando a área onde o componente filho pode residir, especificando a largura e altura máximas.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LimitedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json new file mode 100644 index 00000000..5ac51440 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Ограничивающая коробка", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента путем указания максимальной ширины и высоты.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LimitedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json new file mode 100644 index 00000000..0aa3bf62 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "限制盒", + "info": "可容纳一个子组件,通过指定最大宽高来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart new file mode 100644 index 00000000..47173673 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomLimitedBox extends StatefulWidget { + const CustomLimitedBox({Key? key}) : super(key: key); + + @override + _CustomLimitedBoxState createState() => _CustomLimitedBoxState(); +} + +class _CustomLimitedBoxState extends State { + String _text = ''; + + @override + Widget build(BuildContext context) { + Widget child = Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 50, + height: 50, + child: const Text("Static"), + ); + + Widget box = LimitedBox( + maxHeight: 60, + maxWidth: 100, + child: Container(color: Colors.orange, child: Text(_text)), + ); + + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(22), + width: 300, + height: 100, + child: Row( + children: [child, UnconstrainedBox(child: box), child], + ), + ), + _buildInput() + ], + ); + } + + Widget _buildInput() { + return Padding( + padding: const EdgeInsets.all(18.0), + child: TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: '请输入', + ), + onChanged: (v) { + setState(() { + _text = v; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json new file mode 100644 index 00000000..a4346c4e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Verschwindende Komponente", + "info": "Kann eine Unterkomponente aufnehmen und deren Verschwinden ändern. Das Attribut offstage auf true bedeutet versteckt.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LimitedBox", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【offstage】 : Ob verschwunden 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json new file mode 100644 index 00000000..23e3c8ea --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Disappearing Component", + "info": "Can contain a child component, and can change its visibility. The offstage property set to true means hidden.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LimitedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【offstage】: Whether to disappear 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json new file mode 100644 index 00000000..7639fe92 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Desaparecido", + "info": "Puede contener un componente hijo y cambiar su visibilidad. Si la propiedad offstage es true, indica que está oculto.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LimitedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【offstage】 : Si está desaparecido 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json new file mode 100644 index 00000000..491cda0f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Composant disparu", + "info": "Peut contenir un composant enfant et peut modifier sa disparition ou non. L'attribut offstage à true signifie qu'il est caché.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LimitedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【offstage】 : Disparaît ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json new file mode 100644 index 00000000..ab1d8569 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Scomparso", + "info": "Può contenere un componente figlio e può cambiarne la visibilità. L'attributo offstage è true per indicare che è nascosto.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di LimitedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【offstage】 : Se è nascosto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json new file mode 100644 index 00000000..4dd62d85 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "非表示コンポーネント", + "info": "1つの子コンポーネントを収容でき、その表示・非表示を変更できます。offstage属性がtrueの場合、非表示になります。", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBoxの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【offstage】 : 非表示かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json new file mode 100644 index 00000000..fb751e28 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "사라진 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 그 컴포넌트의 사라짐 여부를 변경할 수 있습니다. offstage 속성이 true이면 숨겨집니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【offstage】 : 사라짐 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json new file mode 100644 index 00000000..475ec95a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Desaparecido", + "info": "Pode conter um componente filho e alterar a sua visibilidade. A propriedade offstage é true para ocultar.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LimitedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【offstage】 : Se desaparece 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json new file mode 100644 index 00000000..9f3af1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Исчезающий компонент", + "info": "Может содержать один дочерний компонент, можно изменить его видимость. Свойство offstage, равное true, означает скрытие.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LimitedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【offstage】 : Видимость 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json new file mode 100644 index 00000000..17c804f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "消失组件", + "info": "可容纳一个子组件,可更改其的消失与否。offstage属性为true表示隐藏。", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【offstage】 : 是否消失 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart new file mode 100644 index 00000000..ca83cc16 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomOffstage extends StatefulWidget { + const CustomOffstage({Key? key}) : super(key: key); + + @override + _CustomOffstageState createState() => _CustomOffstageState(); +} + +class _CustomOffstageState extends State { + bool _off = false; + + @override + Widget build(BuildContext context) { + Widget radBox = Container( + height: 50, + width: 60, + color: Colors.red, + child: Switch( + value: _off, + onChanged: (v) => setState(() => _off = v)), + ); + + return SizedBox( + width: 250, + height: 200, + child: Row( + children: [radBox, _buildOffStage(), radBox], + ), + ); + } + + Widget _buildOffStage() => Offstage( + offstage: _off, + child: Container( + alignment: Alignment.center, + height: 100, + width: 100, + color: Colors.blue, + child: const Text( + "Offstage", + style: TextStyle(fontSize: 20), + ), + )); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json new file mode 100644 index 00000000..ca1011dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparenz", + "info": "Kann ein Kindelement aufnehmen und dessen Transparenz in den Opazitätswert ändern, Opazität liegt zwischen 0 und 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Opacity", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【opacity】 : Transparenz 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json new file mode 100644 index 00000000..352c2e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparency", + "info": "Can contain a child component, changing its transparency to the opacity value, where opacity is between 0 and 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Opacity", + "desc": [ + "【child】 : Child component 【Widget】", + "【opacity】 : Transparency 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json new file mode 100644 index 00000000..f8028eca --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparencia", + "info": "Puede contener un componente hijo y cambiar su transparencia al valor de opacity, donde opacity está entre 0 y 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Opacity", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【opacity】 : Transparencia 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json new file mode 100644 index 00000000..0a1e98d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Opacité", + "info": "Peut contenir un composant enfant, transformant sa transparence en valeur d'opacité, l'opacité est comprise entre 0 et 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Opacity", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【opacity】 : Opacité 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json new file mode 100644 index 00000000..d5191899 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Trasparenza", + "info": "Può contenere un componente figlio, trasformandone la trasparenza in un valore di opacità, dove l'opacità è compresa tra 0 e 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Opacity", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【opacity】 : Trasparenza 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json new file mode 100644 index 00000000..cf759bb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "不透明度", + "info": "子コンポーネントを1つ収容し、その不透明度をopacity値に変更できます。opacityは0〜1の間です。", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacityの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【opacity】 : 不透明度0〜1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json new file mode 100644 index 00000000..41a13f67 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "투명도", + "info": "하위 컴포넌트를 포함할 수 있으며, 그 투명도를 opacity 값으로 변경합니다. opacity는 0~1 사이입니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacity 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【opacity】 : 투명도 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json new file mode 100644 index 00000000..faafe027 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Opacidade", + "info": "Pode conter um componente filho, alterando a sua opacidade para o valor de opacity, onde opacity está entre 0 e 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Opacity", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【opacity】 : Opacidade 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json new file mode 100644 index 00000000..19a9bc74 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Прозрачность", + "info": "Может содержать один дочерний компонент, изменяя его прозрачность на значение opacity, где opacity находится в диапазоне от 0 до 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Opacity", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【opacity】 : Прозрачность 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json new file mode 100644 index 00000000..9f558e9c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "透明化", + "info": "可容纳一个子组件,将其透明度变为opacity值, opacity在0~1之间。", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacity基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【opacity】 : 透明度0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart new file mode 100644 index 00000000..798c891c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomOpacity extends StatefulWidget { + const CustomOpacity({Key? key}) : super(key: key); + + @override + _CustomOpacityState createState() => _CustomOpacityState(); +} + +class _CustomOpacityState extends State { + double _opacity = 0.2; + + @override + Widget build(BuildContext context) { + return Column( + children: [_buildSlider(), _buildOpacity()], + ); + } + + // 创建Opacity + Widget _buildOpacity() => Opacity( + opacity: _opacity, + child: Image.asset(// 图片 + 'assets/images/icon_head.webp', + width: 100, + ), + ); + Widget _buildSlider() => Slider( + divisions: 20, + label: _opacity.toString(), + value: _opacity, + onChanged: (v) => setState(() => _opacity = v)); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json new file mode 100644 index 00000000..f8e35218 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Überlaufbox", + "info": "Kann ein Kindelement aufnehmen, und das Kindelement darf den Bereich des Elternelements überlaufen. Es kann der maximale und minimale Bereich für Breite und Höhe festgelegt werden und verfügt über eine Ausrichtungseigenschaft alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OverflowBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【minWidth】 : Minimale Breite 【double】", + "【minHeight】 : Minimale Höhe 【double】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json new file mode 100644 index 00000000..decab995 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Overflow Box", + "info": "Can contain a child component, and the child component is allowed to overflow the parent component area. The maximum and minimum width and height can be specified for constraints, and it has the alignment property.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OverflowBox", + "desc": [ + "【child】: Child component 【Widget】", + "【minWidth】: Minimum width 【double】", + "【minHeight】: Minimum height 【double】", + "【maxHeight】: Maximum height 【double】", + "【maxWidth】: Maximum width 【double】", + "【alignment】: Alignment 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json new file mode 100644 index 00000000..109703b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Caja de desbordamiento", + "info": "Puede contener un componente hijo, y el componente hijo puede desbordar el área del componente padre. Se pueden especificar áreas máximas y mínimas de ancho y alto para limitar, y tiene la propiedad de alineación alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OverflowBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【minWidth】 : Ancho mínimo 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json new file mode 100644 index 00000000..25b95564 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Boîte de débordement", + "info": "Peut contenir un composant enfant, et le composant enfant est autorisé à déborder de la zone du composant parent. Il est possible de spécifier les zones maximales et minimales de largeur et de hauteur pour les limiter, et il possède une propriété d'alignement.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de OverflowBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【minWidth】 : Largeur minimale 【double】", + "【minHeight】 : Hauteur minimale 【double】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json new file mode 100644 index 00000000..ca94efd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Scatola di overflow", + "info": "Può contenere un componente figlio e consente al componente figlio di fuoriuscire dall'area del componente padre. È possibile specificare le aree massime e minime di larghezza e altezza per i limiti e ha la proprietà di allineamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di OverflowBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【minWidth】 : Larghezza minima 【double】", + "【minHeight】 : Altezza minima 【double】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json new file mode 100644 index 00000000..28db137c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "オーバーフローボックス", + "info": "子コンポーネントを収容でき、子コンポーネントは親コンポーネントの領域をオーバーフローすることができます。幅と高さの最大最小領域を指定して制限することができ、アライメント属性alignmentを持っています。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBoxの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【minWidth】 : 最小幅 【double】", + "【minHeight】 : 最小高さ 【double】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】", + "【alignment】 : アライメント方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json new file mode 100644 index 00000000..1d253a68 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "오버플로우 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, 하위 컴포넌트가 상위 컴포넌트 영역을 벗어날 수 있습니다. 최소 및 최대 너비와 높이를 지정하여 제한할 수 있으며, 정렬 속성 alignment를 가지고 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【minWidth】 : 최소 너비 【double】", + "【minHeight】 : 최소 높이 【double】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json new file mode 100644 index 00000000..12e6d9b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Caixa de Transbordamento", + "info": "Pode conter um componente filho, e o componente filho pode transbordar a área do componente pai. Pode especificar as áreas mínimas e máximas de largura e altura para restringir, e possui o atributo de alinhamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do OverflowBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【minWidth】 : Largura mínima 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json new file mode 100644 index 00000000..919e4dfe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Переполненная коробка", + "info": "Может содержать один дочерний компонент, и дочерний компонент может выходить за пределы области родительского компонента. Можно указать минимальные и максимальные области ширины и высоты для ограничения, имеет свойство выравнивания alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OverflowBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【minWidth】 : Минимальная ширина 【double】", + "【minHeight】 : Минимальная высота 【double】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json new file mode 100644 index 00000000..c3c55dc8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "溢出盒", + "info": "可容纳一个子组件,且子组件允许溢出父组件区域,可以指定宽高的最大最小区域进行限定,拥有对齐属性alignment。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【minWidth】 : 最小宽 【double】", + "【minHeight】 : 最小高 【double】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart new file mode 100644 index 00000000..cbca2dea --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomOverflowBox extends StatefulWidget { + const CustomOverflowBox({Key? key}) : super(key: key); + + @override + _CustomOverflowBoxState createState() => _CustomOverflowBoxState(); +} + +class _CustomOverflowBoxState extends State { + String _text = ''; + + @override + Widget build(BuildContext context) { + Widget box = OverflowBox( + alignment: Alignment.center, + minHeight: 50, + minWidth: 50, + maxWidth: 200, + maxHeight: 120, + child: Container( + color: Colors.orange, + child: Text(_text), + ), + ); + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(33), + width: 100, + height: 100, + child: box), + _buildInput() + ], + ); + } + + Widget _buildInput() { + return Padding( + padding: const EdgeInsets.all(18.0), + child: TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: '请输入', + ), + onChanged: (v) { + setState(() { + _text = v; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json new file mode 100644 index 00000000..510451de --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Abstandskomponente", + "info": "Kann ein Kindelement aufnehmen und fügt seinen eigenen Innenabstand hinzu, um den Platz des Kindelements zu begrenzen. Die Kerneigenschaft ist padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding gleicher Abstand auf allen Seiten", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【padding】 : Innenabstand auf allen vier Seiten 【EdgeInsetsGeometry】", + "EdgeInsets.all wird verwendet, um den gleichen Abstand auf allen vier Seiten festzulegen" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding einzelner Abstand", + "desc": [ + "EdgeInsets.only wird verwendet, um den gleichen Abstand auf allen vier Seiten festzulegen" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding Richtungsabstand", + "desc": [ + "EdgeInsets.symmetric wird verwendet, um den horizontalen und vertikalen Abstand festzulegen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json new file mode 100644 index 00000000..e5dd8395 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Margin Component", + "info": "Can accommodate a child component, adding its own padding to limit the child component's placement. The core property is padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding Equal Margin on All Sides", + "desc": [ + "【child】: Child component 【Widget】", + "【padding】: Inner four-sided margin 【EdgeInsetsGeometry】", + "EdgeInsets.all is used to define the same margin on all four sides" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding Individual Margin", + "desc": [ + "EdgeInsets.only is used to define the same margin on all four sides" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding Directional Margin", + "desc": [ + "EdgeInsets.symmetric is used to define horizontal and vertical margins" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json new file mode 100644 index 00000000..754298f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente de margen", + "info": "Puede contener un componente hijo, agregando su propio relleno interno para limitar el espacio ocupado por el componente hijo, la propiedad principal es el padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding con márgenes iguales en los cuatro lados", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno en los cuatro lados 【EdgeInsetsGeometry】", + "EdgeInsets.all se utiliza para definir el mismo margen en los cuatro lados" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding con márgenes individuales", + "desc": [ + "EdgeInsets.only se utiliza para definir márgenes específicos en los cuatro lados" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding con márgenes direccionales", + "desc": [ + "EdgeInsets.symmetric se utiliza para definir márgenes en las direcciones horizontal y vertical" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json new file mode 100644 index 00000000..f840c12e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Composant de marge", + "info": "Peut contenir un composant enfant, ajoute une marge intérieure pour limiter l'espace occupé par le composant enfant, la propriété principale est padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding avec marge égale sur les quatre côtés", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure sur les quatre côtés 【EdgeInsetsGeometry】", + "EdgeInsets.all est utilisé pour définir une marge égale sur les quatre côtés" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding avec marge individuelle", + "desc": [ + "EdgeInsets.only est utilisé pour définir une marge individuelle sur les quatre côtés" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding avec marge directionnelle", + "desc": [ + "EdgeInsets.symmetric est utilisé pour définir une marge horizontale et verticale" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json new file mode 100644 index 00000000..4dc40d3a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente margine", + "info": "Può contenere un componente figlio, aggiungendo il proprio padding interno per limitare il posizionamento del componente figlio, la proprietà principale è padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding margine uguale su tutti i lati", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【padding】 : margine interno su tutti i lati 【EdgeInsetsGeometry】\"", + "EdgeInsets.all viene utilizzato per definire lo stesso margine su tutti i lati" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding margine singolo", + "desc": [ + "EdgeInsets.only viene utilizzato per definire lo stesso margine su tutti i lati" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding margine direzionale", + "desc": [ + "EdgeInsets.symmetric viene utilizzato per definire i margini orizzontali e verticali" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json new file mode 100644 index 00000000..d4009c66 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "余白コンポーネント", + "info": "一つの子コンポーネントを収容し、自身の内側の余白を追加して子コンポーネントの占めるスペースを制限します。コア属性はpaddingです。", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding四面等余白", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の四辺の余白 【EdgeInsetsGeometry】", + "EdgeInsets.allは同じ四辺の余白を制限するために使用されます" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding単独余白", + "desc": [ + "EdgeInsets.onlyは同じ四辺の余白を制限するために使用されます" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding方向余白", + "desc": [ + "EdgeInsets.symmetricは水平方向と垂直方向の余白を制限するために使用されます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json new file mode 100644 index 00000000..bfa917b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "여백 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 자체 내부 여백을 추가하여 자식 컴포넌트의 공간을 제한합니다. 핵심 속성은 padding입니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding 사면 동일 여백", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 내부 사면 여백 【EdgeInsetsGeometry】\"", + "EdgeInsets.all은 동일한 사면 여백을 지정하는 데 사용됩니다." + ] + }, + { + "file": "node2_only.dart", + "name": "Padding 개별 여백", + "desc": [ + "EdgeInsets.only는 동일한 사면 여백을 지정하는 데 사용됩니다." + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding 방향 여백", + "desc": [ + "EdgeInsets.symmetric는 수평 및 수직 방향의 여백을 지정하는 데 사용됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json new file mode 100644 index 00000000..185dc4cf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente de Margem", + "info": "Pode acomodar um componente filho, adicionando o seu próprio preenchimento interno para limitar o espaço ocupado pelo componente filho, a propriedade central é o padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding com Margens Iguais em Todos os Lados", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Margens internas 【EdgeInsetsGeometry】\"", + "EdgeInsets.all é usado para definir margens iguais em todos os lados" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding com Margens Individuais", + "desc": [ + "EdgeInsets.only é usado para definir margens específicas" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding com Margens Direcionais", + "desc": [ + "EdgeInsets.symmetric é usado para definir margens horizontais e verticais" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json new file mode 100644 index 00000000..8cc5d92b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Компонент отступов", + "info": "Может содержать один дочерний компонент, добавляя собственные внутренние отступы для ограничения места, занимаемого дочерним компонентом. Основное свойство - padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding равные отступы со всех сторон", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "EdgeInsets.all используется для задания одинаковых отступов со всех сторон" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding отдельные отступы", + "desc": [ + "EdgeInsets.only используется для задания одинаковых отступов со всех сторон" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding направленные отступы", + "desc": [ + "EdgeInsets.symmetric используется для задания отступов по горизонтали и вертикали" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json new file mode 100644 index 00000000..6c2cb52a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "边距组件", + "info": "可容纳一个子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding四面等边距", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【padding】 : 内四边距 【EdgeInsetsGeometry】\"", + "EdgeInsets.all用来限定相同的四边边距" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding单独边距边距", + "desc": [ + "EdgeInsets.only用来限定相同的四边边距" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding方向边距", + "desc": [ + "EdgeInsets.symmetric用来限定水平和竖直方向的边距" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart new file mode 100644 index 00000000..ee5f54a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com + +class PaddingAll extends StatelessWidget { + const PaddingAll({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 150, + child: Padding( + padding: const EdgeInsets.all(20), + child: _buildChild(), + ), + ); + } + + Widget _buildChild() => Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 100, + height: 100, + child: const Text("孩子"), + ); +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart similarity index 76% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart index 9ede5684..2ee74a2c 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 74, -// "name": 'Padding单独边距边距', -// "priority": 2, -// "subtitle": -// "EdgeInsets.only用来限定相同的四边边距", -// } class PaddingOnly extends StatelessWidget { const PaddingOnly({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart similarity index 76% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart index a692b1f7..db66db53 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 74, -// "name": 'Padding方向边距', -// "priority": 3, -// "subtitle": -// "EdgeInsets.symmetric用来限定水平和竖直方向的边距", -// } class PaddingSymmetric extends StatelessWidget { const PaddingSymmetric({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json new file mode 100644 index 00000000..68dd4911 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Physikalisches Modul", + "info": "Ermöglicht das Zuschneiden von Unterkomponenten in runder oder quadratischer Form und ermöglicht die Angabe von Hintergrundfarbe, Rundung, Schattentiefe, Schattenfarbe und Zuschneideverhalten.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PhysicalModel", + "desc": [ + "【clipBehavior】: Zuschneideverhalten 【Clip】", + "【borderRadius】: Rundung 【BorderRadius】", + "【child】: Unterkomponente 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【shadowColor】: Schattenfarbe 【Color】", + "【shape】: Form 【BoxShape】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json new file mode 100644 index 00000000..b9351db8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Physical Module", + "info": "Allows child components to be clipped according to circles and squares, and can specify background color, rounded corners, shadow depth, shadow color, and clipping behavior.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PhysicalModel", + "desc": [ + "【clipBehavior】: Clipping Behavior 【Clip】", + "【borderRadius】: Rounded Corners 【BorderRadius】", + "【child】: Child Component 【Widget】", + "【elevation】: Shadow Depth 【double】", + "【shadowColor】: Shadow Color 【Color】", + "【shape】: Shape 【BoxShape】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json new file mode 100644 index 00000000..e00162d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Módulo Físico", + "info": "Permite recortar los componentes secundarios en forma circular o cuadrada, y se puede especificar el color de fondo, el radio de las esquinas, la profundidad de la sombra, el color de la sombra y el comportamiento de recorte.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【borderRadius】 : Radio de las esquinas 【BorderRadius】", + "【child】 : Componente secundario 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】", + "【shadowColor】 : Color de la sombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json new file mode 100644 index 00000000..43674cf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Module Physique", + "info": "Permet de découper les composants enfants selon une forme circulaire ou carrée, et de spécifier la couleur de fond, les coins arrondis, la profondeur de l'ombre, la couleur de l'ombre et le comportement de découpe.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportement de découpe 【Clip】", + "【borderRadius】 : Coins arrondis 【BorderRadius】", + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【shape】 : Forme 【BoxShape】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json new file mode 100644 index 00000000..97130486 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Modulo Fisico", + "info": "Permette di ritagliare i componenti figli in base a forme circolari o quadrate, e di specificare il colore di sfondo, gli angoli arrotondati, la profondità dell'ombra, il colore dell'ombra e il comportamento di ritaglio.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【borderRadius】 : Angoli arrotondati 【BorderRadius】", + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json new file mode 100644 index 00000000..82ad3a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "物理モジュール", + "info": "子コンポーネントを円形や四角形でクリップし、背景色、角丸、影の深さ、影の色、クリップ動作を指定することができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModelの基本的な使用", + "desc": [ + "【clipBehavior】 : クリップ動作 【Clip】", + "【borderRadius】 : 角丸 【BorderRadius】", + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【shape】 : 形状 【BoxShape】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json new file mode 100644 index 00000000..8d153b75 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "물리 모듈", + "info": "자식 위젯을 원형 또는 사각형으로 자를 수 있으며, 배경색, 모서리 반경, 그림자 깊이, 그림자 색상, 클리핑 동작을 지정할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModel 기본 사용", + "desc": [ + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【borderRadius】 : 모서리 반경 【BorderRadius】", + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【shape】 : 모양 【BoxShape】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json new file mode 100644 index 00000000..2ee84c80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Módulo Físico", + "info": "Permite que os subcomponentes sejam cortados de acordo com formas circulares ou quadradas, e pode especificar a cor de fundo, cantos arredondados, profundidade da sombra, cor da sombra e comportamento de corte.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【borderRadius】 : Cantos arredondados 【BorderRadius】", + "【child】 : Subcomponente 【Widget】", + "【elevation】 : Profundidade da sombra 【double】", + "【shadowColor】 : Cor da sombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json new file mode 100644 index 00000000..2c6f69f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Физический модуль", + "info": "Позволяет обрезать дочерние компоненты по кругу или квадрату, а также можно указать цвет фона, радиус скругления, глубину тени, цвет тени и поведение обрезки.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PhysicalModel", + "desc": [ + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【borderRadius】 : Радиус скругления 【BorderRadius】", + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【shape】 : Форма 【BoxShape】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json new file mode 100644 index 00000000..1b02584c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "物理模块", + "info": "可以让子组件按照圆形、方行进行剪裁,并且可以指定背景色、圆角、影深、阴影颜色、剪切行为。", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModel基本使用", + "desc": [ + "【clipBehavior】 : 裁剪行为 【Clip】", + "【borderRadius】 : 圆角 【BorderRadius】", + "【child】 : 子组件 【Widget】", + "【elevation】 : 阴影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【shape】 : 形状 【BoxShape】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart new file mode 100644 index 00000000..716ec9ff --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class PhysicalModelDemo extends StatelessWidget{ + const PhysicalModelDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + width: 150, + height: 150, + child: PhysicalModel( + shadowColor: Colors.orange, + elevation: 3, + child: Image.asset( + 'assets/images/caver.webp', + fit: BoxFit.cover, + ), + clipBehavior: Clip.hardEdge, + shape: BoxShape.circle, + color: Colors.deepPurpleAccent), + ), + + SizedBox( + width: 150, + height: 150, + child: PhysicalModel( + shadowColor: Colors.orange, + elevation: 3, + child: Image.asset( + 'assets/images/caver.webp', + fit: BoxFit.cover, + ), + borderRadius: const BorderRadius.all(Radius.circular(20)), + clipBehavior: Clip.hardEdge, + shape: BoxShape.rectangle, + color: Colors.deepPurpleAccent), + ), + ], + ); + } + +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json new file mode 100644 index 00000000..73eed096 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Physikalische Form", + "info": "Ermöglicht es den Unterkomponenten, entlang eines Pfads beschnitten zu werden, und ermöglicht die Angabe von Hintergrundfarbe, Schattentiefe, Schattenfarbe und Schneidverhalten.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PhysicalShape", + "desc": [ + "【clipper】 : Clipper 【CustomClipper】", + "【clipBehavior】 : Schneidverhalten 【Clip】", + "【child】 : Unterkomponente 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json new file mode 100644 index 00000000..4ea4b73e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Physical Shape", + "info": "Allows child components to be clipped according to the path, and can specify background color, shadow depth, shadow color, and clipping behavior.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PhysicalShape", + "desc": [ + "【clipper】: Clipper 【CustomClipper】", + "【clipBehavior】: Clipping Behavior 【Clip】", + "【child】: Child Component 【Widget】", + "【elevation】: Shadow Depth 【double】", + "【shadowColor】: Shadow Color 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json new file mode 100644 index 00000000..dcf2db89 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Física", + "info": "Permite que los componentes hijos se recorten según una ruta, y se puede especificar el color de fondo, la profundidad de la sombra, el color de la sombra y el comportamiento de recorte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PhysicalShape", + "desc": [ + "【clipper】: Recortador 【CustomClipper】", + "【clipBehavior】: Comportamiento de recorte 【Clip】", + "【child】: Componente hijo 【Widget】", + "【elevation】: Profundidad de la sombra 【double】", + "【shadowColor】: Color de la sombra 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json new file mode 100644 index 00000000..5eb0c9f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forme physique", + "info": "Permet de découper les composants enfants selon un chemin, et permet de spécifier la couleur de fond, la profondeur de l'ombre, la couleur de l'ombre et le comportement de découpage.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PhysicalShape", + "desc": [ + "【clipper】 : coupeur 【CustomClipper】", + "【clipBehavior】 : comportement de découpage 【Clip】", + "【child】 : composant enfant 【Widget】", + "【elevation】 : profondeur de l'ombre 【double】", + "【shadowColor】 : couleur de l'ombre 【Color】", + "【color】: couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json new file mode 100644 index 00000000..6946db31 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Fisica", + "info": "Consente ai componenti figli di essere ritagliati secondo un percorso e può specificare il colore di sfondo, la profondità dell'ombra, il colore dell'ombra e il comportamento di ritaglio.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PhysicalShape", + "desc": [ + "【clipper】 : Ritagliatore 【CustomClipper】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json new file mode 100644 index 00000000..73e8f5f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "物理形状", + "info": "子コンポーネントをパスに沿ってクリップし、背景色、影の深さ、影の色、クリップ動作を指定できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShapeの基本使用", + "desc": [ + "【clipper】 : クリッパー 【CustomClipper】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json new file mode 100644 index 00000000..edbc87f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "물리적 모양", + "info": "자식 위젯이 경로에 따라 잘릴 수 있도록 하고, 배경색, 그림자 깊이, 그림자 색상, 클리핑 동작을 지정할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShape 기본 사용", + "desc": [ + "【clipper】 : 클리퍼 【CustomClipper】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json new file mode 100644 index 00000000..293b4bd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Física", + "info": "Permite que os componentes filhos sejam cortados de acordo com o caminho, e pode especificar a cor de fundo, profundidade da sombra, cor da sombra, comportamento de corte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PhysicalShape", + "desc": [ + "【clipper】: Cortador 【CustomClipper】", + "【clipBehavior】: Comportamento de Corte 【Clip】", + "【child】: Componente Filho 【Widget】", + "【elevation】: Profundidade da Sombra 【double】", + "【shadowColor】: Cor da Sombra 【Color】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json new file mode 100644 index 00000000..e9ee5238 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Физическая форма", + "info": "Позволяет обрезать дочерние компоненты по пути, а также можно указать цвет фона, глубину тени, цвет тени и поведение обрезки.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PhysicalShape", + "desc": [ + "【clipper】 : Обрезчик 【CustomClipper】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json new file mode 100644 index 00000000..d09a1683 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "物理形状", + "info": "可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShape基本使用", + "desc": [ + "【clipper】 : 裁剪器 【CustomClipper】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【child】 : 子组件 【Widget】", + "【elevation】 : 阴影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart new file mode 100644 index 00000000..e2f4e872 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart @@ -0,0 +1,30 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class PhysicalShapeDemo extends StatelessWidget { + const PhysicalShapeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 200, + child: PhysicalShape( + shadowColor: Colors.orange, + elevation: 3, + child: Image.asset( + 'assets/images/caver.webp', + fit: BoxFit.cover, + ), + clipBehavior: Clip.hardEdge, + clipper: const ShapeBorderClipper( + shape: CircleBorder(side: BorderSide.none), + ), + color: Colors.deepPurpleAccent), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json new file mode 100644 index 00000000..3f21c340 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Neulackgrenze", + "info": "Erstellt eine separate Anzeigeliste für Unterkomponenten, um die Leistung zu verbessern. Im Quellcode wird es in Komponenten wie TextField, DrawerController, Scrollbar, Sliver usw. verwendet.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RepaintBoundary", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "Zum Beispiel wird in der obigen Zeichenansicht die paint-Methode auch dann kontinuierlich ausgeführt, wenn shouldRepaint false ist. Die Verwendung von RepaintBoundary kann unnötiges Zeichnen vermeiden." + ] + }, + { + "file": "node2_save.dart", + "name": "Speichern eines Widgets als Bild", + "desc": [ + "Mit RenderRepaintBoundary können Bildinformationen der Unterkomponente abgerufen werden, um sie als Bilddatei zu speichern." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json new file mode 100644 index 00000000..420495ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Repaint Boundary", + "info": "Creates a separate display list for child components to improve performance. It is used in components such as TextField, DrawerController, Scrollbar, and Sliver in the source code.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RepaintBoundary", + "desc": [ + "【child】 : Child component 【Widget】", + "For example, in the above drawing view, even if shouldRepaint is false, the paint method will be continuously executed during scrolling. Using RepaintBoundary can avoid unnecessary drawing." + ] + }, + { + "file": "node2_save.dart", + "name": "Save Widget as Image", + "desc": [ + "Through RenderRepaintBoundary, you can obtain the Image information of the child component, and then save the bytes as an image file." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json new file mode 100644 index 00000000..82831684 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Límite de repintado", + "info": "Crea una lista de visualización separada para los componentes hijos, mejorando el rendimiento. Se utiliza en componentes como TextField, DrawerController, Scrollbar, Sliver, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RepaintBoundary", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "Por ejemplo, en la vista de dibujo anterior, incluso si shouldRepaint es false, el método paint se ejecutará continuamente durante el desplazamiento. Usar RepaintBoundary puede evitar pinturas innecesarias." + ] + }, + { + "file": "node2_save.dart", + "name": "Guardar Widget como imagen", + "desc": [ + "A través de RenderRepaintBoundary se puede obtener la información de la imagen del componente hijo, y así guardar los bytes como un archivo de imagen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json new file mode 100644 index 00000000..838e65f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Limite de Repaint", + "info": "Crée une liste d'affichage séparée pour les composants enfants, améliorant ainsi les performances. Utilisé dans les composants tels que TextField, DrawerController, Scrollbar, Sliver, etc. dans le code source.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RepaintBoundary", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Par exemple, dans la vue de dessin ci-dessus, même si shouldRepaint est false, la méthode paint sera constamment exécutée lors du défilement. L'utilisation de RepaintBoundary peut éviter les peintures inutiles." + ] + }, + { + "file": "node2_save.dart", + "name": "Sauvegarder un Widget en tant qu'image", + "desc": [ + "Grâce à RenderRepaintBoundary, il est possible d'obtenir les informations d'image du composant enfant, puis de les sauvegarder sous forme de fichier image." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json new file mode 100644 index 00000000..5ca39800 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Confine di ridisegno", + "info": "Crea una lista di visualizzazione separata per i componenti figli, migliorando le prestazioni. Nel codice sorgente, viene utilizzato in componenti come TextField, DrawerController, Scrollbar, Sliver, ecc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RepaintBoundary", + "desc": [ + "【child】 : componente figlio 【Widget】", + "Ad esempio, nella vista di disegno sopra, anche se shouldRepaint è false, il metodo paint verrà eseguito continuamente durante lo scorrimento. L'uso di RepaintBoundary può evitare ridisegni non necessari." + ] + }, + { + "file": "node2_save.dart", + "name": "Salvare un Widget come immagine", + "desc": [ + "Attraverso RenderRepaintBoundary è possibile ottenere le informazioni sull'immagine del componente figlio, ottenendo così i byte per salvarli come file immagine." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json new file mode 100644 index 00000000..ac0a6721 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "再描画境界", + "info": "子コンポーネントのための別個の表示リストを作成し、パフォーマンスを向上させます。ソースコードではTextField、DrawerController、Scrollbar、Sliverなどのコンポーネントに適用されています", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundaryの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例えば、上記の描画ビューでは、shouldRepaintがfalseであっても、スクロール中にpaintメソッドが繰り返し実行されます。RepaintBoundaryを使用することで、不要な描画を避けることができます。" + ] + }, + { + "file": "node2_save.dart", + "name": "Widgetを画像として保存", + "desc": [ + "RenderRepaintBoundaryを使用して、子コンポーネントのImage情報を取得し、バイトとして画像ファイルに保存することができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json new file mode 100644 index 00000000..79bd059f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "리페인트 경계", + "info": "자식 위젯을 위한 별도의 디스플레이 리스트를 생성하여 성능을 향상시킵니다. 소스 코드에서 TextField, DrawerController, Scrollbar, Sliver 등 다양한 위젯에 적용되어 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundary 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "예를 들어 위의 그리기 뷰는 shouldRepaint가 false인 경우에도 스크롤 중에 paint 메소드가 계속 실행됩니다. RepaintBoundary를 사용하면 불필요한 그리기를 방지할 수 있습니다." + ] + }, + { + "file": "node2_save.dart", + "name": "위젯을 이미지로 저장", + "desc": [ + "RenderRepaintBoundary를 통해 자식 위젯의 이미지 정보를 얻어 바이트로 저장하여 이미지 파일로 저장할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json new file mode 100644 index 00000000..78089c63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Limite de Repintura", + "info": "Cria uma lista de exibição separada para componentes filhos, melhorando o desempenho. É utilizado em componentes como TextField, DrawerController, Scrollbar, Sliver, entre outros, no código-fonte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RepaintBoundary", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Por exemplo, na vista de desenho acima, mesmo que shouldRepaint seja falso, o método paint será executado continuamente durante o deslizamento. Usar RepaintBoundary pode evitar pinturas desnecessárias." + ] + }, + { + "file": "node2_save.dart", + "name": "Salvar Widget como Imagem", + "desc": [ + "Através do RenderRepaintBoundary, é possível obter informações de imagem do componente filho e, assim, salvar os bytes como um arquivo de imagem." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json new file mode 100644 index 00000000..ef65d3e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Граница перерисовки", + "info": "Создает отдельный список отображения для дочерних компонентов, повышая производительность. Используется в компонентах, таких как TextField, DrawerController, Scrollbar, Sliver и других в исходном коде.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RepaintBoundary", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Например, в приведенном выше примере отображения, даже если shouldRepaint равен false, метод paint будет постоянно выполняться во время прокрутки. Использование RepaintBoundary позволяет избежать ненужной перерисовки." + ] + }, + { + "file": "node2_save.dart", + "name": "Сохранение Widget в виде изображения", + "desc": [ + "С помощью RenderRepaintBoundary можно получить информацию об изображении дочернего компонента и сохранить его в виде файла изображения." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json new file mode 100644 index 00000000..b2ee37a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "重绘边界", + "info": "为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundary基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "比如上面的绘制视图,即使shouldRepaint为false,在滑动中会也会不断执行paint方法,使用RepaintBoundary可以避免不必要的绘制。" + ] + }, + { + "file": "node2_save.dart", + "name": "保存Widget成为图片", + "desc": [ + "通过RenderRepaintBoundary可以获取子组件的Image信息,从而获取字节保存为图片文件。" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart new file mode 100644 index 00000000..f26bf1f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart @@ -0,0 +1,178 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class RepaintBoundaryDemo extends StatelessWidget{ + const RepaintBoundaryDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const RepaintBoundary( + child: TempPlayBezier3Page(), + ); + } +} + +class TempPlayBezier3Page extends StatefulWidget { + const TempPlayBezier3Page({Key? key}) : super(key: key); + + @override + _TempPlayBezier3PageState createState() => _TempPlayBezier3PageState(); +} + +class _TempPlayBezier3PageState extends State { + List _pos = []; + int? selectPos; + + @override + void initState() { + _initPoints(); + super.initState(); + } + + void _initPoints() { + _pos = []; + _pos.add(const Offset(0, 0)); + _pos.add(const Offset(60, -60)); + _pos.add(const Offset(-90, -90)); + _pos.add(const Offset(-120, -40)); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + width: MediaQuery.of(context).size.width, + child: CustomPaint( + painter: TempBezierPainter(pos: _pos, selectPos: selectPos), + ), + ); + } +} + +class TempBezierPainter extends CustomPainter { + late Paint _gridPaint; + late Path _gridPath; + + late Paint _mainPaint; + late Path _mainPath; + int? selectPos; + late Paint _helpPaint; + + List pos; + + TempBezierPainter({this.pos=const [], this.selectPos}) { + _gridPaint = Paint()..style = PaintingStyle.stroke; + _gridPath = Path(); + + _mainPaint = Paint() + ..color = Colors.orange + ..style = PaintingStyle.stroke + ..strokeWidth = 2; + _mainPath = Path(); + + _helpPaint = Paint() + ..color = Colors.purple + ..style = PaintingStyle.stroke + ..strokeWidth = 2 + ..strokeCap = StrokeCap.round; + } + + @override + void paint(Canvas canvas, Size size) { + print('----------Paint-------'); + canvas.clipRect(Offset.zero & size); + canvas.translate(size.width / 2, size.height / 2); + _drawGrid(canvas, size); //绘制格线 + _drawAxis(canvas, size); //绘制轴线 + + _mainPath.moveTo(pos[0].dx, pos[0].dy); + _mainPath.cubicTo( + pos[1].dx, pos[1].dy, pos[2].dx, pos[2].dy, pos[3].dx, pos[3].dy); + canvas.drawPath(_mainPath, _mainPaint); + _drawHelp(canvas); + _drawSelectPos(canvas); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; + + void _drawGrid(Canvas canvas, Size size) { + _gridPaint + ..color = Colors.grey + ..strokeWidth = 0.5; + _gridPath = _buildGridPath(_gridPath, size); + canvas.drawPath(_buildGridPath(_gridPath, size), _gridPaint); + + canvas.save(); + canvas.scale(1, -1); //沿x轴镜像 + canvas.drawPath(_gridPath, _gridPaint); + canvas.restore(); + + canvas.save(); + canvas.scale(-1, 1); //沿y轴镜像 + canvas.drawPath(_gridPath, _gridPaint); + canvas.restore(); + + canvas.save(); + canvas.scale(-1, -1); //沿原点镜像 + canvas.drawPath(_gridPath, _gridPaint); + canvas.restore(); + } + + void _drawAxis(Canvas canvas, Size size) { + canvas.drawPoints( + PointMode.lines, + [ + Offset(-size.width / 2, 0), + Offset(size.width / 2, 0), + Offset(0, -size.height / 2), + Offset(0, size.height / 2), + Offset(0, size.height / 2), + Offset(0 - 7.0, size.height / 2 - 10), + Offset(0, size.height / 2), + Offset(0 + 7.0, size.height / 2 - 10), + Offset(size.width / 2, 0), + Offset(size.width / 2 - 10, 7), + Offset(size.width / 2, 0), + Offset(size.width / 2 - 10, -7), + ], + _gridPaint + ..color = Colors.blue + ..strokeWidth = 1.5); + } + + Path _buildGridPath(Path path, Size size, {step = 20.0}) { + for (int i = 0; i < size.height / 2 / step; i++) { + path.moveTo(0, step * i); + path.relativeLineTo(size.width / 2, 0); + } + for (int i = 0; i < size.width / 2 / step; i++) { + path.moveTo(step * i, 0); + path.relativeLineTo( + 0, + size.height / 2, + ); + } + return path; + } + + void _drawHelp(Canvas canvas) { + canvas.drawPoints(PointMode.lines, pos, _helpPaint..strokeWidth = 1); + canvas.drawPoints(PointMode.points, pos, _helpPaint..strokeWidth = 8); + } + + void _drawSelectPos(Canvas canvas) { + if (selectPos == null) return; + canvas.drawCircle( + pos[selectPos!], + 10, + _helpPaint + ..color = Colors.green + ..strokeWidth = 2); + } +} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart similarity index 83% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart index 953203af..a235ebd3 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart @@ -8,18 +8,18 @@ import 'node1_base.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 264, -// "name": "保存Widget成为图片", -// "priority": 2, -// "subtitle": "通过RenderRepaintBoundary可以获取子组件的Image信息,从而获取字节保存为图片文件。", -// } -class RepaintBoundarySave extends StatelessWidget { - final GlobalKey _globalKey = GlobalKey(); - RepaintBoundarySave({Key? key}) : super(key: key); +class RepaintBoundarySave extends StatefulWidget { + + const RepaintBoundarySave({super.key}); + + @override + State createState() => _RepaintBoundarySaveState(); +} + +class _RepaintBoundarySaveState extends State { + final GlobalKey _globalKey = GlobalKey(); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json new file mode 100644 index 00000000..731df615 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Drehbox", + "info": "Kann ein Unterelement aufnehmen und es im Uhrzeigersinn um quarterTurns*90° drehen.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RotatedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【quarterTurns】 : Um wie viele 90° gedreht werden soll 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json new file mode 100644 index 00000000..7dcd5cb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Rotated Box", + "info": "Can contain a child widget, rotating it clockwise by quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RotatedBox", + "desc": [ + "【child】 : Child widget 【Widget】", + "【quarterTurns】 : How many 90° to rotate 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json new file mode 100644 index 00000000..1cb8f9ce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Caja Rotada", + "info": "Puede contener un componente hijo, girándolo en sentido horario en quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RotatedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【quarterTurns】 : Cuántos 90° girar 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json new file mode 100644 index 00000000..6088e564 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Boîte Rotée", + "info": "Peut contenir un composant enfant, le faisant pivoter dans le sens horaire de quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RotatedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【quarterTurns】 : Nombre de rotations de 90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json new file mode 100644 index 00000000..e7323602 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Scatola Ruotata", + "info": "Può contenere un componente figlio, ruotandolo in senso orario di quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RotatedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【quarterTurns】 : Quanti 90° ruotare 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json new file mode 100644 index 00000000..9ab2b233 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "回転ボックス", + "info": "1つの子コンポーネントを収容し、それを時計回りにquarterTurns*90°回転させます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBoxの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【quarterTurns】 : 90°回転する回数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json new file mode 100644 index 00000000..7b476c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "회전 상자", + "info": "하나의 자식 위젯을 포함할 수 있으며, 시계 방향으로 quarterTurns*90°만큼 회전시킵니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBox 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【quarterTurns】 : 90° 회전 횟수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json new file mode 100644 index 00000000..cb67f1bf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Caixa Giratória", + "info": "Pode conter um componente filho, girando-o no sentido horário em quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RotatedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【quarterTurns】 : Quantos 90° para girar 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json new file mode 100644 index 00000000..7f6465f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Повернутый ящик", + "info": "Может содержать один дочерний компонент, поворачивая его по часовой стрелке на quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RotatedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【quarterTurns】 : Сколько раз повернуть на 90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json new file mode 100644 index 00000000..87b81cb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "旋转盒", + "info": "可容纳一个子组件,将其沿顺时针旋转quarterTurns*90°。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【quarterTurns】 : 旋转多少个90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart new file mode 100644 index 00000000..622d17f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomRotatedBox extends StatefulWidget { + const CustomRotatedBox({Key? key}) : super(key: key); + + @override + _CustomRotatedBoxState createState() => _CustomRotatedBoxState(); +} + +class _CustomRotatedBoxState extends State { + int _quarterTurns = 0; + + @override + Widget build(BuildContext context) { + return RotatedBox( + quarterTurns: _quarterTurns, + child: GestureDetector( + onTap: () => setState(() => _quarterTurns++), + child: const Icon( + Icons.android, + size: 60, + color: Colors.blue, + )), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json new file mode 100644 index 00000000..b630b69d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Shader-Maske", + "info": "Kann ein Kind aufnehmen und das Kind durch einen Shader einfärben, wobei der Mischmodus angegeben werden kann. Wird häufig für die Farbverlaufsverarbeitung von Komponenten verwendet.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Radialer Farbverlauf", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【shaderCallback】 : Shader-Rückruf 【ShaderCallback】", + "【blendMode】 : Mischmodus 【BlendMode】", + " Erstellt einen radialen Farbverlaufsshader durch RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Linearer Farbverlauf", + "desc": [ + "Erstellt einen linearen Farbverlaufsshader durch LinearGradient#createShader", + "Weitere Informationen zu Shadern finden Sie im 【Zeichnungsalbum】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json new file mode 100644 index 00000000..bf1fb1ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Shader Mask", + "info": "Can accommodate a child and apply shading to the child through a shader, with the ability to specify blending modes. Commonly used for gradient processing of components.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Radial Gradient Shading", + "desc": [ + "【child】: Child component 【Widget】", + "【shaderCallback】: Shader callback 【ShaderCallback】", + "【blendMode】: Blending mode 【BlendMode】", + " Create a radial gradient shader through RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Linear Gradient Shading", + "desc": [ + "Create a linear gradient shader through LinearGradient#createShader", + "For more information on shaders, see 【Drawing Album】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json new file mode 100644 index 00000000..7d568a3c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Máscara de sombreado", + "info": "Puede contener un hijo y aplicar sombreado al hijo a través de un sombreador, se puede especificar el modo de mezcla. Normalmente se utiliza para el procesamiento de gradientes de color en componentes.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Sombreado de gradiente radial", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【shaderCallback】 : Callback del sombreador 【ShaderCallback】", + "【blendMode】 : Modo de mezcla 【BlendMode】", + " Crea un sombreador de gradiente radial a través de RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Sombreado de gradiente lineal", + "desc": [ + "Crea un sombreador de gradiente lineal a través de LinearGradient#createShader", + "Para más información sobre sombreadores, consulte el 【Álbum de dibujo】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json new file mode 100644 index 00000000..4a4f8f29 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Masque de nuance", + "info": "Peut contenir un enfant et appliquer une teinte à l'enfant via un nuanceur, avec la possibilité de spécifier un mode de mélange. Couramment utilisé pour le traitement des dégradés de composants.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Teinte de dégradé radial", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【shaderCallback】 : Rappel du nuanceur 【ShaderCallback】", + "【blendMode】 : Mode de mélange 【BlendMode】", + " Crée un nuanceur de dégradé radial via RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Teinte de dégradé linéaire", + "desc": [ + "Crée un nuanceur de dégradé linéaire via LinearGradient#createShader", + "Pour plus d'informations sur les nuanceurs, voir 【Album de dessin】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json new file mode 100644 index 00000000..14396a8e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Maschera Shader", + "info": "Può contenere un figlio e colorare il figlio attraverso uno shader, specificando la modalità di fusione. Solitamente utilizzato per il trattamento della gradazione dei componenti.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Sfumatura Radiale", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【shaderCallback】 : Callback dello shader 【ShaderCallback】", + "【blendMode】 : Modalità di fusione 【BlendMode】", + " Crea uno shader di sfumatura radiale attraverso RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Sfumatura Lineare", + "desc": [ + "Crea uno shader di sfumatura lineare attraverso LinearGradient#createShader", + "Per ulteriori informazioni sugli shader, consulta 【Album di disegno】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json new file mode 100644 index 00000000..5e543115 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "シェーダーマスク", + "info": "1つの子要素を保持し、シェーダーを使用して子要素に色を付けることができます。ブレンドモードを指定できます。通常、コンポーネントのグラデーション処理に使用されます。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "ラジアルグラデーションシェーダー", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【shaderCallback】 : シェーダーコールバック 【ShaderCallback】", + "【blendMode】 : ブレンドモード 【BlendMode】", + " RadialGradient#createShaderを使用してラジアルグラデーションシェーダーを作成します。" + ] + }, + { + "file": "node2_linear.dart", + "name": "リニアグラデーションシェーダー", + "desc": [ + "LinearGradient#createShaderを使用してリニアグラデーションシェーダーを作成します", + "シェーダーに関する詳細は【描画アルバム】を参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json new file mode 100644 index 00000000..09343418 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "셰이더 마스크", + "info": "하나의 자식을 포함할 수 있으며, 셰이더를 통해 자식에 색상을 입힐 수 있습니다. 혼합 모드를 지정할 수 있습니다. 일반적으로 컴포넌트 그라데이션 처리에 사용됩니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "방사형 그라데이션 색상", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【shaderCallback】 : 셰이더 콜백 【ShaderCallback】", + "【blendMode】 : 혼합 모드 【BlendMode】", + " RadialGradient#createShader를 통해 방사형 그라데이션 셰이더를 생성합니다." + ] + }, + { + "file": "node2_linear.dart", + "name": "선형 그라데이션 색상", + "desc": [ + "LinearGradient#createShader를 통해 선형 그라데이션 셰이더를 생성합니다", + "셰이더 관련 지식은 【그리기 앨범】을 참조하세요" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json new file mode 100644 index 00000000..a0bf5dd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Máscara de Shader", + "info": "Pode conter um filho e colorir o filho através de um shader, podendo especificar o modo de mistura. Geralmente usado para processamento de gradiente de componentes.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Coloração de Gradiente Radial", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【shaderCallback】 : Callback do shader 【ShaderCallback】", + "【blendMode】 : Modo de mistura 【BlendMode】", + " Cria um shader de gradiente radial através de RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Coloração de Gradiente Linear", + "desc": [ + "Cria um shader de gradiente linear através de LinearGradient#createShader", + "Para mais informações sobre shaders, consulte o 【Álbum de Desenho】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json new file mode 100644 index 00000000..99c04db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Маска шейдера", + "info": "Может содержать один дочерний элемент и применять к нему шейдер, можно указать режим смешивания. Обычно используется для градиентной обработки компонентов.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Радиальный градиент", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【shaderCallback】 : Коллбэк шейдера 【ShaderCallback】", + "【blendMode】 : Режим смешивания 【BlendMode】", + " Создание радиального градиентного шейдера через RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Линейный градиент", + "desc": [ + "Создание линейного градиентного шейдера через LinearGradient#createShader", + "Подробнее о шейдерах см. в 【Альбоме рисования】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json new file mode 100644 index 00000000..35722682 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "着色器遮罩", + "info": "可容纳一个孩子,并通过着色器来对孩子进行着色,可指定混色模式。通常用于组件渐变色处理。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "径向渐变着色", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【shaderCallback】 : 着色器回调 【ShaderCallback】", + "【blendMode】 : 混色模式 【BlendMode】", + " 通过RadialGradient#createShader创建径向渐变着色器。" + ] + }, + { + "file": "node2_linear.dart", + "name": "线性渐变着色", + "desc": [ + "通过LinearGradient#createShader创建线性渐变着色器", + "着色器相关知识详见【绘制专辑】" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart similarity index 76% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart index 5a55953c..7f9bda4c 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 277, -// "name": '径向渐变着色', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【shaderCallback】 : 着色器回调 【ShaderCallback】\n" -// "【blendMode】 : 混色模式 【BlendMode】\n" -// " 通过RadialGradient#createShader创建径向渐变着色器。", -// } + class RadialShaderMask extends StatelessWidget { const RadialShaderMask({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart similarity index 83% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart index 8bf54085..2a96d7b3 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 277, -// "name": '线性渐变着色', -// "priority": 2, -// "subtitle": "通过LinearGradient#createShader创建线性渐变着色器\n" -// "着色器相关知识详见【绘制专辑】", -// } + class LinearShaderMask extends StatelessWidget { const LinearShaderMask({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json new file mode 100644 index 00000000..0dcba6cc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Größenänderungsbenachrichtigung", + "info": "Mit SizeChangedLayoutNotifier kann eine Benachrichtigung gesendet werden, nachdem sich der Layoutbereich eines Kindelements ändert. Die Benachrichtigung kann mit NotificationListener überwacht werden.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json new file mode 100644 index 00000000..b67b9139 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Size Change Notification", + "info": "Using SizeChangedLayoutNotifier can send a notification after the layout area of the child component changes. NotificationListener can be used to monitor it.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【child】 : Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json new file mode 100644 index 00000000..9f4a9aef --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notificador de cambio de tamaño", + "info": "Usando SizeChangedLayoutNotifier, se puede emitir una notificación cuando cambia el área de diseño de un componente hijo. Se puede escuchar usando NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json new file mode 100644 index 00000000..4ba60dba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notification de changement de taille", + "info": "Utiliser SizeChangedLayoutNotifier permet d'émettre une notification lorsque la zone de mise en page d'un composant enfant change. Utilisez NotificationListener pour écouter ces notifications.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json new file mode 100644 index 00000000..ef73a668 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notifica di Cambio Dimensione", + "info": "Utilizzando SizeChangedLayoutNotifier, è possibile inviare una notifica quando l'area di layout di un componente figlio cambia. È possibile ascoltare questa notifica utilizzando NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di Base", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json new file mode 100644 index 00000000..75ee50c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "サイズ変更通知", + "info": "SizeChangedLayoutNotifierを使用すると、子コンポーネントのレイアウト領域が変更された後に通知を発行できます。NotificationListenerを使用して監視することができます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json new file mode 100644 index 00000000..77ef19fc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "크기 변경 알림", + "info": "SizeChangedLayoutNotifier를 사용하면 하위 구성 요소 레이아웃 영역이 변경된 후 알림을 보낼 수 있습니다. NotificationListener를 사용하여 이를 감지할 수 있습니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용", + "desc": [ + "【child】 : 구성 요소 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json new file mode 100644 index 00000000..928126c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notificador de Mudança de Tamanho", + "info": "Usando o SizeChangedLayoutNotifier, é possível emitir uma notificação após uma mudança na área de layout do componente filho. O NotificationListener pode ser usado para monitorar.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json new file mode 100644 index 00000000..5380f36b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Уведомление об изменении размера", + "info": "Использование SizeChangedLayoutNotifier позволяет отправлять уведомления после изменения области макета дочернего компонента. Для прослушивания можно использовать NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json new file mode 100644 index 00000000..8cc2e40a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "尺寸变化通告", + "info": "使用 SizeChangedLayoutNotifier 可以在子组件布局区域发生变化后,发出通知。使用NotificationListener可以进行监听。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart new file mode 100644 index 00000000..4dd5fe89 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class SizeChangedLayoutNotifierDemo extends StatefulWidget { + const SizeChangedLayoutNotifierDemo({Key? key}) : super(key: key); + + @override + _SizeChangedLayoutNotifierDemoState createState() => _SizeChangedLayoutNotifierDemoState(); +} + +class _SizeChangedLayoutNotifierDemoState extends State { + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: _onNotification, + child: const ChangeableBox(), + ); + } + + bool _onNotification(SizeChangedLayoutNotification notification) { + print('---------SizeChangedLayoutNotification------'); + return false; + } +} + +class ChangeableBox extends StatefulWidget { + const ChangeableBox({Key? key}) : super(key: key); + + @override + _ChangeableBoxState createState() => _ChangeableBoxState(); +} + +class _ChangeableBoxState extends State { + double width = 40; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizeChangedLayoutNotifier( + child: Container( + width: width, + height: 100, + color: Colors.blue, + ), + ), + Slider( + max: 200, + min: 20, + divisions: 10, + value: width, + onChanged: _changeWidth, + ) + ], + ); + } + + void _changeWidth(double value) { + setState(() { + width = value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json new file mode 100644 index 00000000..5b1876fa --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Größenfestgelegte Box", + "info": "Kann ein Kindelement aufnehmen und den Bereich für das Kindelement durch Angabe von Breite und Höhe begrenzen.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json new file mode 100644 index 00000000..ff26d6bd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "SizedBox", + "info": "Can contain a child component, limiting the area of the child component by specifying width and height.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizedBox", + "desc": [ + "【child】 : Child component 【Widget】", + "【width】 : Width 【double】", + "【height】 : Height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json new file mode 100644 index 00000000..ced0e87b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Caja de tamaño fijo", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y el alto.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json new file mode 100644 index 00000000..22607dbb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Boîte de taille fixe", + "info": "Peut contenir un composant enfant, en spécifiant la largeur et la hauteur pour limiter la zone du composant enfant.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json new file mode 100644 index 00000000..0fd5d488 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Scatola di dimensioni fisse", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando larghezza e altezza.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SizedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json new file mode 100644 index 00000000..396c2501 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "サイズ指定ボックス", + "info": "子コンポーネントを収容し、幅と高さを指定して子コンポーネントの領域を制限します。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json new file mode 100644 index 00000000..da76fdd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "고정 크기 상자", + "info": "하위 컴포넌트를 수용할 수 있으며, 너비와 높이를 지정하여 하위 컴포넌트의 영역을 제한합니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBox 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json new file mode 100644 index 00000000..20ca3e91 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Caixa de Tamanho Fixo", + "info": "Pode conter um componente filho, limitando a área do componente filho especificando a largura e altura.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json new file mode 100644 index 00000000..e201ebc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Коробка с фиксированным размером", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента указанием ширины и высоты.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json new file mode 100644 index 00000000..825a2c2a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "定尺寸盒", + "info": "可容纳一个子组件,通过指定宽高限定子组件容身区域。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart new file mode 100644 index 00000000..3147a97f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomSizedBox extends StatelessWidget { + const CustomSizedBox({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Widget child = Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 50, + height: 50, + child: const Text("Static"), + ); + + Widget box = SizedBox( + width: 80, + height: 40, + child: Container( + color: Colors.orange, + child: const Icon( + Icons.android, + color: Colors.white, + )), + ); + + return Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + child: Row( + children: [child, box, child], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json new file mode 100644 index 00000000..27ce75d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Größenüberlaufbox", + "info": "Kann ein Kindelement aufnehmen, und das Kindelement darf den Bereich des Elternelements überlaufen. Das Kindelement kann durch die size-Eigenschaft verschoben werden und verfügt über die Ausrichtungseigenschaft alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizedOverflowBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【size】 : Größenverschiebung 【Size】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json new file mode 100644 index 00000000..6f3ed70a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Sized Overflow Box", + "info": "Can contain a child component, and the child component is allowed to overflow the parent component area. The child component can be offset through the size property, and has the alignment property.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizedOverflowBox", + "desc": [ + "【child】: Child component 【Widget】", + "【size】: Size offset 【Size】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json new file mode 100644 index 00000000..774d3627 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Caja de desbordamiento de tamaño", + "info": "Puede contener un componente hijo, y el componente hijo puede desbordar el área del componente padre. Se puede desplazar el componente hijo mediante la propiedad size y tiene la propiedad de alineación alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizedOverflowBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【size】 : Desplazamiento de tamaño 【Size】", + "【alignment】 : Método de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json new file mode 100644 index 00000000..38f12409 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Boîte de débordement dimensionnée", + "info": "Peut contenir un composant enfant, et le composant enfant est autorisé à déborder de la zone du composant parent. Il est possible de décaler le composant enfant à l'aide de la propriété size, et il possède la propriété d'alignement alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizedOverflowBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【size】 : Décalage de taille 【Size】", + "【alignment】 : Méthode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json new file mode 100644 index 00000000..2a4ebf9f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Scatola di dimensioni eccessive", + "info": "Può contenere un componente figlio e il componente figlio può fuoriuscire dall'area del componente genitore. È possibile spostare il componente figlio tramite la proprietà size e ha la proprietà di allineamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SizedOverflowBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【size】 : Spostamento delle dimensioni 【Size】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json new file mode 100644 index 00000000..872a5e1b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "サイズオーバーフローボックス", + "info": "子コンポーネントを収容でき、子コンポーネントは親コンポーネントの領域をオーバーフローすることが許可されています。size属性を使用して子コンポーネントをオフセットでき、alignment属性を持っています。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【size】 : サイズオフセット 【Size】", + "【alignment】 : アラインメント 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json new file mode 100644 index 00000000..db62b43b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "크기 오버플로우 박스", + "info": "하위 컴포넌트를 포함할 수 있으며, 하위 컴포넌트가 상위 컴포넌트 영역을 벗어날 수 있습니다. size 속성을 통해 하위 컴포넌트를 오프셋할 수 있으며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【size】 : 크기 오프셋 【Size】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json new file mode 100644 index 00000000..0edaf0bc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Caixa de Transbordamento Dimensionada", + "info": "Pode conter um componente filho, e o componente filho pode transbordar a área do componente pai. O componente filho pode ser deslocado através da propriedade size, e possui a propriedade de alinhamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizedOverflowBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【size】 : Deslocamento de tamanho 【Size】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json new file mode 100644 index 00000000..ded711d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Размерный переполняющий ящик", + "info": "Может содержать один дочерний компонент, и дочерний компонент может выходить за пределы области родительского компонента. Можно смещать дочерний компонент с помощью свойства size, имеет свойство выравнивания alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizedOverflowBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【size】 : Смещение размера 【Size】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json new file mode 100644 index 00000000..e0bb0279 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "尺寸溢出盒", + "info": "可容纳一个子组件,且子组件允许溢出父组件区域,可以通过size属性对子组件进行偏移,拥有对齐属性alignment。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【size】 : 尺寸偏移 【Size】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart new file mode 100644 index 00000000..8270a626 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomSizedOverflowBox extends StatefulWidget { + const CustomSizedOverflowBox({Key? key}) : super(key: key); + + @override + _CustomSizedOverflowBoxState createState() => _CustomSizedOverflowBoxState(); +} + +class _CustomSizedOverflowBoxState extends State { + double _x = 50; + double _y = 44; + + @override + Widget build(BuildContext context) { + Widget box = SizedOverflowBox( + alignment: Alignment.bottomRight, + size: Size(_x, _y), + child: Container(width: 30, height: 50, color: Colors.orange), + ); + return Column( + children: [ + Container( + alignment: Alignment.topLeft, + color: Colors.grey.withAlpha(88), + width: 250, + height: 60, + child: box), + _buildSlider() + ], + ); + } + + Widget _buildSlider() => + Column( + children: [ + Slider( + divisions: 100, + min: 0, + max: 250, + label: 'x:' + _x.toStringAsFixed(1), + value: _x, + onChanged: (v) => setState(() => _x = v)), + Slider( + divisions: 100, + min: 0, + max: 100, + label: 'y:' + _y.toStringAsFixed(1), + value: _y, + onChanged: (v) => setState(() => _y = v)), + + ], + ); +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json new file mode 100644 index 00000000..fa94071a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Klickbereich", + "info": "Komponente, die interne oder externe Klickrückrufe erkennen kann. Durch die groupId können mehrere Bereiche als eine Einheit betrachtet werden.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Interne und externe Klicks überwachen", + "desc": [ + "【enabled】 : Verfügbar 【bool】", + "【onTapOutside】 : Externer Klick-Listener 【TapRegionCallback?】", + "【onTapInside】 : Interner Klick-Listener 【TapRegionCallback?】", + "【groupId】 : Klickbereichsgruppenkennung 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json new file mode 100644 index 00000000..bbe560ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Tap Region", + "info": "A component that can detect internal or external click callbacks, and multiple regions can be treated as one through the groupId.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Listen to clicks inside and outside the component", + "desc": [ + "【enabled】 : Whether it is available 【bool】", + "【onTapOutside】 : Listen to clicks outside 【TapRegionCallback?】", + "【onTapInside】 : Listen to clicks inside 【TapRegionCallback?】", + "【groupId】 : Click region group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json new file mode 100644 index 00000000..5cf6a1b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Área de toque", + "info": "Componente capaz de detectar devoluciones de llamada de toques internos o externos, mediante groupId varias áreas pueden considerarse como una sola.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar toques dentro y fuera del componente", + "desc": [ + "【enabled】 : ¿Está disponible? 【bool】", + "【onTapOutside】 : Escucha de toques externos 【TapRegionCallback?】", + "【onTapInside】 : Escucha de toques internos 【TapRegionCallback?】", + "【groupId】 : Identificador del grupo de área de toque 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json new file mode 100644 index 00000000..ca3ba3fe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Zone de clic", + "info": "Un composant capable de détecter les rappels de clic internes ou externes, plusieurs zones peuvent être considérées comme une seule via groupId.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les clics à l'intérieur et à l'extérieur du composant", + "desc": [ + "【enabled】 : Activé ou non 【bool】", + "【onTapOutside】 : Écouteur de clic externe 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic interne 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json new file mode 100644 index 00000000..6faac12c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Area di tocco", + "info": "Componente in grado di rilevare i callback di clic interni o esterni, tramite groupId più aree possono essere considerate come una sola.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta i clic interni ed esterni del componente", + "desc": [ + "【enabled】 : Se è disponibile 【bool】", + "【onTapOutside】 : Ascolta i clic esterni 【TapRegionCallback?】", + "【onTapInside】 : Ascolta i clic interni 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo dell'area di tocco 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json new file mode 100644 index 00000000..e071c615 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "タップ範囲", + "info": "内部または外部のタップコールバックを検出できるコンポーネントで、groupId を使用して複数の領域を一体として扱うことができます。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "コンポーネントの内部と外部のタップを監視", + "desc": [ + "【enabled】 : 有効かどうか 【bool】", + "【onTapOutside】 : 外部タップ監視 【TapRegionCallback?】", + "【onTapInside】 : 内部タップ監視 【TapRegionCallback?】", + "【groupId】 : タップ領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json new file mode 100644 index 00000000..403aeae2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "탭 영역", + "info": "내부 또는 외부 탭 콜백을 감지할 수 있는 구성 요소로, groupId를 통해 여러 영역을 하나로 간주할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "내부 및 외부 탭 구성 요소 감시", + "desc": [ + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 탭 감시 【TapRegionCallback?】", + "【onTapInside】 : 내부 탭 감시 【TapRegionCallback?】", + "【groupId】 : 탭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json new file mode 100644 index 00000000..3402fa25 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Área de Toque", + "info": "Componente capaz de detectar retornos de chamada de toque interno ou externo, através do groupId várias áreas podem ser consideradas como uma só.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorizar toques internos e externos do componente", + "desc": [ + "【enabled】 : Se está disponível 【bool】", + "【onTapOutside】 : Monitorização de toque externo 【TapRegionCallback?】", + "【onTapInside】 : Monitorização de toque interno 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo de área de toque 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json new file mode 100644 index 00000000..f52b260a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Область нажатия", + "info": "Компонент, который может обнаруживать обратные вызовы при нажатии внутри или снаружи, с помощью groupId несколько областей могут рассматриваться как одно целое.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Прослушивание нажатий внутри и снаружи компонента", + "desc": [ + "【enabled】 : Доступен ли 【bool】", + "【onTapOutside】 : Прослушивание нажатия снаружи 【TapRegionCallback?】", + "【onTapInside】 : Прослушивание нажатия внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области нажатия 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json new file mode 100644 index 00000000..240f2dee --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "点击范围", + "info": "能够检测内部或外部点击回调的组件,通过 groupId 可以多个区域视为一体。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听点击组件内部和外部", + "desc": [ + "【enabled】 : 是否可用 【bool】", + "【onTapOutside】 : 点击外界监听 【TapRegionCallback?】", + "【onTapInside】 : 点击内部监听 【TapRegionCallback?】", + "【groupId】 : 点击区域组标识 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart new file mode 100644 index 00000000..57642455 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class TapRegionDemo1 extends StatefulWidget { + const TapRegionDemo1({super.key}); + + @override + State createState() => _TapRegionDemo1State(); +} + +class _TapRegionDemo1State extends State { + String info = 'Tap any where'; + + @override + Widget build(BuildContext context) { + return TapRegion( + onTapOutside: _onTapOutside, + onTapInside: _onTapInside, + child: Container( + alignment: Alignment.center, + height: 64, + width: 160, + color: isOut ? Colors.grey : Colors.blue, + child: Text( + info, + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + + bool get isOut => info.contains('TapOutside'); + + void _onTapOutside(PointerDownEvent event) { + setState(() { + info = "TapOutside:\n${event.position}"; + }); + } + + void _onTapInside(PointerDownEvent event) { + setState(() { + info = "TapInside:\n${event.position}"; + }); + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json new file mode 100644 index 00000000..2a33f026 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Eingabefeld-Klickbereich", + "info": "TapRegion mit der groupId EditableText, der den Klickbereich anderer Komponenten als Teil des Eingabefelds behandelt.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Klicks innerhalb und außerhalb der Komponente überwachen", + "desc": [ + "Im Beispiel wird der Fokus des Eingabefelds nicht aufgehoben, wenn auf das Plus- oder Minuszeichen geklickt wird, und die Tastatur kann weiterhin verwendet werden.", + "【enabled】 : Verfügbar 【bool】", + "【onTapOutside】 : Überwachung von Klicks außerhalb 【TapRegionCallback?】", + "【onTapInside】 : Überwachung von Klicks innerhalb 【TapRegionCallback?】", + "【groupId】 : Gruppenkennung des Klickbereichs 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json new file mode 100644 index 00000000..b42d276c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "TextField Tap Region", + "info": "The TapRegion with groupId as EditableText allows the clickable area of other components to be considered as one with the input field.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitor Clicks Inside and Outside the Component", + "desc": [ + "In the example, clicking the plus and minus signs does not cancel the focus of the input field, and the keyboard can still be used for input.", + "【enabled】 : Whether it is available 【bool】", + "【onTapOutside】 : External click listener 【TapRegionCallback?】", + "【onTapInside】 : Internal click listener 【TapRegionCallback?】", + "【groupId】 : Clickable area group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json new file mode 100644 index 00000000..88bb35b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Área de clic del campo de texto", + "info": "El TapRegion con groupId como EditableText permite que el área de clic de otros componentes se considere como parte del campo de texto.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar clics dentro y fuera del componente", + "desc": [ + "En el ejemplo, al hacer clic en los botones de más y menos, no se cancela el enfoque del campo de texto, y el teclado aún puede escribir.", + "【enabled】 : ¿Está disponible? 【bool】", + "【onTapOutside】 : Escucha de clic fuera 【TapRegionCallback?】", + "【onTapInside】 : Escucha de clic dentro 【TapRegionCallback?】", + "【groupId】 : Identificador del grupo de área de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json new file mode 100644 index 00000000..db182a21 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Zone de clic du champ de saisie", + "info": "Le TapRegion avec groupId pour EditableText permet de considérer la zone de clic d'autres composants comme faisant partie du champ de saisie.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les clics à l'intérieur et à l'extérieur du composant", + "desc": [ + "Dans l'exemple, cliquer sur les boutons plus et moins ne supprime pas le focus du champ de saisie, le clavier reste actif pour la saisie.", + "【enabled】 : Actif ou non 【bool】", + "【onTapOutside】 : Écouteur de clic à l'extérieur 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic à l'intérieur 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de la zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json new file mode 100644 index 00000000..e1e9d93e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Area di clic del campo di testo", + "info": "Il TapRegion con groupId EditableText consente di considerare l'area di clic di altri componenti come parte integrante del campo di testo.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta i clic all'interno e all'esterno del componente", + "desc": [ + "Nell'esempio, cliccando sui pulsanti più e meno, il focus del campo di testo non viene perso e la tastiera rimane attiva per l'input.", + "【enabled】 : Se è abilitato 【bool】", + "【onTapOutside】 : Ascolta i clic all'esterno 【TapRegionCallback?】", + "【onTapInside】 : Ascolta i clic all'interno 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo dell'area di clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json new file mode 100644 index 00000000..a4ea1125 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "テキストフィールドタップ範囲", + "info": "groupId が EditableText の TapRegion で、他のコンポーネントのタップ範囲をテキストフィールドと一体化させることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "クリックコンポーネントの内部と外部を監視", + "desc": [ + "ケースでプラスとマイナスをクリックしても、テキストフィールドのフォーカスは解除されず、キーボードで入力が可能です。", + "【enabled】 : 有効かどうか 【bool】", + "【onTapOutside】 : 外部クリック監視 【TapRegionCallback?】", + "【onTapInside】 : 内部クリック監視 【TapRegionCallback?】", + "【groupId】 : タップ領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json new file mode 100644 index 00000000..a42cb79e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "입력란 클릭 범위", + "info": "groupId가 EditableText인 TapRegion으로, 다른 컴포넌트의 클릭 범위를 입력란과 일체로 간주할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "컴포넌트 내부 및 외부 클릭 감지", + "desc": [ + "예시에서 더하기 및 빼기 버튼을 클릭해도 입력란의 포커스가 해제되지 않으며, 키보드로 입력이 가능합니다.", + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 클릭 감지 【TapRegionCallback?】", + "【onTapInside】 : 내부 클릭 감지 【TapRegionCallback?】", + "【groupId】 : 클릭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json new file mode 100644 index 00000000..9561c633 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Área de Clique da Caixa de Texto", + "info": "O TapRegion com groupId como EditableText permite que a área de clique de outros componentes seja considerada como parte da caixa de texto.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorar Cliques Dentro e Fora do Componente", + "desc": [ + "No exemplo, clicar nos botões de adicionar e subtrair não cancela o foco da caixa de texto, e o teclado ainda pode ser usado para digitar.", + "【enabled】 : Disponível ou não 【bool】", + "【onTapOutside】 : Monitoramento de clique fora 【TapRegionCallback?】", + "【onTapInside】 : Monitoramento de clique dentro 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo da área de clique 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json new file mode 100644 index 00000000..aace9a55 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Область нажатия текстового поля", + "info": "TapRegion с groupId EditableText позволяет рассматривать область нажатия других компонентов как единое целое с текстовым полем.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Слушатель нажатий внутри и снаружи компонента", + "desc": [ + "В примере нажатие на плюс и минус не снимает фокус с текстового поля, и клавиатура все еще может вводить текст.", + "【enabled】 : Доступно ли 【bool】", + "【onTapOutside】 : Слушатель нажатий снаружи 【TapRegionCallback?】", + "【onTapInside】 : Слушатель нажатий внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области нажатия 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json new file mode 100644 index 00000000..2b4b488f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "输入框点击范围", + "info": "groupId 为 EditableText 的 TapRegion,可以让其他组件的点击范围与输入框视为一体。", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听点击组件内部和外部", + "desc": [ + "案例中点击加号和减号,不会取消输入框的焦点,键盘仍然可以输入。", + "【enabled】 : 是否可用 【bool】", + "【onTapOutside】 : 点击外界监听 【TapRegionCallback?】", + "【onTapInside】 : 点击内部监听 【TapRegionCallback?】", + "【groupId】 : 点击区域组标识 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart new file mode 100644 index 00000000..7ca7d1c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +class TextFieldTapRegionDemo1 extends StatefulWidget { + const TextFieldTapRegionDemo1({super.key}); + + @override + State createState() => _TextFieldTapRegionDemo1State(); +} + +class _TextFieldTapRegionDemo1State extends State { + TextEditingController controller = TextEditingController(text: '0'); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 160, + child: Row( + children: [ + Expanded(child: _buildInput()), + const SizedBox(width: 8), + TextFieldTapRegion(child: buildButtons()) + ], + ), + ); + } + + Widget _buildInput() { + return TextField( + autofocus: true, + decoration: const InputDecoration( + border: OutlineInputBorder(), + ), + onChanged: _onChange, + controller: controller, + textAlign: TextAlign.center, + ); + } + + void _onChange(String value) {} + + Widget buildButtons() { + ButtonStyle style = circleStyle; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + OutlinedButton( + style: style, + onPressed: _increment, + child: const Icon(Icons.add, size: 16), + ), + const SizedBox(height: 2), + OutlinedButton( + onPressed: _decrement, + style: style, + child: const Icon(Icons.remove, size: 16), + ), + ], + ); + } + + ButtonStyle get circleStyle => OutlinedButton.styleFrom( + shape: const StadiumBorder(), + padding: EdgeInsets.zero, + minimumSize: const Size(32, 32), + maximumSize: const Size(32, 32), + ); + + void _increment() { + int value = int.tryParse(controller.text) ?? 0; + _updateText('${value + 1}', collapsed: true); + } + + void _decrement() { + int value = int.tryParse(controller.text) ?? 0; + _updateText('${value - 1}', collapsed: true); + } + + void _updateText(String text, {bool collapsed = true}) { + if (text != controller.text) { + controller.value = TextEditingValue( + text: text, + ); + } + } +} diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json new file mode 100644 index 00000000..4f6ecf63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformation", + "info": "Kann ein Unterelement aufnehmen und kann das Unterelement über eine 4*4-Transformationsmatrix transformieren.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Schieftransformation skew", + "desc": [ + "Die Schiefe x wird durch die Zahl R0C1 gesteuert, der Eingabeparameter ist ein Bogenmaßwert, der den Schiefewinkel darstellt", + "Die Schiefe y wird durch die Zahl R1C0 gesteuert, der Eingabeparameter ist ein Bogenmaßwert, der den Schiefewinkel darstellt" + ] + }, + { + "file": "node2_translation.dart", + "name": "Verschiebungstransformation translationValues", + "desc": [ + "Die Verschiebung x wird durch die Zahl R0C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt", + "Die Verschiebung y wird durch die Zahl R1C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt", + "Die Verschiebung z wird durch die Zahl R2C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt" + ] + }, + { + "file": "node3_scale.dart", + "name": "Skalierungstransformation diagonal3Values", + "desc": [ + "Die Skalierung x wird durch die Zahl R0C0 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt", + "Die Skalierung y wird durch die Zahl R1C2 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt", + "Die Skalierung z wird durch die Zahl R2C2 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Rotationstransformation rotation", + "desc": [ + "Die x-Rotation wird durch R1C1, R1C2, R2C1, R2C2 gesteuert, der Eingabeparameter stellt ein Bogenmaß dar", + "Die y-Rotation wird durch R0C0, R0C2, R2C0, R2C2 gesteuert, der Eingabeparameter stellt ein Bogenmaß dar", + "Die z-Rotation wird durch R0C0, R0C1, R1C0, R1C1 gesteuert" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Perspektivtransformation rotation", + "desc": [ + "Die Perspektive wird durch R3C1, R3C2, R3C3 gesteuert" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json new file mode 100644 index 00000000..789280b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transform", + "info": "Can accommodate a child component, and can transform the child component through a 4*4 transformation matrix.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Skew Transform skew", + "desc": [ + "Skew x is controlled by the R0C1 number, the input is in radians, representing the skew angle", + "Skew y is controlled by the R1C0 number, the input is in radians, representing the skew angle" + ] + }, + { + "file": "node2_translation.dart", + "name": "Translation Transform translationValues", + "desc": [ + "Translation x is controlled by the R0C3 number, the input is a value, representing the translation length", + "Translation y is controlled by the R1C3 number, the input is a value, representing the translation length", + "Translation z is controlled by the R2C3 number, the input is a value, representing the translation length" + ] + }, + { + "file": "node3_scale.dart", + "name": "Scale Transform diagonal3Values", + "desc": [ + "Scale x is controlled by the R0C0 number, the input is a value, representing the scaling factor", + "Scale y is controlled by the R1C2 number, the input is a value, representing the scaling factor", + "Scale z is controlled by the R2C2 number, the input is a value, representing the scaling factor" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Rotation Transform rotation", + "desc": [ + "x rotation is controlled by R1C1, R1C2, R2C1, R2C2, the input represents radians", + "y rotation is controlled by R0C0, R0C2, R2C0, R2C2, the input represents radians", + "z rotation is controlled by R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Perspective Transform rotation", + "desc": [ + "Perspective is controlled by R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json new file mode 100644 index 00000000..079d402e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformación", + "info": "Puede contener un subcomponente, y se puede transformar el subcomponente mediante una matriz de transformación 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformación de sesgo skew", + "desc": [ + "El sesgo x está controlado por el número R0C1, el parámetro de entrada es un valor en radianes, que representa el ángulo de sesgo.", + "El sesgo y está controlado por el número R1C0, el parámetro de entrada es un valor en radianes, que representa el ángulo de sesgo." + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformación de traslación translationValues", + "desc": [ + "La traslación x está controlada por el número R0C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación.", + "La traslación y está controlada por el número R1C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación.", + "La traslación z está controlada por el número R2C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación." + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformación de escala diagonal3Values", + "desc": [ + "La escala x está controlada por el número R0C0, el parámetro de entrada es un valor numérico, que representa la tasa de escala.", + "La escala y está controlada por el número R1C2, el parámetro de entrada es un valor numérico, que representa la tasa de escala.", + "La escala z está controlada por el número R2C2, el parámetro de entrada es un valor numérico, que representa la tasa de escala." + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformación de rotación rotation", + "desc": [ + "La rotación x está controlada por R1C1, R1C2, R2C1, R2C2, el parámetro de entrada representa radianes.", + "La rotación y está controlada por R0C0, R0C2, R2C0, R2C2, el parámetro de entrada representa radianes.", + "La rotación z está controlada por R0C0, R0C1, R1C0, R1C1." + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformación de perspectiva rotation", + "desc": [ + "La perspectiva está controlada por R3C1, R3C2, R3C3." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json new file mode 100644 index 00000000..3057ac29 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformation", + "info": "Peut contenir un composant enfant, et peut transformer le composant enfant via une matrice de transformation 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformation en biais skew", + "desc": [ + "Le biais x est contrôlé par le nombre R0C1, l'entrée est une valeur en radians, représentant l'angle de biais", + "Le biais y est contrôlé par le nombre R1C0, l'entrée est une valeur en radians, représentant l'angle de biais" + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformation de translation translationValues", + "desc": [ + "La translation x est contrôlée par le nombre R0C3, l'entrée est une valeur numérique, représentant la longueur de la translation", + "La translation y est contrôlée par le nombre R1C3, l'entrée est une valeur numérique, représentant la longueur de la translation", + "La translation z est contrôlée par le nombre R2C3, l'entrée est une valeur numérique, représentant la longueur de la translation" + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformation de mise à l'échelle diagonal3Values", + "desc": [ + "La mise à l'échelle x est contrôlée par le nombre R0C0, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle", + "La mise à l'échelle y est contrôlée par le nombre R1C2, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle", + "La mise à l'échelle z est contrôlée par le nombre R2C2, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformation de rotation rotation", + "desc": [ + "La rotation x est contrôlée par R1C1, R1C2, R2C1, R2C2, l'entrée représente des radians", + "La rotation y est contrôlée par R0C0, R0C2, R2C0, R2C2, l'entrée représente des radians", + "La rotation z est contrôlée par R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformation de perspective rotation", + "desc": [ + "La perspective est contrôlée par R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json new file mode 100644 index 00000000..7c069639 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Trasformazione", + "info": "Può contenere un componente figlio e può trasformare il componente figlio tramite una matrice di trasformazione 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Trasformazione inclinata skew", + "desc": [ + "L'inclinazione x è controllata dal numero R0C1, il parametro è un valore in radianti, che rappresenta l'angolo di inclinazione", + "L'inclinazione y è controllata dal numero R1C0, il parametro è un valore in radianti, che rappresenta l'angolo di inclinazione" + ] + }, + { + "file": "node2_translation.dart", + "name": "Trasformazione di traslazione translationValues", + "desc": [ + "La traslazione x è controllata dal numero R0C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione", + "La traslazione y è controllata dal numero R1C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione", + "La traslazione z è controllata dal numero R2C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione" + ] + }, + { + "file": "node3_scale.dart", + "name": "Trasformazione di scala diagonal3Values", + "desc": [ + "La scala x è controllata dal numero R0C0, il parametro è un valore numerico, che rappresenta il fattore di scala", + "La scala y è controllata dal numero R1C2, il parametro è un valore numerico, che rappresenta il fattore di scala", + "La scala z è controllata dal numero R2C2, il parametro è un valore numerico, che rappresenta il fattore di scala" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Trasformazione di rotazione rotation", + "desc": [ + "La rotazione x è controllata da R1C1, R1C2, R2C1, R2C2, il parametro rappresenta i radianti", + "La rotazione y è controllata da R0C0, R0C2, R2C0, R2C2, il parametro rappresenta i radianti", + "La rotazione z è controllata da R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Trasformazione prospettica rotation", + "desc": [ + "La prospettiva è controllata da R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json new file mode 100644 index 00000000..9b422585 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "変換", + "info": "子コンポーネントを収容でき、4*4の変換マトリックスを使用して子コンポーネントを変換できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "スキュー変換skew", + "desc": [ + "スキューxはR0C1の数値で制御され、入力はラジアン値で、スキュー角度を表します", + "スキューyはR1C0の数値で制御され、入力はラジアン値で、スキュー角度を表します" + ] + }, + { + "file": "node2_translation.dart", + "name": "平行移動変換translationValues", + "desc": [ + "平行移動xはR0C3の数値で制御され、入力は数値で、平行移動の長さを表します", + "平行移動yはR1C3の数値で制御され、入力は数値で、平行移動の長さを表します", + "平行移動zはR2C3の数値で制御され、入力は数値で、平行移動の長さを表します" + ] + }, + { + "file": "node3_scale.dart", + "name": "スケール変換diagonal3Values", + "desc": [ + "スケールxはR0C0の数値で制御され、入力は数値で、スケールの比率を表します", + "スケールyはR1C2の数値で制御され、入力は数値で、スケールの比率を表します", + "スケールzはR2C2の数値で制御され、入力は数値で、スケールの比率を表します" + ] + }, + { + "file": "node4_rotate.dart", + "name": "回転変換rotation", + "desc": [ + "x回転はR1C1、R1C2、R2C1、R2C2で制御され、入力はラジアンを表します", + "y回転はR0C0、R0C2、R2C0、R2C2で制御され、入力はラジアンを表します", + "z回転はR0C0、R0C1、R1C0、R1C1で制御されます" + ] + }, + { + "file": "node5_perspective.dart", + "name": "遠近法変換rotation", + "desc": [ + "遠近法はR3C1、R3C2、R3C3で制御されます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json new file mode 100644 index 00000000..efe55467 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "변환", + "info": "하위 컴포넌트를 수용할 수 있으며, 4*4 변환 행렬을 통해 하위 컴포넌트를 변환할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "기울임 변환 skew", + "desc": [ + "x 기울임은 R0C1 숫자로 제어되며, 입력은 라디안 값으로 기울임 각도를 나타냅니다.", + "y 기울임은 R1C0 숫자로 제어되며, 입력은 라디안 값으로 기울임 각도를 나타냅니다." + ] + }, + { + "file": "node2_translation.dart", + "name": "이동 변환 translationValues", + "desc": [ + "x 이동은 R0C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다.", + "y 이동은 R1C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다.", + "z 이동은 R2C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다." + ] + }, + { + "file": "node3_scale.dart", + "name": "크기 조절 변환 diagonal3Values", + "desc": [ + "x 크기 조절은 R0C0 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다.", + "y 크기 조절은 R1C2 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다.", + "z 크기 조절은 R2C2 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다." + ] + }, + { + "file": "node4_rotate.dart", + "name": "회전 변환 rotation", + "desc": [ + "x 회전은 R1C1, R1C2, R2C1, R2C2로 제어되며, 입력은 라디안 값을 나타냅니다.", + "y 회전은 R0C0, R0C2, R2C0, R2C2로 제어되며, 입력은 라디안 값을 나타냅니다.", + "z 회전은 R0C0, R0C1, R1C0, R1C1로 제어됩니다." + ] + }, + { + "file": "node5_perspective.dart", + "name": "원근 변환 rotation", + "desc": [ + "R3C1, R3C2, R3C3로 원근을 제어합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json new file mode 100644 index 00000000..368179eb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformação", + "info": "Pode acomodar um subcomponente, pode transformar o subcomponente através de uma matriz de transformação 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformação de inclinação skew", + "desc": [ + "A inclinação x é controlada pelo número R0C1, o parâmetro de entrada é o valor em radianos, indicando o ângulo de inclinação", + "A inclinação y é controlada pelo número R1C0, o parâmetro de entrada é o valor em radianos, indicando o ângulo de inclinação" + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformação de translação translationValues", + "desc": [ + "A translação x é controlada pelo número R0C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação", + "A translação y é controlada pelo número R1C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação", + "A translação z é controlada pelo número R2C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação" + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformação de escala diagonal3Values", + "desc": [ + "A escala x é controlada pelo número R0C0, o parâmetro de entrada é um valor numérico, indicando a taxa de escala", + "A escala y é controlada pelo número R1C2, o parâmetro de entrada é um valor numérico, indicando a taxa de escala", + "A escala z é controlada pelo número R2C2, o parâmetro de entrada é um valor numérico, indicando a taxa de escala" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformação de rotação rotation", + "desc": [ + "A rotação x é controlada por R1C1, R1C2, R2C1, R2C2, o parâmetro de entrada representa radianos", + "A rotação y é controlada por R0C0, R0C2, R2C0, R2C2, o parâmetro de entrada representa radianos", + "A rotação z é controlada por R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformação de perspetiva rotation", + "desc": [ + "A perspetiva é controlada por R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json new file mode 100644 index 00000000..a77e34e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Преобразование", + "info": "Может содержать один дочерний компонент, который может быть преобразован с использованием матрицы преобразования 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Наклонное преобразование skew", + "desc": [ + "Наклон по x управляется числом R0C1, входной параметр - значение в радианах, обозначающее угол наклона", + "Наклон по y управляется числом R1C0, входной параметр - значение в радианах, обозначающее угол наклона" + ] + }, + { + "file": "node2_translation.dart", + "name": "Преобразование перемещения translationValues", + "desc": [ + "Перемещение по x управляется числом R0C3, входной параметр - числовое значение, обозначающее длину перемещения", + "Перемещение по y управляется числом R1C3, входной параметр - числовое значение, обозначающее длину перемещения", + "Перемещение по z управляется числом R2C3, входной параметр - числовое значение, обозначающее длину перемещения" + ] + }, + { + "file": "node3_scale.dart", + "name": "Преобразование масштабирования diagonal3Values", + "desc": [ + "Масштабирование по x управляется числом R0C0, входной параметр - числовое значение, обозначающее коэффициент масштабирования", + "Масштабирование по y управляется числом R1C2, входной параметр - числовое значение, обозначающее коэффициент масштабирования", + "Масштабирование по z управляется числом R2C2, входной параметр - числовое значение, обозначающее коэффициент масштабирования" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Преобразование вращения rotation", + "desc": [ + "Вращение по x управляется числами R1C1, R1C2, R2C1, R2C2, входной параметр - значение в радианах", + "Вращение по y управляется числами R0C0, R0C2, R2C0, R2C2, входной параметр - значение в радианах", + "Вращение по z управляется числами R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Преобразование перспективы rotation", + "desc": [ + "Перспектива управляется числами R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json new file mode 100644 index 00000000..74a4da8c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "变换", + "info": "可容纳一个子组件,可以通过一个4*4的变换矩阵对子组件进行变换。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "斜切变换skew", + "desc": [ + "斜切x由R0C1数控制,入参为弧度值,表示斜切角度", + "斜切y由R1C0数控制,入参为弧度值,表示斜切角度" + ] + }, + { + "file": "node2_translation.dart", + "name": "平移变换translationValues", + "desc": [ + "平移x由R0C3数控制,入参为数值,表示平移长度", + "平移y由R1C3数控制,入参为数值,表示平移长度", + "平移z由R2C3数控制,入参为数值,表示平移长度" + ] + }, + { + "file": "node3_scale.dart", + "name": "缩放变换diagonal3Values", + "desc": [ + "缩放x由R0C0数控制,入参为数值,表示缩放分率", + "缩放y由R1C2数控制,入参为数值,表示缩放分率", + "缩放z由R2C2数控制,入参为数值,表示缩放分率" + ] + }, + { + "file": "node4_rotate.dart", + "name": "旋转变换rotation", + "desc": [ + "x旋转由R1C1、R1C2、R2C1、R2C2控制,入参表示弧度", + "y旋转由R0C0、R0C2、R2C0、R2C2控制,入参表示弧度", + "z旋转由R0C0、R0C1、R1C0、R1C1控制," + ] + }, + { + "file": "node5_perspective.dart", + "name": "透视变换rotation", + "desc": [ + "由R3C1、R3C2、R3C3控制透视" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart similarity index 87% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart index 1743e757..6fd4a91f 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart @@ -5,15 +5,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '斜切变换skew', -// "priority": 1, -// "subtitle": "斜切x由R0C1数控制,入参为弧度值,表示斜切角度\n" -// "斜切y由R1C0数控制,入参为弧度值,表示斜切角度", -// } class SkewTransform extends StatefulWidget { const SkewTransform({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart similarity index 85% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart index b560fb3f..0c67ffa1 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart @@ -4,16 +4,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '平移变换translationValues', -// "priority": 2, -// "subtitle": "平移x由R0C3数控制,入参为数值,表示平移长度\n" -// "平移y由R1C3数控制,入参为数值,表示平移长度\n" -// "平移z由R2C3数控制,入参为数值,表示平移长度", -// } class TranslationTransform extends StatefulWidget { const TranslationTransform({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart similarity index 85% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart index dc292ede..9d0e9a0c 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart @@ -3,16 +3,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '缩放变换diagonal3Values', -// "priority": 3, -// "subtitle": "缩放x由R0C0数控制,入参为数值,表示缩放分率\n" -// "缩放y由R1C2数控制,入参为数值,表示缩放分率\n" -// "缩放z由R2C2数控制,入参为数值,表示缩放分率", -// } class ScaleTransform extends StatefulWidget { const ScaleTransform({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart similarity index 87% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart index ac251ab2..569d2d28 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart @@ -6,16 +6,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '旋转变换rotation', -// "priority": 4, -// "subtitle": "x旋转由R1C1、R1C2、R2C1、R2C2控制,入参表示弧度\n" -// "y旋转由R0C0、R0C2、R2C0、R2C2控制,入参表示弧度\n" -// "z旋转由R0C0、R0C1、R1C0、R1C1控制,入参表示弧度\n" -// } class RotateTransform extends StatefulWidget { const RotateTransform({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart similarity index 90% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart index 1875ee5e..09890b82 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '透视变换rotation', -// "priority": 5, -// "subtitle": "由R3C1、R3C2、R3C3控制透视", -// } class R3C2 extends StatefulWidget { const R3C2({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json new file mode 100644 index 00000000..c53fc137 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Unbegrenzte Box", + "info": "Kann ein Unterelement aufnehmen und hebt alle Bereichsbeschränkungen dieses Elements auf, um seine eigene Größe zu zeigen.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von UnconstrainedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【constrainedAxis】 : Noch eingeschränkte Achse*2 【Axis】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json new file mode 100644 index 00000000..0173f769 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Unconstrained Box", + "info": "Can contain a child component and remove all area constraints of the component, displaying its own size.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of UnconstrainedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【constrainedAxis】: Axes still constrained*2 【Axis】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json new file mode 100644 index 00000000..d66a2aa2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Caja sin restricciones", + "info": "Puede contener un componente hijo y elimina todas las restricciones de área de ese componente, mostrando su tamaño propio.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de UnconstrainedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【constrainedAxis】 : Eje aún restringido*2 【Axis】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json new file mode 100644 index 00000000..2062709c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Boîte sans contrainte", + "info": "Peut contenir un composant enfant et libère toutes les contraintes de zone de ce composant, montrant sa taille réelle.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'UnconstrainedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【constrainedAxis】 : Axe toujours contraint*2 【Axis】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json new file mode 100644 index 00000000..399a4548 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Scatola senza vincoli", + "info": "Può contenere un componente figlio e rimuove tutti i vincoli di area di quel componente, mostrando le proprie dimensioni.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di UnconstrainedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【constrainedAxis】 : Asse ancora vincolato*2 【Axis】", + "【alignment】 : Allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json new file mode 100644 index 00000000..5d603883 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "無制約ボックス", + "info": "子コンポーネントを収容し、そのコンポーネントのすべての領域制約を解除し、自己サイズを表示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【constrainedAxis】 : 制約を受ける軸*2 【Axis】", + "【alignment】 : 整列方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json new file mode 100644 index 00000000..334a6f72 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "제약 없는 상자", + "info": "하위 컴포넌트를 수용하고 해당 컴포넌트의 모든 영역 제약을 해제하여 자체 크기를 표시합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【constrainedAxis】 : 여전히 제약을 받는 축*2 【Axis】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json new file mode 100644 index 00000000..37b03da3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Caixa sem Restrições", + "info": "Pode conter um componente filho e remove todas as restrições de área desse componente, exibindo o seu próprio tamanho.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do UnconstrainedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【constrainedAxis】 : Eixo ainda restrito*2 【Axis】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json new file mode 100644 index 00000000..b9a740d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Неограниченный контейнер", + "info": "Может содержать один дочерний компонент и снимает все ограничения области для этого компонента, позволяя ему отображать свои собственные размеры.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование UnconstrainedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【constrainedAxis】 : Ось, которая остается ограниченной*2 【Axis】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json new file mode 100644 index 00000000..77714ac3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "无约束盒", + "info": "可容纳一个子组件,并解除该组件的所有区域约束,展现自我尺寸。", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【constrainedAxis】 : 仍受约束的轴*2 【Axis】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart new file mode 100644 index 00000000..e2d622f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com + +class CustomUnConstrainedBox extends StatefulWidget { + const CustomUnConstrainedBox({Key? key}) : super(key: key); + + @override + _CustomUnConstrainedBoxState createState() => _CustomUnConstrainedBoxState(); +} + +class _CustomUnConstrainedBoxState extends State { + bool _value = false; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [_buildUnconstrainedBox(), _buildConstrainedAxis()], + ); + } + + Widget _buildUnconstrainedBox() { + Widget child = Container( + color: Colors.cyanAccent, + width: 60, + height: 60, + child: Switch( + value: _value, + onChanged: (v) { + setState(() { + _value = v; + }); + }, + ), + ); + + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(22), + width: 150, + height: 100, + child: _value + ? UnconstrainedBox(alignment: Alignment.center, child: child) + : child, + ), + Text(_value ? "已解除约束" : "子组件受约束") + ], + ); + } + + Widget _buildConstrainedAxis() { + return Column( + children: [ + Container( + color: Colors.grey.withAlpha(22), + width: 150, + height: 100, + child: UnconstrainedBox( + alignment: Alignment.center, + constrainedAxis: Axis.vertical, + child: Container( + color: Colors.cyanAccent, + width: 60, + height: 60, + )), + ), + const Text("竖直方向仍约束") + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..f93798a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver-Navigationsleiste", + "info": "Navigationsleisten-Effekt in iOS11, der largeTitle beim Ausklappen anzeigt, beim Hochscrollen der Liste jedoch nicht. Wenn middle leer ist, wird der largeTitle in kleiner Schriftgröße als middle angezeigt.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Navigationsleiste", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【middle】 : Mittlere Komponente 【Widget】", + "【trailing】 : Rechte Komponente 【Widget】", + "【largeTitle】 : Untere ausklappbare Komponente 【Widget】", + "【border】 : Randlinie 【Border】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【padding】 : Innenabstand 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json new file mode 100644 index 00000000..d639ce44 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver Navigation Bar", + "info": "The navigation bar effect in iOS11, the largeTitle is displayed when expanded, and it is not displayed when the list is scrolled up. If the middle is empty, the largeTitle will be displayed as the middle in a smaller font size.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Navigation Bar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【largeTitle】: Bottom expandable component 【Widget】", + "【border】: Border 【Border】", + "【backgroundColor】: Background color 【Color】", + "【padding】: Padding 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..2442c5d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra de navegación Sliver", + "info": "Efecto de la barra de navegación en iOS11, el largeTitle se muestra cuando se expande, no se muestra cuando la lista se desliza hacia arriba. Si el middle está vacío, el largeTitle se mostrará como middle con un tamaño de fuente pequeño.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de la barra de navegación", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente derecho 【Widget】", + "【largeTitle】 : Componente de expansión inferior 【Widget】", + "【border】 : Borde 【Border】", + "【backgroundColor】 : Color de fondo 【Color】", + "【padding】 : Relleno interno 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..125aec02 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barre de navigation Sliver", + "info": "Effet de la barre de navigation dans iOS11, le largeTitle s'affiche lors du déploiement, disparaît lors du défilement vers le haut de la liste. Si le middle est vide, le largeTitle sera affiché en petite taille comme middle.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de la barre de navigation", + "desc": [ + "【leading】 : Composant de gauche 【Widget】", + "【middle】 : Composant du milieu 【Widget】", + "【trailing】 : Composant de droite 【Widget】", + "【largeTitle】 : Composant de déploiement en bas 【Widget】", + "【border】 : Bordure 【Border】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..07b5f945 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra di navigazione Sliver", + "info": "Effetto della barra di navigazione in iOS11, il largeTitle viene visualizzato quando espanso, non viene visualizzato quando la lista scorre verso l'alto, se il middle è vuoto, il largeTitle verrà visualizzato come middle con un carattere più piccolo.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base della barra di navigazione", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】 : Componente centrale 【Widget】", + "【trailing】 : Componente finale 【Widget】", + "【largeTitle】 : Componente di espansione inferiore 【Widget】", + "【border】 : Bordo 【Border】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..1f1abc56 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliverナビゲーションバー", + "info": "iOS11のナビゲーションバー効果で、展開時にlargeTitleが表示され、リストを上にスクロールすると表示されなくなります。もしmiddleが空の場合、largeTitleは小さいフォントサイズでmiddleとして表示されます。", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ナビゲーションバーの基本使用", + "desc": [ + "【leading】 : 左側のコンポーネント 【Widget】", + "【middle】 : 中間のコンポーネント 【Widget】", + "【trailing】 : 末尾のコンポーネント 【Widget】", + "【largeTitle】 : 下部折りたたみコンポーネント 【Widget】", + "【border】 : ボーダー 【Border】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内側の余白 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..d0388828 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver 네비게이션 바", + "info": "iOS11에서의 네비게이션 바 효과, 펼칠 때 largeTitle이 표시되며, 리스트를 위로 스크롤하면 표시되지 않습니다. middle이 비어 있으면 largeTitle이 작은 글자 크기로 middle로 표시됩니다.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "네비게이션 바 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】 : 중간 컴포넌트 【Widget】", + "【trailing】 : 오른쪽 컴포넌트 【Widget】", + "【largeTitle】 : 하단 확장 컴포넌트 【Widget】", + "【border】 : 테두리 【Border】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 안쪽 여백 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..e363bc47 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra de navegação Sliver", + "info": "Efeito da barra de navegação no iOS11, o largeTitle é exibido quando expandido, não é exibido quando a lista é deslizada para cima, se o middle estiver vazio, o largeTitle será exibido como middle com um tamanho de fonte menor.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico da barra de navegação", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【middle】 : Componente do meio 【Widget】", + "【trailing】 : Componente da cauda 【Widget】", + "【largeTitle】 : Componente de expansão inferior 【Widget】", + "【border】 : Borda 【Border】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Preenchimento interno 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..a51f90df --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver навигационная панель", + "info": "Эффект навигационной панели в iOS11, largeTitle отображается при раскрытии, не отображается при прокрутке списка вверх. Если middle пуст, largeTitle будет отображаться как middle с меньшим размером шрифта.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование навигационной панели", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】 : Средний компонент 【Widget】", + "【trailing】 : Хвостовой компонент 【Widget】", + "【largeTitle】 : Нижний раскрывающийся компонент 【Widget】", + "【border】 : Граница 【Border】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренний отступ 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..4182f302 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver导航条", + "info": "iOS11中导航条效果,展开时largeTitle显示,列表上滑后不显示,如果middle为空,largeTitle会以小字号作为middle。", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "导航条基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】 : 中间组件 【Widget】", + "【trailing】 : 尾部组件 【Widget】", + "【largeTitle】 : 底部折展组件 【Widget】", + "【border】 : 边线 【Border】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart new file mode 100644 index 00000000..00c448f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart @@ -0,0 +1,88 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class CupertinoSliverNavigationBarDemo extends StatelessWidget { + const CupertinoSliverNavigationBarDemo({super.key}); + + List get data => [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + CupertinoSliverNavigationBar( + trailing: const Icon( + CupertinoIcons.share, + size: 25, + ), + leading: _buildLeading(), + backgroundColor: Colors.white, + // middle: Text('张风捷特烈'), + largeTitle: Row( + mainAxisSize: MainAxisSize.min, + children: const [ + Icon( + Icons.ac_unit, + size: 20, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: Text('张风捷特烈'), + ), + Icon(Icons.ac_unit, size: 20), + ], + ), + ), + _buildSliverList() + ], + ), + ); + } + + Widget _buildSliverList() => SliverPrototypeExtentList( + prototypeItem: Container( + height: 40, + ), + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json new file mode 100644 index 00000000..3e180a10 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver Aktualisierungssteuerung", + "info": "iOS-Stil Pull-to-Refresh-Steuerung, die asynchrone Aktualisierungsmethoden, benutzerdefinierte Steuerungskomponenten, die Höhe des Indikators und die Höhe des Auslösens des Ladens durchziehen kann.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Aktualisierungssteuerung", + "desc": [ + "【refreshIndicatorExtent】 : Höhe des Ladeindikators 【double】", + "【refreshTriggerPullDistance】 : Höhe des Auslösens des Ladens durchziehen 【double】", + "【onRefresh】 : Pull-to-Refresh-Ereignis 【RefreshCallback】", + "【builder】 : Indikator-Builder 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json new file mode 100644 index 00000000..759043ab --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver Refresh Controller", + "info": "iOS-style pull-to-refresh controller that can execute asynchronous refresh methods, customize controller components, set the height at which the indicator stays, and the scroll height that triggers loading.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Refresh Controller", + "desc": [ + "【refreshIndicatorExtent】: Height of the loading indicator 【double】", + "【refreshTriggerPullDistance】: Scroll height that triggers loading 【double】", + "【onRefresh】: Pull-down event 【RefreshCallback】", + "【builder】: Indicator builder 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json new file mode 100644 index 00000000..b3bbc36d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controlador de actualización Sliver", + "info": "Controlador de actualización de estilo iOS que puede ejecutar métodos de actualización asíncronos, personalizar componentes del controlador, altura de permanencia del indicador y altura de deslizamiento para activar la carga.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del controlador de actualización", + "desc": [ + "【refreshIndicatorExtent】 : Altura del indicador de carga 【double】", + "【refreshTriggerPullDistance】 : Altura de deslizamiento para activar la carga 【double】", + "【onRefresh】 : Evento de deslizamiento hacia abajo 【RefreshCallback】", + "【builder】 : Constructor del indicador 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json new file mode 100644 index 00000000..97e8293d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Contrôleur de rafraîchissement Sliver", + "info": "Contrôleur de rafraîchissement de style iOS, capable d'exécuter des méthodes de rafraîchissement asynchrones, de personnaliser les composants du contrôleur, la hauteur de séjour de l'indicateur et la hauteur de glissement pour déclencher le chargement.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du contrôleur de rafraîchissement", + "desc": [ + "【refreshIndicatorExtent】 : Hauteur de l'indicateur de chargement 【double】", + "【refreshTriggerPullDistance】 : Hauteur de glissement pour déclencher le chargement 【double】", + "【onRefresh】 : Événement de glissement vers le bas 【RefreshCallback】", + "【builder】 : Constructeur de l'indicateur 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json new file mode 100644 index 00000000..657a1847 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controller di aggiornamento Sliver", + "info": "Controller di aggiornamento a stile iOS, esegue metodi di aggiornamento asincroni, personalizza i componenti del controller, l'altezza di sosta dell'indicatore e l'altezza di scorrimento per attivare il caricamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base del controller di aggiornamento", + "desc": [ + "【refreshIndicatorExtent】 : Altezza dell'indicatore di caricamento 【double】", + "【refreshTriggerPullDistance】 : Altezza di scorrimento per attivare il caricamento 【double】", + "【onRefresh】 : Evento di trascinamento verso il basso 【RefreshCallback】", + "【builder】 : Costruttore dell'indicatore 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json new file mode 100644 index 00000000..2ef32644 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliverリフレッシュコントローラー", + "info": "iOSスタイルのプルダウンリフレッシュコントローラーで、非同期リフレッシュメソッドの実行、カスタムコントローラーコンポーネント、インジケーターの停留高さ、およびロードをトリガーするスワイプ高さを設定できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "リフレッシュコントローラーの基本使用", + "desc": [ + "【refreshIndicatorExtent】 : ロード中インジケーターの高さ 【double】", + "【refreshTriggerPullDistance】 : ロードをトリガーするスワイプ高さ 【double】", + "【onRefresh】 : プルダウンイベント 【RefreshCallback】", + "【builder】 : インジケーターコンストラクター 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json new file mode 100644 index 00000000..dc59fef1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver 새로고침 컨트롤러", + "info": "iOS 스타일의 풀다운 새로고침 컨트롤러로, 비동기 새로고침 메소드 실행, 사용자 정의 컨트롤러 컴포넌트, 인디케이터 고정 높이 및 로딩을 트리거하는 스와이프 높이를 설정할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "새로고침 컨트롤러 기본 사용", + "desc": [ + "【refreshIndicatorExtent】 : 로딩 중 인디케이터 높이 【double】", + "【refreshTriggerPullDistance】 : 로딩을 트리거하는 스와이프 높이 【double】", + "【onRefresh】 : 풀다운 이벤트 【RefreshCallback】", + "【builder】 : 인디케이터 빌더 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json new file mode 100644 index 00000000..dfcb1391 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controlador de Atualização Sliver", + "info": "Controlador de atualização de deslizar para baixo no estilo iOS, capaz de executar métodos de atualização assíncronos, personalizar componentes do controlador, altura de permanência do indicador e altura de deslize para acionar o carregamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Controlador de Atualização", + "desc": [ + "【refreshIndicatorExtent】 : Altura do indicador de carregamento 【double】", + "【refreshTriggerPullDistance】 : Altura de deslize para acionar o carregamento 【double】", + "【onRefresh】 : Evento de deslizar para baixo 【RefreshCallback】", + "【builder】 : Construtor do indicador 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json new file mode 100644 index 00000000..ba7d2b0e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver контроллер обновления", + "info": "Контроллер обновления в стиле iOS, который может выполнять асинхронные методы обновления, настраивать компоненты контроллера, высоту остановки индикатора и высоту скольжения для запуска загрузки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование контроллера обновления", + "desc": [ + "【refreshIndicatorExtent】 : Высота индикатора загрузки 【double】", + "【refreshTriggerPullDistance】 : Высота скольжения для запуска загрузки 【double】", + "【onRefresh】 : Событие прокрутки вниз 【RefreshCallback】", + "【builder】 : Конструктор индикатора 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json new file mode 100644 index 00000000..c8ba82c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver刷新控制器", + "info": "iOS风格的下拉刷新控制器,可执行异步刷新方法、自定义控制器组件、指示器停留高度和触发加载的滑动高度。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "刷新控制器基本使用", + "desc": [ + "【refreshIndicatorExtent】 : 加载中指示器高度 【double】", + "【refreshTriggerPullDistance】 : 触发加载的滑动高度 【double】", + "【onRefresh】 : 下拉事件 【RefreshCallback】", + "【builder】 : 指示器构造器 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart new file mode 100644 index 00000000..47975d7c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart @@ -0,0 +1,120 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class CupertinoSliverRefreshControlDemo extends StatefulWidget { + const CupertinoSliverRefreshControlDemo({Key? key}) : super(key: key); + + @override + _CupertinoSliverRefreshControlDemoState createState() => + _CupertinoSliverRefreshControlDemoState(); +} + +class _CupertinoSliverRefreshControlDemoState + extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + final Random r = Random(); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics()), + slivers: [ + _buildSliverAppBar(), + CupertinoSliverRefreshControl( + refreshIndicatorExtent: 60, + refreshTriggerPullDistance: 80, + onRefresh: _doRefresh, + ), + _buildSliverList() + ], + ), + ); + } + + Widget _buildSliverList() => SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 120.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + Color randomColor() => Color.fromARGB( + r.nextInt(255), r.nextInt(255), r.nextInt(255), r.nextInt(255)); + + Future _doRefresh() async { + await Future.delayed(const Duration(seconds: 2)); + setState(() { + data.insertAll(0, [randomColor()]); + }); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json new file mode 100644 index 00000000..65808d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Allgemeine Scroll-Ansicht", + "info": "Eine allgemeine Scroll-Struktur, die Eigenschaften wie Scroll-Richtung, ob umgekehrt, Scroll-Controller usw. festlegen kann. Die darin enthaltenen Unterkomponenten müssen zur Sliver-Familie gehören.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CustomScrollView", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】", + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scroll-Richtung 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json new file mode 100644 index 00000000..5eb90c19 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "General Scroll View", + "info": "A general scroll structure that can specify properties such as scroll direction, whether to reverse, scroll controller, etc. The child components it contains must be from the Sliver family.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CustomScrollView", + "desc": [ + "【slivers】 : Child component list 【List】", + "【reverse】 : Whether to reverse 【bool】", + "【scrollDirection】 : Scroll direction 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json new file mode 100644 index 00000000..8544d175 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Vista de desplazamiento universal", + "info": "Una estructura de desplazamiento universal que puede especificar la dirección de desplazamiento, si es inverso, el controlador de desplazamiento y otras propiedades. Los componentes secundarios que contiene deben ser de la familia Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CustomScrollView", + "desc": [ + "【slivers】 : Lista de componentes secundarios 【List】", + "【reverse】 : Si es inverso 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json new file mode 100644 index 00000000..3491884b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Vue de défilement universelle", + "info": "Une structure de défilement universelle qui permet de spécifier la direction du défilement, l'inversion, le contrôleur de défilement, etc. Les composants enfants inclus doivent être de la famille Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CustomScrollView", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】", + "【reverse】 : Inversion 【bool】", + "【scrollDirection】 : Direction du défilement 【Axis】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json new file mode 100644 index 00000000..ef4f3b17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Visualizzazione a scorrimento universale", + "info": "Una struttura di scorrimento universale che consente di specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà. I componenti figli inclusi devono appartenere alla famiglia Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CustomScrollView", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】", + "【reverse】 : Se invertire 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json new file mode 100644 index 00000000..610f11f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "汎用スクロールビュー", + "info": "汎用的なスクロール構造で、スクロール方向、逆方向かどうか、スクロールコントローラーなどの属性を指定できます。含まれる子コンポーネントはSliverファミリーでなければなりません。", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollViewの基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】", + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json new file mode 100644 index 00000000..5ce0e4b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "일반 스크롤 뷰", + "info": "일반적인 스크롤 구조로, 스크롤 방향, 역방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다. 포함된 하위 컴포넌트들은 반드시 Sliver 패밀리여야 합니다.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollView 기본 사용법", + "desc": [ + "【slivers】 : 하위 컴포넌트 목록 【List】", + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json new file mode 100644 index 00000000..3195984f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Visão de Rolagem Universal", + "info": "Uma estrutura de rolagem universal que pode especificar a direção de rolagem, se é reversa, o controlador de rolagem e outras propriedades. Os componentes filhos incluídos devem ser da família Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CustomScrollView", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】", + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json new file mode 100644 index 00000000..1d1e586b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Универсальная прокрутка", + "info": "Универсальная структура прокрутки, которая позволяет задать направление прокрутки, обратное ли оно, контроллер прокрутки и другие свойства. Вложенные компоненты должны принадлежать семейству Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CustomScrollView", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】", + "【reverse】 : Обратная ли прокрутка 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json new file mode 100644 index 00000000..5bbfabdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "通用滑动视图", + "info": "一个通用的滑动结构,可以指定滑动方向、是否反向、滑动控制器等属性。其中包含的子组件们必须是Sliver家族。", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollView基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】", + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart new file mode 100644 index 00000000..9e482f0f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomScrollViewDemo extends StatelessWidget { + const CustomScrollViewDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + anchor: 0, + scrollDirection: Axis.vertical, + reverse: false, + slivers: [_buildSliverAppBar(), _buildSliverFixedExtentList()], + ), + ); + } + + TextStyle get textStyle => const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]); + + Widget _buildSliverFixedExtentList() => SliverFixedExtentList( + itemExtent: 60, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: data[index], + child: Text( + colorString(data[index]), + style: textStyle, + ), + ), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + title: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.black, //标题 + shadows: [ + Shadow( + color: Colors.blue, + offset: Offset(1, 1), + blurRadius: 2, + ) + ]), + ), + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json new file mode 100644 index 00000000..c5891b0d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Dekorierte Gleitfläche", + "info": "Diese Komponente wird in einem Scroll-Viewport verwendet und kann ein untergeordnetes Sliver-Element umhüllen, um ihm einen Dekorationseffekt hinzuzufügen.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von DecoratedSliver", + "desc": [ + "【sliver】 : Kindkomponente 【Widget?】", + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【position】 : Dekorationsposition 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json new file mode 100644 index 00000000..8a4de0b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Decorated Sliver", + "info": "This component is used in sliding viewports and can wrap a child Sliver component to add Decoration effects.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of DecoratedSliver", + "desc": [ + "【sliver】: Child component 【Widget?】", + "【decoration】: Decoration object 【Decoration】", + "【position】: Decoration position 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json new file mode 100644 index 00000000..78ade3b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Panel deslizante decorado", + "info": "Este componente se aplica en ventanas deslizantes y puede envolver un componente Sliver hijo para agregar efectos de decoración Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de DecoratedSliver", + "desc": [ + "【sliver】 : Componente hijo 【Widget?】", + "【decoration】 : Objeto de decoración 【Decoration】", + "【position】 : Posición de la decoración 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json new file mode 100644 index 00000000..2a9b5860 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Glissière décorée", + "info": "Ce composant est utilisé dans une vue défilante et peut envelopper un composant Sliver enfant pour ajouter un effet de décoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de DecoratedSliver", + "desc": [ + "【sliver】 : Composant enfant 【Widget?】", + "【decoration】 : Objet de décoration 【Decoration】", + "【position】 : Position de la décoration 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json new file mode 100644 index 00000000..b9b45c95 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Decorazione Sliver", + "info": "Questo componente viene utilizzato in una vista scorrevole e può avvolgere un componente Sliver figlio, aggiungendo un effetto decorativo Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di DecoratedSliver", + "desc": [ + "【sliver】 : Componente figlio 【Widget?】", + "【decoration】 : Oggetto decorativo 【Decoration】", + "【position】 : Posizione della decorazione 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json new file mode 100644 index 00000000..4bff3278 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "装飾スライバー", + "info": "このコンポーネントはスクロールビューで使用され、子スライバーコンポーネントをラップして、装飾効果を追加します。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver の基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget?】", + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【position】 : 装飾位置 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json new file mode 100644 index 00000000..8ea23507 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "장식 슬라이더", + "info": "이 컴포넌트는 슬라이딩 뷰포트에 적용되며, 자식 Sliver 컴포넌트를 감싸서 Decoration 장식 효과를 추가할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver 기본 사용법", + "desc": [ + "【sliver】 : 자식 컴포넌트 【Widget?】", + "【decoration】 : 장식 객체 【Decoration】", + "【position】 : 장식 위치 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json new file mode 100644 index 00000000..d55a2668 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Slider Decorado", + "info": "Este componente é aplicado em portas de visualização deslizantes, pode envolver um componente Sliver filho, adicionando um efeito de decoração Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do DecoratedSliver", + "desc": [ + "【sliver】 : Componente filho 【Widget?】", + "【decoration】 : Objeto de decoração 【Decoration】", + "【position】 : Posição da decoração 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json new file mode 100644 index 00000000..633b7d75 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Декорированный слайдер", + "info": "Этот компонент используется в прокручиваемых окнах и может обернуть дочерний компонент Sliver, добавляя эффекты декорации Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование DecoratedSliver", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget?】", + "【decoration】 : Объект декорации 【Decoration】", + "【position】 : Позиция декорации 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json new file mode 100644 index 00000000..ea9dfa29 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "装饰滑片", + "info": "该组件应用于滑动视口中,可以包裹一个子 Sliver 组件,为其添加 Decoration 装饰效果。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver 基本使用", + "desc": [ + "【sliver】 : 孩子组件 【Widget?】", + "【decoration】 : 装饰对象 【Decoration】", + "【position】 : 装饰位置 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart new file mode 100644 index 00000000..85379eae --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com + +class DecorationSliverDemo extends StatelessWidget { + const DecorationSliverDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverPadding( + padding: const EdgeInsets.all(8), + sliver: DecoratedSliver( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + boxShadow: const [ + BoxShadow( + color: Color(0xFF111133), + blurRadius: 2, + offset: Offset(-2, -1)) + ], + gradient: LinearGradient( + colors: const [ + Color(0xFFEEEEEE), + Color(0xFF111133), + ], + stops: const [0.1, 1.0], + ), + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) => Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Text( + '张风捷特烈-$index', + style: TextStyle(fontSize: 24, color: Colors.white), + )), + ), + childCount: 128), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json new file mode 100644 index 00000000..36a9e492 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Dehnbarer Raumleiste", + "info": "Wird normalerweise im dehnbaren Bereich von SliverAppBar verwendet und kann Titel, Titelabstand, Hintergrund, Faltmodus usw. angeben.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FlexibleSpaceBar", + "desc": [ + "【title】 : Titelkomponente 【Widget】", + "【titlePadding】 : Titelabstand 【EdgeInsetsGeometry】", + "【collapseMode】 : Faltmodus 【CollapseMode】", + "【stretchModes】 : Dehnmodi 【List】", + "【background】 : Hintergrundkomponente 【Widget】", + "【centerTitle】 : Zentralisiert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json new file mode 100644 index 00000000..fee8b71a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Stretch Space Bar", + "info": "Typically used in the stretchable area of SliverAppBar, it can specify the title, title spacing, background, collapse mode, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FlexibleSpaceBar", + "desc": [ + "【title】 : Title component 【Widget】", + "【titlePadding】 : Title spacing 【EdgeInsetsGeometry】", + "【collapseMode】 : Collapse mode 【CollapseMode】", + "【stretchModes】 : Stretch modes 【List】", + "【background】 : Background component 【Widget】", + "【centerTitle】 : Whether to center 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json new file mode 100644 index 00000000..04bd8a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra de espacio flexible", + "info": "Normalmente se utiliza en la región extensible de SliverAppBar, donde se pueden especificar el título, el espaciado del título, el fondo, el modo de plegado, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FlexibleSpaceBar", + "desc": [ + "【title】 : Componente de título 【Widget】", + "【titlePadding】 : Espaciado del título 【EdgeInsetsGeometry】", + "【collapseMode】 : Modo de plegado 【CollapseMode】", + "【stretchModes】 : Modos de extensión 【List】", + "【background】 : Componente de fondo 【Widget】", + "【centerTitle】 : Centrado o no 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json new file mode 100644 index 00000000..7af61bbf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barre d'espace flexible", + "info": "Utilisé généralement dans la zone extensible de SliverAppBar, permet de spécifier le titre, l'espacement du titre, l'arrière-plan, le mode de repli, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FlexibleSpaceBar", + "desc": [ + "【title】 : Composant de titre 【Widget】", + "【titlePadding】 : Espacement du titre 【EdgeInsetsGeometry】", + "【collapseMode】 : Mode de repli 【CollapseMode】", + "【stretchModes】 : Modes d'extension 【List】", + "【background】 : Composant d'arrière-plan 【Widget】", + "【centerTitle】 : Centré ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json new file mode 100644 index 00000000..0fbf71be --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra spaziale flessibile", + "info": "Utilizzata solitamente nell'area estensibile di SliverAppBar, può specificare titolo, spaziatura del titolo, sfondo, modalità di collasso, ecc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di FlexibleSpaceBar", + "desc": [ + "【title】 : Componente del titolo 【Widget】", + "【titlePadding】 : Spaziatura del titolo 【EdgeInsetsGeometry】", + "【collapseMode】 : Modalità di collasso 【CollapseMode】", + "【stretchModes】 : Modalità di estensione 【List】", + "【background】 : Componente di sfondo 【Widget】", + "【centerTitle】 : Centrato o meno 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json new file mode 100644 index 00000000..b0b59ec1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "伸縮スペースバー", + "info": "通常、SliverAppBar内の伸縮可能な領域に使用され、タイトル、タイトルの間隔、背景、折りたたみモードなどを指定できます。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBarの基本使用", + "desc": [ + "【title】 : タイトルコンポーネント 【Widget】", + "【titlePadding】 : タイトルの間隔 【EdgeInsetsGeometry】", + "【collapseMode】 : 折りたたみモード 【CollapseMode】", + "【stretchModes】 : 伸縮モード 【List】", + "【background】 : 背景コンポーネント 【Widget】", + "【centerTitle】 : 中央揃えかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json new file mode 100644 index 00000000..50308618 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "확장 가능한 공간 바", + "info": "일반적으로 SliverAppBar에서 확장 가능한 영역으로 사용되며, 제목, 제목 간격, 배경, 접기 모드 등을 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBar 기본 사용법", + "desc": [ + "【title】 : 제목 컴포넌트 【Widget】", + "【titlePadding】 : 제목 간격 【EdgeInsetsGeometry】", + "【collapseMode】 : 접기 모드 【CollapseMode】", + "【stretchModes】 : 확장 모드 【List】", + "【background】 : 배경 컴포넌트 【Widget】", + "【centerTitle】 : 중앙 정렬 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json new file mode 100644 index 00000000..16985132 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra de Espaço Flexível", + "info": "Normalmente usado na área expansível de um SliverAppBar, pode especificar o título, espaçamento do título, fundo, modo de recolhimento, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FlexibleSpaceBar", + "desc": [ + "【title】 : Componente do título 【Widget】", + "【titlePadding】 : Espaçamento do título 【EdgeInsetsGeometry】", + "【collapseMode】 : Modo de recolhimento 【CollapseMode】", + "【stretchModes】 : Modos de extensão 【List】", + "【background】 : Componente de fundo 【Widget】", + "【centerTitle】 : Centralizar 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json new file mode 100644 index 00000000..a0a1a9fe --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Растягивающееся пространство", + "info": "Обычно используется в растягиваемой области SliverAppBar, можно указать заголовок, отступы заголовка, фон, режим сворачивания и т.д.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FlexibleSpaceBar", + "desc": [ + "【title】 : Заголовок 【Widget】", + "【titlePadding】 : Отступ заголовка 【EdgeInsetsGeometry】", + "【collapseMode】 : Режим сворачивания 【CollapseMode】", + "【stretchModes】 : Режимы растяжения 【List】", + "【background】 : Фон 【Widget】", + "【centerTitle】 : Центрировать заголовок 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json new file mode 100644 index 00000000..af842005 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "伸展空间栏", + "info": "通常用于SliverAppBar中的可伸展区域,可指定标题、标题间距、背景、折叠模式等。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBar基本使用", + "desc": [ + "【title】 : 标题组件 【Widget】", + "【titlePadding】 : 标题间距 【EdgeInsetsGeometry】", + "【collapseMode】 : 折叠模式 【CollapseMode】", + "【stretchModes】 : 延伸模式 【List】", + "【background】 : 背景组件 【Widget】", + "【centerTitle】 : 是否居中 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart new file mode 100644 index 00000000..ba132525 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + + +class FlexibleSpaceBarDemo extends StatelessWidget { + const FlexibleSpaceBarDemo({super.key}); + + List get data => [ + Colors.blue[50]!, + Colors.blue[100]!, + Colors.blue[200]!, + Colors.blue[300]!, + Colors.blue[400]!, + Colors.blue[500]!, + Colors.blue[600]!, + Colors.blue[700]!, + Colors.blue[800]!, + Colors.blue[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverFixedExtentList()], + ), + ); + } + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + actions: _buildActions(), + pinned: true, + backgroundColor: Colors.blue, + flexibleSpace: FlexibleSpaceBar(//伸展处布局 + centerTitle: false, + title: const Text( + '张风捷特烈', + style: TextStyle(shadows: [ + Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2) + ]), + ), + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), + //标题边距 + collapseMode: CollapseMode.parallax, + //视差效果 + stretchModes: const [StretchMode.blurBackground, StretchMode.zoomBackground], + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + Widget _buildSliverFixedExtentList() => SliverFixedExtentList( + itemExtent: 60, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json new file mode 100644 index 00000000..a7a8130b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Fixierter Header-Sliver", + "info": "Ein Sliver, der am oberen Rand des Viewports verbleiben kann und den Effekt des Festklebens einfach erreicht.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver offizielles Beispiel", + "display": "new_page", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget?】", + "PinnedHeaderSliver kann nur in Scroll-Viewports verwendet werden, wobei die untergeordnete Komponente beim Scrollen nach oben nicht aus dem Viewport verschwindet, sondern am oberen Rand des Viewports verbleibt." + ] + }, + { + "file": "node_02.dart", + "name": "Titel festkleben", + "display": "new_page", + "desc": [ + "Ein auf PinnedHeaderSliver basierender Effekt, bei dem der Titel festklebt. Beachten Sie, dass auch die Trennlinie unten den Effekt des Festklebens hat." + ] + }, + { + "file": "node_03.dart", + "name": "Titel+Suche festkleben", + "display": "new_page", + "desc": [ + "Ein auf PinnedHeaderSliver basierender Effekt, bei dem der Titel und das Suchfeld festkleben." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json new file mode 100644 index 00000000..cd8ac1f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Pinned Header Sliver", + "info": "A sliver that can stay at the top of the viewport, easily achieving a sticky header effect.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver Official Example", + "display": "new_page", + "desc": [ + "【child】 : Child widget 【Widget?】", + "PinnedHeaderSliver can only be used in a scroll viewport, where the child widget will not move out of the viewport when scrolling to the top, thus staying above the viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Sticky Header", + "display": "new_page", + "desc": [ + "The sticky header effect implemented based on PinnedHeaderSliver, note that the divider below also has a sticky effect." + ] + }, + { + "file": "node_03.dart", + "name": "Sticky Header + Search", + "display": "new_page", + "desc": [ + "The sticky header + search box effect implemented based on PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json new file mode 100644 index 00000000..520a0506 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Cabecera Fija Deslizante", + "info": "Un panel deslizante que puede permanecer en la parte superior de la ventana gráfica, logrando fácilmente el efecto de fijación en la parte superior.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Ejemplo oficial de PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente hijo 【Widget?】", + "PinnedHeaderSliver solo se puede usar en ventanas gráficas desplazables, donde el componente hijo no sale de la ventana gráfica cuando se desliza hacia la parte superior, permaneciendo así en la parte superior de la ventana gráfica." + ] + }, + { + "file": "node_02.dart", + "name": "Título fijado en la parte superior", + "display": "new_page", + "desc": [ + "Efecto de título fijado en la parte superior basado en PinnedHeaderSliver, observe que la línea divisoria inferior también tiene el efecto de fijación en la parte superior." + ] + }, + { + "file": "node_03.dart", + "name": "Título + Búsqueda fijada en la parte superior", + "display": "new_page", + "desc": [ + "Efecto de título + cuadro de búsqueda fijado en la parte superior basado en PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json new file mode 100644 index 00000000..0e1a5c81 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Glissière d'en-tête fixe", + "info": "Une glissière qui peut rester en haut de la vue, permettant de réaliser facilement un effet de fixation en haut.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Exemple officiel de PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Composant enfant 【Widget?】", + "PinnedHeaderSliver ne peut être utilisé que dans une vue défilante, où le composant enfant ne sort pas de la vue lorsqu'il est glissé vers le haut, restant ainsi en haut de la vue." + ] + }, + { + "file": "node_02.dart", + "name": "Titre fixé en haut", + "display": "new_page", + "desc": [ + "Effet de titre fixé en haut basé sur PinnedHeaderSliver, notez que la ligne de séparation en dessous a également un effet de fixation en haut." + ] + }, + { + "file": "node_03.dart", + "name": "Titre + recherche fixés en haut", + "display": "new_page", + "desc": [ + "Effet de titre + boîte de recherche fixés en haut basé sur PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json new file mode 100644 index 00000000..29a97b67 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Sliver con intestazione fissa", + "info": "Uno sliver che può rimanere nella parte superiore della viewport, per ottenere facilmente l'effetto di adesione in cima.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Esempio ufficiale di PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente figlio 【Widget?】", + "PinnedHeaderSliver può essere utilizzato solo in una viewport scorrevole, dove il componente figlio, quando scorre verso l'alto, non esce dalla viewport, rimanendo così nella parte superiore della viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Intestazione adesiva", + "display": "new_page", + "desc": [ + "Effetto di intestazione adesiva realizzato con PinnedHeaderSliver, nota che anche la linea di separazione sotto ha un effetto adesivo." + ] + }, + { + "file": "node_03.dart", + "name": "Intestazione + ricerca adesiva", + "display": "new_page", + "desc": [ + "Effetto di intestazione e casella di ricerca adesiva realizzato con PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json new file mode 100644 index 00000000..dd19b43d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "固定ヘッダースライバー", + "info": "ビューポート上部に留まるスライバーで、簡単に吸着効果を実現できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 公式サンプル", + "display": "new_page", + "desc": [ + "【child】 : 子コンポーネント 【Widget?】", + "PinnedHeaderSliver はスクロールビューポートでのみ使用でき、子コンポーネントはトップにスクロールしてもビューポートから出ず、ビューポート上部に留まります。" + ] + }, + { + "file": "node_02.dart", + "name": "タイトル吸着", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver に基づいて実装されたタイトル吸着効果です。下の分割線にも吸着効果があることに注意してください。" + ] + }, + { + "file": "node_03.dart", + "name": "タイトル+検索吸着", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver に基づいて実装されたタイトル+検索ボックスの吸着効果です。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json new file mode 100644 index 00000000..2b05b022 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "고정 헤더 슬라이버", + "info": "뷰포트 상단에 고정될 수 있는 슬라이버로, 쉽게 상단 고정 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 공식 예제", + "display": "new_page", + "desc": [ + "【child】 : 자식 위젯 【Widget?】", + "PinnedHeaderSliver는 스크롤 뷰포트에서만 사용할 수 있으며, 자식 위젯이 상단으로 스크롤될 때 뷰포트에서 벗어나지 않고 상단에 고정됩니다." + ] + }, + { + "file": "node_02.dart", + "name": "제목 상단 고정", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver를 기반으로 구현한 제목 상단 고정 효과, 아래 구분선도 상단 고정 효과가 적용된 것을 확인할 수 있습니다." + ] + }, + { + "file": "node_03.dart", + "name": "제목+검색 상단 고정", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver를 기반으로 구현한 제목과 검색창의 상단 고정 효과." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json new file mode 100644 index 00000000..126b966f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Cabeçalho Fixo Deslizante", + "info": "Um painel deslizante que pode permanecer na parte superior da viewport, facilitando o efeito de fixação no topo.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Exemplo Oficial do PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente filho 【Widget?】", + "O PinnedHeaderSliver só pode ser usado em viewports de rolagem, onde o componente filho não sai da viewport ao rolar para o topo, permanecendo assim na parte superior da viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Título Fixo no Topo", + "display": "new_page", + "desc": [ + "Efeito de título fixo no topo baseado no PinnedHeaderSliver, observe que a linha divisória abaixo também tem o efeito de fixação no topo." + ] + }, + { + "file": "node_03.dart", + "name": "Título + Barra de Pesquisa Fixa no Topo", + "display": "new_page", + "desc": [ + "Efeito de título + barra de pesquisa fixa no topo baseado no PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json new file mode 100644 index 00000000..00291bfa --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Фиксированный верхний слайдер", + "info": "Слайдер, который может оставаться в верхней части окна просмотра, легко достигая эффекта прилипания к верху.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Официальный пример PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Дочерний компонент 【Widget?】", + "PinnedHeaderSliver может использоваться только в прокручиваемом окне просмотра, где дочерний компонент при прокрутке до верха не выходит из окна просмотра, а остается в его верхней части." + ] + }, + { + "file": "node_02.dart", + "name": "Прилипание заголовка к верху", + "display": "new_page", + "desc": [ + "Эффект прилипания заголовка к верху, реализованный на основе PinnedHeaderSliver. Обратите внимание, что разделительная линия внизу также имеет эффект прилипания к верху." + ] + }, + { + "file": "node_03.dart", + "name": "Прилипание заголовка и поиска к верху", + "display": "new_page", + "desc": [ + "Эффект прилипания заголовка и поля поиска к верху, реализованный на основе PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json new file mode 100644 index 00000000..86f2cae4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "固定头部滑片", + "info": "一个可以停留在视口上部的滑片, 可轻松完成吸顶效果。", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 官方案例", + "display": "new_page", + "desc": [ + "【child】 : 子组件 【Widget?】", + "PinnedHeaderSliver 只能用在滚动视口中,其中子组件在滑动到顶部时,不会移出视口,从而会停留在视口上方。" + ] + }, + { + "file": "node_02.dart", + "name": "标题吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题吸顶效果,注意看下方的分隔线也有吸顶效果哦。" + ] + }, + { + "file": "node_03.dart", + "name": "标题+搜索吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题+搜索框的吸顶效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart new file mode 100644 index 00000000..ec018062 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart @@ -0,0 +1,115 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + + +class PinnedHeaderSliverNode1 extends StatefulWidget { + const PinnedHeaderSliverNode1({ super.key }); + + @override + State createState() => _PinnedHeaderSliverNode1State(); +} + +class _PinnedHeaderSliverNode1State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + final Widget header = Container( + color: colorScheme.surface, + padding: const EdgeInsets.all(4), + child: Material( + color: colorScheme.primaryContainer, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + width: 7, + color: colorScheme.outline, + ), + ), + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 48), + child: Text( + count.isOdd ? 'Alternative Title\nWith Two Lines' : 'PinnedHeaderSliver', + style: theme.textTheme.headlineMedium!.copyWith( + color: colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ); + + return Scaffold( + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: + CustomScrollView( + controller: scrollController, + slivers: [ + PinnedHeaderSliver(child: header), + const _ItemList(), + ], + ), + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + setState(() { + count += 1; + }); + }, + child: const Icon(Icons.add), + ), + ); + } +} + +// A placeholder SliverList of 25 items. +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return Card( + color: colorScheme.onSecondary, + child: ListTile( + textColor: colorScheme.secondary, + title: Text('Item $index'), + ), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart new file mode 100644 index 00000000..a3c26c8a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart @@ -0,0 +1,109 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PinnedHeaderSliverNode2 extends StatefulWidget { + const PinnedHeaderSliverNode2({super.key}); + + @override + State createState() => _PinnedHeaderSliverNode2State(); +} + +class _PinnedHeaderSliverNode2State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + return Scaffold( + backgroundColor: Colors.white, + body: + CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + const PinnedHeaderSliver(child: Divider()), + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon ); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } +} + +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart new file mode 100644 index 00000000..6028b1f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart @@ -0,0 +1,161 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PinnedHeaderSliverNode3 extends StatefulWidget { + const PinnedHeaderSliverNode3({super.key}); + + @override + State createState() => _PinnedHeaderSliverNode3State(); +} + +class _PinnedHeaderSliverNode3State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + return Scaffold( + backgroundColor: Colors.white, + body: CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + _buildSliverSearch(), + +// PinnedHeaderSliver(child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 12.0), +// child: TextField( +// decoration: InputDecoration( +// filled: true, +// fillColor: Colors.white, +// border: InputBorder.none +// ), +// ), +// )), + + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } + + Widget _buildSliverSearch() { + BoxDecoration decoration = BoxDecoration( + color: const Color(0xffefeff1), borderRadius: BorderRadius.circular(6)); + Widget prefix = const Padding( + padding: EdgeInsets.only(left: 8.0), + child: Icon(CupertinoIcons.search, size: 20, color: Color(0xff808082)) + ); + return PinnedHeaderSliver( + child: ColoredBox( + color: Colors.white, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0, right: 12, left: 12), + child: CupertinoTextField( + readOnly: true, + placeholder: '搜索', + onTap: _toSearchPage, + decoration: decoration, + prefix:prefix, + style: const TextStyle(fontSize: 14), + placeholderStyle: const TextStyle(color: Color(0xff808082)), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + ), + ), + const Divider(), + ], + ), + )); + } + + void _toSearchPage() { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => Scaffold(appBar: AppBar(title: const Text('SearchPage')))), + ); + } +} + +// A placeholder SliverList of 25 items. +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme + .of(context) + .colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json new file mode 100644 index 00000000..3b1fdbf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver animierte Liste", + "info": "Eine Sliver-Komponente, die beim Einfügen oder Entfernen von Elementen Animationseffekte erzeugt.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverAnimatedList", + "desc": [ + "【itemBuilder】 : Item-Konstruktor 【AnimatedListItemBuilder】", + "【initialItemCount】 : Anfangszahl der Items 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json new file mode 100644 index 00000000..aebb2f92 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver Animated List", + "info": "A sliver component that animates items when they are inserted or removed.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverAnimatedList", + "desc": [ + "【itemBuilder】: Item builder 【AnimatedListItemBuilder】", + "【initialItemCount】: Initial item count 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json new file mode 100644 index 00000000..d25e85a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista animada Sliver", + "info": "Componente sliver que anima los elementos al insertar o eliminar.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverAnimatedList", + "desc": [ + "【itemBuilder】: Constructor de elementos 【AnimatedListItemBuilder】", + "【initialItemCount】: Número inicial de elementos 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json new file mode 100644 index 00000000..5286a69e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Liste animée Sliver", + "info": "Un composant sliver qui anime les éléments lors de leur insertion ou suppression.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverAnimatedList", + "desc": [ + "【itemBuilder】 : constructeur d'item 【AnimatedListItemBuilder】", + "【initialItemCount】 : nombre initial d'items 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json new file mode 100644 index 00000000..10b79a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista animata Sliver", + "info": "Componente sliver che aggiunge effetti animati quando si inseriscono o rimuovono elementi.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverAnimatedList", + "desc": [ + "【itemBuilder】: costruttore di item 【AnimatedListItemBuilder】", + "【initialItemCount】: numero iniziale di item 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json new file mode 100644 index 00000000..c161c7a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliverアニメーションリスト", + "info": "アイテムを挿入または削除する際にアニメーション効果を持つsliverコンポーネント。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList基本使用", + "desc": [ + "【itemBuilder】 : アイテムビルダー 【AnimatedListItemBuilder】", + "【initialItemCount】 : 初期アイテム数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json new file mode 100644 index 00000000..623980fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver 애니메이션 리스트", + "info": "항목을 삽입하거나 삭제할 때 애니메이션 효과를 주는 sliver 컴포넌트입니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList 기본 사용", + "desc": [ + "【itemBuilder】 : 아이템 생성기 【AnimatedListItemBuilder】", + "【initialItemCount】 : 초기 아이템 개수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json new file mode 100644 index 00000000..f05bec08 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista Animada Sliver", + "info": "Componente sliver que anima itens ao inserir ou remover.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverAnimatedList", + "desc": [ + "【itemBuilder】: construtor de itens 【AnimatedListItemBuilder】", + "【initialItemCount】: número inicial de itens 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json new file mode 100644 index 00000000..f1897729 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Анимированный список Sliver", + "info": "Компонент Sliver, который анимирует элементы при их вставке или удалении.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverAnimatedList", + "desc": [ + "【itemBuilder】: конструктор элемента 【AnimatedListItemBuilder】", + "【initialItemCount】: начальное количество элементов 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json new file mode 100644 index 00000000..3e96db1f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver动画列表", + "info": "在插入或删除项目时使其有动画效果的sliver组件。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList基本使用", + "desc": [ + "【itemBuilder】 : item构造器 【AnimatedListItemBuilder】", + "【initialItemCount】 : 初始item个数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart new file mode 100644 index 00000000..033918cb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart @@ -0,0 +1,192 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class SliverAnimatedListDemo extends StatefulWidget { + const SliverAnimatedListDemo({Key? key}) : super(key: key); + + @override + _SliverAnimatedListDemoState createState() => + _SliverAnimatedListDemoState(); +} + +class _SliverAnimatedListDemoState extends State { + + final GlobalKey _listKey = GlobalKey(); + late ListModel _list; + int? _selectedItem; + int _nextItem=0; + + @override + void initState() { + super.initState(); + _list = ListModel( + listKey: _listKey, + initialItems: [0, 1, 2], + removedItemBuilder: _buildRemovedItem, + ); + _nextItem = 3; + } + + Widget _buildItem(BuildContext context, int index, Animation animation) { + return CardItem( + animation: animation, + item: _list[index], + selected: _selectedItem == _list[index], + onTap: () { + setState(() { + _selectedItem = _selectedItem == _list[index] ? null : _list[index]; + }); + }, + ); + } + + Widget _buildRemovedItem(int item, BuildContext context, Animation animation) { + return CardItem( + animation: animation, + item: item, + selected: false, + ); + } + + void _insert() { + final int index = _selectedItem == null ? _list.length : _list.indexOf(_selectedItem!); + _list.insert(index, _nextItem++); + } + + void _remove() { + if (_selectedItem != null) { + _list.removeAt(_list.indexOf(_selectedItem!)); + setState(() { + _selectedItem = null; + }); + } else { + if(_list.length>0){ + _list.removeAt(0); + setState(() { + _selectedItem = null; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverAppBar( + title: const Text( + 'SliverAnimatedList', + style: TextStyle(fontSize: 20), + ), + expandedHeight: 60, + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.add_circle), + onPressed: _insert, + tooltip: '插入一个item', + iconSize: 32, + ), + actions: [ + IconButton( + icon: const Icon(Icons.remove_circle), + onPressed: _remove, + tooltip: '删除选中的item', + iconSize: 32, + ), + ], + ), + SliverAnimatedList( + key: _listKey, + initialItemCount: _list.length, + itemBuilder: _buildItem, + ), + ], + ), + ); + } + + +} + +class ListModel { + ListModel({ + required this.listKey, + required this.removedItemBuilder, + required Iterable? initialItems, + }) : assert(removedItemBuilder != null), + _items = List.from(initialItems ?? []); + final GlobalKey listKey; + final dynamic removedItemBuilder; + final List _items; + SliverAnimatedListState? get _animatedList => listKey.currentState; + void insert(int index, E item) { + _items.insert(index, item); + _animatedList?.insertItem(index); + } + E removeAt(int index) { + final E removedItem = _items.removeAt(index); + if (removedItem != null) { + _animatedList?.removeItem( + index, + (BuildContext context, Animation animation) => removedItemBuilder(removedItem, context, animation), + ); + } + return removedItem; + } + int get length => _items.length; + E operator [](int index) => _items[index]; + int indexOf(E item) => _items.indexOf(item); +} + + +class CardItem extends StatelessWidget { + const CardItem({ + Key? key, + required this.animation, + required this.item, + this.onTap, + this.selected = false, + }) :super(key: key); + final Animation animation; + final VoidCallback? onTap; + final int item; + final bool selected; + @override + Widget build(BuildContext context) { + return Padding( + padding: + const EdgeInsets.only( + left: 2.0, + right: 2.0, + top: 2.0, + bottom: 0.0, + ), + child: SizeTransition( + axis: Axis.vertical, + sizeFactor: animation, + child: GestureDetector( + onTap: onTap, + child: SizedBox( + height: 60.0, + child: Card( + color: selected + ? Colors.black12 + : Colors.primaries[item % Colors.primaries.length], + child: Center( + child: Text( + 'Item $item', + style: const TextStyle(color: Colors.white,fontSize: 16), + ), + ), + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json new file mode 100644 index 00000000..ed587190 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver-Kopfleiste", + "info": "Die allgemeine Struktur der oberen Leiste der Sliver-Familie, die linke, mittlere und rechte Komponenten, Schrumpfraum, Schattentiefe, Festmodus, Hintergrundfarbe usw. angeben kann.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverAppBar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【title】 : Mittlere Komponente 【Widget】", + "【actions】 : Liste der rechten Komponenten 【List】", + "【floating】 : Ob schwebend 【bool】", + "【pinned】 : Ob oben verbleibend 【bool】", + "【snap】 : Ob halb zusammengeklappt 【bool】", + "【bottom】 : Untere Komponente 【PreferredSizeWidget】", + "【expandedHeight】 : Erweiterungshöhe 【double】", + "【elevation】 : Schattentiefe 【double】", + "【flexibleSpace】 : Erweiterungsraum 【FlexibleSpaceBar】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【controller】 : Controller 【ScrollController】", + " Wenn snap true ist, muss floating true sein" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json new file mode 100644 index 00000000..d149c4ec --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver Header Bar", + "info": "A common structure for the top bar of the Sliver family, which can specify left, center, and right components, collapse space, shadow depth, fixed mode, background color, and other properties.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverAppBar", + "desc": [ + "【leading】: Left component 【Widget】", + "【title】: Center component 【Widget】", + "【actions】: List of trailing components 【List】", + "【floating】: Whether to float 【bool】", + "【pinned】: Whether to stay at the top 【bool】", + "【snap】: Whether to semi-collapse 【bool】", + "【bottom】: Bottom component 【PreferredSizeWidget】", + "【expandedHeight】: Expanded height 【double】", + "【elevation】: Shadow depth 【double】", + "【flexibleSpace】: Expanded space 【FlexibleSpaceBar】", + "【backgroundColor】: Background color 【Color】", + "【controller】: Controller 【ScrollController】", + " When snap is true, floating must be true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json new file mode 100644 index 00000000..561d9e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra superior Sliver", + "info": "Estructura común de la barra superior de la familia Sliver, que puede especificar componentes izquierdos, centrales y derechos, espacio de contracción, profundidad de sombra, modo fijo, color de fondo, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverAppBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Lista de componentes finales 【List】", + "【floating】 : Si flota 【bool】", + "【pinned】 : Si se queda en la parte superior 【bool】", + "【snap】 : Si se contrae parcialmente 【bool】", + "【bottom】 : Componente inferior 【PreferredSizeWidget】", + "【expandedHeight】 : Altura extendida 【double】", + "【elevation】 : Profundidad de sombra 【double】", + "【flexibleSpace】 : Espacio extendido 【FlexibleSpaceBar】", + "【backgroundColor】 : Color de fondo 【Color】", + "【controller】 : Controlador 【ScrollController】", + " snap debe ser true cuando floating es true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json new file mode 100644 index 00000000..875a641f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barre d'en-tête Sliver", + "info": "Structure générique de la barre supérieure de la famille Sliver, qui peut spécifier des composants gauche, centre et droit, un espace de rétrécissement, une profondeur d'ombre, un mode fixe, une couleur d'arrière-plan, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverAppBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【title】 : Composant central 【Widget】", + "【actions】 : Liste des composants de fin 【List】", + "【floating】 : Flottant ou non 【bool】", + "【pinned】 : Reste en haut ou non 【bool】", + "【snap】 : Semi-déployé ou non 【bool】", + "【bottom】 : Composant inférieur 【PreferredSizeWidget】", + "【expandedHeight】 : Hauteur étendue 【double】", + "【elevation】 : Profondeur d'ombre 【double】", + "【flexibleSpace】 : Espace étendu 【FlexibleSpaceBar】", + "【backgroundColor】 : Couleur d'arrière-plan 【Color】", + "【controller】 : Contrôleur 【ScrollController】", + " snap doit être true lorsque floating est true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json new file mode 100644 index 00000000..3e967d78 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra superiore Sliver", + "info": "Struttura generica della barra superiore della famiglia Sliver, che consente di specificare componenti sinistra, centro e destra, spazio di contrazione, profondità dell'ombra, modalità fissa, colore di sfondo e altre proprietà.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverAppBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【title】 : Componente centrale 【Widget】", + "【actions】 : Lista dei componenti finali 【List】", + "【floating】 : Se fluttuante 【bool】", + "【pinned】 : Se rimane in cima 【bool】", + "【snap】 : Se semi-collassato 【bool】", + "【bottom】 : Componente inferiore 【PreferredSizeWidget】", + "【expandedHeight】 : Altezza estesa 【double】", + "【elevation】 : Profondità dell'ombra 【double】", + "【flexibleSpace】 : Spazio esteso 【FlexibleSpaceBar】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【controller】 : Controller 【ScrollController】", + " Quando snap è true, floating deve essere true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json new file mode 100644 index 00000000..1ccc855e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliverヘッダーバー", + "info": "Sliverファミリーのトップバー共通構造。左中右のコンポーネント、収縮スペース、影の深さ、固定モード、背景色などの属性を指定できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar基本使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【title】 : 中央コンポーネント 【Widget】", + "【actions】 : 末尾コンポーネントリスト 【List】", + "【floating】 : フローティングするか 【bool】", + "【pinned】 : トップに留まるか 【bool】", + "【snap】 : 半収展するか 【bool】", + "【bottom】 : 底部コンポーネント 【PreferredSizeWidget】", + "【expandedHeight】 : 拡張高さ 【double】", + "【elevation】 : 影の深さ 【double】", + "【flexibleSpace】 : 拡張スペース 【FlexibleSpaceBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : コントローラー 【ScrollController】", + " snapがtrueの場合、floatingはtrueである必要があります" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json new file mode 100644 index 00000000..89628f4e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver 헤더 바", + "info": "Sliver 패밀리의 상단 바 공통 구조로, 좌중우 컴포넌트, 축소 공간, 그림자 깊이, 고정 모드, 배경색 등 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar 기본 사용", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【title】 : 중앙 컴포넌트 【Widget】", + "【actions】 : 오른쪽 컴포넌트 리스트 【List】", + "【floating】 : 플로팅 여부 【bool】", + "【pinned】 : 상단 고정 여부 【bool】", + "【snap】 : 반 접힘 여부 【bool】", + "【bottom】 : 하단 컴포넌트 【PreferredSizeWidget】", + "【expandedHeight】 : 확장 높이 【double】", + "【elevation】 : 그림자 깊이 【double】", + "【flexibleSpace】 : 확장 공간 【FlexibleSpaceBar】", + "【backgroundColor】 : 배경색 【Color】", + "【controller】 : 컨트롤러 【ScrollController】", + " snap이 true일 경우 floating은 반드시 true여야 함" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json new file mode 100644 index 00000000..7c2ce222 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra de Cabeçalho Sliver", + "info": "Estrutura comum da barra superior da família Sliver, pode especificar componentes esquerdo, central e direito, espaço de recolhimento, profundidade de sombra, modo fixo, cor de fundo, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverAppBar", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Lista de componentes da cauda 【List】", + "【floating】 : Se flutua 【bool】", + "【pinned】 : Se fica no topo 【bool】", + "【snap】 : Se recolhe parcialmente 【bool】", + "【bottom】 : Componente inferior 【PreferredSizeWidget】", + "【expandedHeight】 : Altura estendida 【double】", + "【elevation】 : Profundidade da sombra 【double】", + "【flexibleSpace】 : Espaço flexível 【FlexibleSpaceBar】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【controller】 : Controlador 【ScrollController】", + " Quando snap é true, floating deve ser true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json new file mode 100644 index 00000000..9cf0712a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver заголовок", + "info": "Общая структура верхней панели семейства Sliver, которая может указывать левый, центральный и правый компоненты, пространство сжатия, глубину тени, фиксированный режим, цвет фона и другие атрибуты.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverAppBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【title】 : Центральный компонент 【Widget】", + "【actions】 : Список конечных компонентов 【List】", + "【floating】 : Плавающий ли 【bool】", + "【pinned】 : Остается ли наверху 【bool】", + "【snap】 : Полузакрытый ли 【bool】", + "【bottom】 : Нижний компонент 【PreferredSizeWidget】", + "【expandedHeight】 : Высота расширения 【double】", + "【elevation】 : Глубина тени 【double】", + "【flexibleSpace】 : Пространство расширения 【FlexibleSpaceBar】", + "【backgroundColor】 : Цвет фона 【Color】", + "【controller】 : Контроллер 【ScrollController】", + " snap true, необходимо floating true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json new file mode 100644 index 00000000..04ea3ea5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver头部栏", + "info": "Sliver家族的顶部栏通用结构,可以指定左中右组件、收缩空间、影深、固定模式、背景色等属性。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【title】 : 中间组件 【Widget】", + "【actions】 : 尾部组件列表 【List】", + "【floating】 : 是否浮动 【bool】", + "【pinned】 : 是否顶部停留 【bool】", + "【snap】 : 是否半收展 【bool】", + "【bottom】 : 底部组件 【PreferredSizeWidget】", + "【expandedHeight】 : 延展高度 【double】", + "【elevation】 : 影深 【double】", + "【flexibleSpace】 : 延展空间 【FlexibleSpaceBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : 控制器 【ScrollController】", + " snap为true时必需floating为true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart new file mode 100644 index 00000000..12cff8d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart @@ -0,0 +1,155 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class SliverAppBarDemo extends StatefulWidget { + const SliverAppBarDemo({Key? key}) : super(key: key); + + @override + _SliverAppBarDemoState createState() => _SliverAppBarDemoState(); +} + +class _SliverAppBarDemoState extends State { + bool _floating = false; + bool _pinned = false; + bool _snap = false; + + final List data = [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildTool(), + SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + _buildSliverAppBar(), + _buildSliverFixedExtentList() + ], + ), + ), + ], + ); + } + + Widget _buildSliverAppBar() { + print(_floating); + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + floating: _floating, + pinned: _pinned, + snap: _snap, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar(//伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + Widget _buildSliverFixedExtentList() => SliverFixedExtentList( + itemExtent: 60, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + Widget _buildTool() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text('floating'), + Switch( + value: _floating, + onChanged: (v) { + if(_snap&&!v){ + _snap =false; + } + setState(() => _floating = v); + }), + ], + ), + Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text('pinned'), + Switch( + value: _pinned, + onChanged: (v) => setState(() => _pinned = v)), + ], + ) ,Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text('snap'), + Switch( + value: _snap, + onChanged: (v) { + if(_floating){ + setState(() => _snap = v); + } + }), + ], + ) + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json new file mode 100644 index 00000000..713fe618 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Kreuzachsen-Größenbeschränkung für Sliver", + "info": "Legt die Größe für eine Sliver-Komponente in der Kreuzachsenrichtung fest, um die Größe des Slivers zu begrenzen.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : Größe 【double】", + "【sliver】 : Untergeordnete Komponente 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json new file mode 100644 index 00000000..bf34df04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Cross Axis Size Constrained Sliver", + "info": "Specifies the size in the cross-axis direction for a Sliver component to constrain the sliver size.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : size 【double】", + "【sliver】 : child component 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json new file mode 100644 index 00000000..d22b986c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Restricción de tamaño en el eje cruzado para Sliver", + "info": "Especifica un tamaño en la dirección del eje cruzado para limitar el tamaño de un componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : tamaño 【double】", + "【sliver】 : componente hijo 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json new file mode 100644 index 00000000..7888ed00 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Contrainte de taille de l'axe transversal pour Sliver", + "info": "Spécifie une taille pour contraindre la dimension d'un composant Sliver dans la direction de l'axe transversal.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : taille 【double】", + "【sliver】 : composant enfant 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json new file mode 100644 index 00000000..1d305ce8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Vincolo dimensionale dell'asse trasversale per Sliver", + "info": "Specifica una dimensione per limitare la dimensione di un componente Sliver nella direzione dell'asse trasversale.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : dimensione 【double】", + "【sliver】 : componente figlio 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json new file mode 100644 index 00000000..5557edd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "クロス軸サイズ制約スライバー", + "info": "Sliverコンポーネントに対して、クロス軸方向にサイズを指定してスライバーのサイズを制限します。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 基本使用", + "desc": [ + "【maxExtent】 : サイズ 【double】", + "【sliver】 : 子コンポーネント 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json new file mode 100644 index 00000000..85817932 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "교차축 크기 제약 슬라이버", + "info": "Sliver 컴포넌트의 교차축 방향에서 크기를 지정하여 슬라이버 크기를 제한합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 기본 사용", + "desc": [ + "【maxExtent】 : 크기 【double】", + "【sliver】 : 자식 컴포넌트 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json new file mode 100644 index 00000000..e6080d01 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Folha de deslizamento com restrição de tamanho do eixo cruzado", + "info": "Especifica o tamanho na direção do eixo cruzado para limitar o tamanho da folha de deslizamento para um componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : Tamanho 【double】", + "【sliver】 : Componente filho 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json new file mode 100644 index 00000000..7029456c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Ограничение размера слайдера по поперечной оси", + "info": "Задает размер для компонента Sliver в направлении поперечной оси, чтобы ограничить размер слайдера.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : размер 【double】", + "【sliver】 : дочерний компонент 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json new file mode 100644 index 00000000..1e66edb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "交叉轴尺寸约束滑片", + "info": "为一个 Sliver 组件在交叉轴方向上,指定尺寸大小来限制滑片尺寸。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 基本使用", + "desc": [ + "【maxExtent】 : 大小 【double】", + "【sliver】 : 子组件 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart new file mode 100644 index 00000000..b591d991 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com + +class SliverConstrainedCrossAxisDemo extends StatelessWidget { + const SliverConstrainedCrossAxisDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverConstrainedCrossAxis( + maxExtent: 100, + sliver: _SliverColorList( + height: 100.0, + fontSize: 24, + count: 8, + color1: Colors.amber[300], + color2: Colors.blue[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 50.0, + fontSize: 20, + count: 6, + color1: Colors.purple[300], + color2: Colors.orange[300], + )), + ], + ), + ], + ), + ); + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json new file mode 100644 index 00000000..7a6e31d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cross-Axis-Erweiterungsschieber", + "info": "Gibt für eine Sliver-Komponente in der Richtung der Querachse einen Flex-Anteil an, um die Größe des Schiebers zu begrenzen.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverCrossAxisExpanded", + "desc": [ + "【flex】 : Anteil 【int】", + "【sliver】 : Untergeordnete Komponente 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json new file mode 100644 index 00000000..9bf13408 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cross Axis Expanded Sliver", + "info": "Specifies the flex ratio in the cross-axis direction for a Sliver component to constrain the size of the sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverCrossAxisExpanded", + "desc": [ + "【flex】: Ratio 【int】", + "【sliver】: Child Component 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json new file mode 100644 index 00000000..15f422ad --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Deslizador Expandido en Eje Cruzado", + "info": "Para un componente Sliver, especifica la proporción flex en la dirección del eje cruzado para limitar el tamaño del deslizador.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proporción 【int】", + "【sliver】 : componente hijo 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json new file mode 100644 index 00000000..d0a99dff --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Glissière d'expansion de l'axe croisé", + "info": "Pour un composant Sliver, spécifie la proportion de flex dans la direction de l'axe croisé pour limiter la taille de la glissière.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proportion 【int】", + "【sliver】 : composant enfant 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json new file mode 100644 index 00000000..0538e9fb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cursore Espanso sull'Asse Incrociato", + "info": "Specifica la proporzione flex per limitare le dimensioni del cursore in direzione dell'asse incrociato per un componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proporzione 【int】", + "【sliver】 : componente figlio 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json new file mode 100644 index 00000000..b8ce18cd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "クロス軸拡張スライバー", + "info": "スライバーコンポーネントのクロス軸方向に、flex比率を指定してスライバーのサイズを制限します。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 基本使用", + "desc": [ + "【flex】 : 比率 【int】", + "【sliver】 : 子コンポーネント 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json new file mode 100644 index 00000000..33dd18a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "교차축 확장 슬라이스", + "info": "Sliver 컴포넌트의 교차축 방향에서 flex 비율을 지정하여 슬라이스 크기를 제한합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 기본 사용", + "desc": [ + "【flex】 : 비율 【int】", + "【sliver】 : 하위 컴포넌트 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json new file mode 100644 index 00000000..52a4b46c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Slider de Expansão do Eixo Cruzado", + "info": "Para um componente Sliver, especifica a proporção flex na direção do eixo cruzado para limitar o tamanho do slider.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverCrossAxisExpanded", + "desc": [ + "【flex】 : Proporção 【int】", + "【sliver】 : Componente Filho 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json new file mode 100644 index 00000000..5982223e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Расширенный слайвер по поперечной оси", + "info": "Для компонента Sliver указывает долю flex в направлении поперечной оси, чтобы ограничить размер слайвера.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverCrossAxisExpanded", + "desc": [ + "【flex】 : доля 【int】", + "【sliver】 : дочерний компонент 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json new file mode 100644 index 00000000..be048a2e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "交叉轴延展滑片", + "info": "为一个 Sliver 组件在交叉轴方向上,指定 flex 占比来限制滑片尺寸。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 基本使用", + "desc": [ + "【flex】 : 占比 【int】", + "【sliver】 : 子组件 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart new file mode 100644 index 00000000..419af803 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com + +class SliverCrossAxisExpandedDemo extends StatelessWidget { + const SliverCrossAxisExpandedDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 50.0, + fontSize: 20, + count: 6, + color1: Colors.purple[300], + color2: Colors.orange[300], + )), + ], + ), + ], + ), + ); + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json new file mode 100644 index 00000000..c9882cb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Kreuzachsen-Gruppe", + "info": "Kann mehrere Sliver-Komponenten aufnehmen und sie in der gleitenden Querhauptachse als Gruppe behandeln.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json new file mode 100644 index 00000000..0a942bf2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Cross Axis Sliver Group", + "info": "Can contain multiple Sliver components, treating them as a group in the cross main axis direction of scrolling.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverCrossAxisGroup", + "desc": [ + "【slivers】 : List of child components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json new file mode 100644 index 00000000..19cfce97 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Grupo de deslizadores en eje cruzado", + "info": "Puede contener múltiples componentes Sliver, tratándolos como un grupo en la dirección del eje principal cruzado durante el desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes hijos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json new file mode 100644 index 00000000..7bb64137 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Groupe de glissières d'axe croisé", + "info": "Peut contenir plusieurs composants Sliver, les traitant comme un groupe dans la direction de l'axe principal de défilement.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json new file mode 100644 index 00000000..ae753b3e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Gruppo di scorrimento dell'asse trasversale", + "info": "Può contenere più componenti Sliver, considerandoli come un gruppo nella direzione dell'asse trasversale durante lo scorrimento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json new file mode 100644 index 00000000..1d063bba --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "クロス軸スライドグループ", + "info": "複数のSliverコンポーネントを収容し、それらをスクロールのクロスメイン軸方向でグループとして扱うことができます。", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json new file mode 100644 index 00000000..1c50ba54 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "교차축 슬라이더 그룹", + "info": "여러 개의 Sliver 컴포넌트를 수용할 수 있으며, 스크롤 교차 주축 방향에서 하나의 그룹으로 간주되도록 합니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 기본 사용법", + "desc": [ + "【slivers】 : 자식 컴포넌트 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json new file mode 100644 index 00000000..576fa851 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Grupo de Slides do Eixo Cruzado", + "info": "Pode acomodar vários componentes Sliver, tratando-os como um grupo na direção do eixo principal cruzado durante o deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json new file mode 100644 index 00000000..752077fb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Группа слайдов по поперечной оси", + "info": "Может содержать несколько компонентов Sliver, позволяя рассматривать их как группу в направлении главной оси скольжения.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json new file mode 100644 index 00000000..a6d2cc9f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "交叉轴滑片组", + "info": "可以容纳多个 Sliver 组件,让它们在滑动的交叉主轴方向上视为一组。", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart new file mode 100644 index 00000000..3533f0f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com + +class SliverCrossAxisGroupDemo extends StatelessWidget { + const SliverCrossAxisGroupDemo({super.key}); + + @override + Widget build(BuildContext context) { + double width = MediaQuery.of(context).size.width; + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverConstrainedCrossAxis( + maxExtent: 100, + sliver: _SliverColorList( + height: 100.0, + fontSize: 24, + count: 8, + color1: Colors.amber[300], + color2: Colors.blue[300], + ), + ), + SliverConstrainedCrossAxis( + maxExtent: width - 100, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + ], + ), + ], + ), + ); + + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json new file mode 100644 index 00000000..5c9d5f77 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver füllt den Rest", + "info": "Ein Sliver, das ein einzelnes Box-Kind enthält und den verbleibenden Platz im Viewport ausfüllt. Es können zwei boolesche Werte angegeben werden, um den Scroll-Effekt zu steuern, wie im folgenden Beispiel gezeigt, um es selbst zu erleben.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Ob es einen Scroll-Body hat 【bool】", + "【fillOverscroll】 : Ob der Scroll-Bereich gefüllt werden kann 【bool】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json new file mode 100644 index 00000000..0b8149b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver Fill Remaining", + "info": "A sliver that contains a single box child element, which fills the remaining space in the viewport. Two boolean values can be specified to control the scrolling effect, as shown in the example below, experience it yourself.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFillRemaining", + "desc": [ + "【hasScrollBody】: Whether it has a scroll body 【bool】", + "【fillOverscroll】: Whether it can fill the scroll area 【bool】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json new file mode 100644 index 00000000..871bd203 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver llenar el espacio restante", + "info": "Un sliver que contiene un solo elemento hijo de tipo box, que llena el espacio restante en la ventana gráfica. Se pueden especificar dos valores booleanos para controlar el efecto de desplazamiento, como en el siguiente ejemplo, para que lo experimentes por ti mismo.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Si tiene un cuerpo de desplazamiento 【bool】", + "【fillOverscroll】 : Si se puede llenar el área de desplazamiento 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json new file mode 100644 index 00000000..0601452f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver remplir le reste", + "info": "Un sliver qui contient un seul élément box, il remplit l'espace restant dans la fenêtre. Deux valeurs booléennes peuvent être spécifiées pour contrôler l'effet de défilement, comme dans l'exemple suivant, à expérimenter par vous-même.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Si le corps a un défilement 【bool】", + "【fillOverscroll】 : Si la zone de défilement peut être remplie 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json new file mode 100644 index 00000000..4d90f745 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver riempie il rimanente", + "info": "Un sliver che contiene un singolo elemento figlio box, che riempie lo spazio rimanente nella finestra. È possibile specificare due valori bool per controllare l'effetto di scorrimento, come nell'esempio seguente, da provare personalmente.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Se ha un corpo di scorrimento 【bool】", + "【fillOverscroll】 : Se può riempire l'area di scorrimento 【bool】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json new file mode 100644 index 00000000..76b57533 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver残りを埋める", + "info": "ビューポート内の残りのスペースを埋める単一のbox子要素を含むsliverです。以下の例のように、スライド効果を制御するために2つのbool値を指定できます。自分で体験してください。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining基本使用", + "desc": [ + "【hasScrollBody】 : スクロール本体を持つかどうか 【bool】", + "【fillOverscroll】 : スクロール領域を埋めることができるかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json new file mode 100644 index 00000000..22432e3e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver 남은 공간 채우기", + "info": "단일 box 자식을 포함하는 sliver로, 뷰포트의 남은 공간을 채웁니다. 아래 예시와 같이 두 개의 bool 값을 지정하여 스크롤 효과를 제어할 수 있습니다. 직접 경험해 보세요.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining 기본 사용법", + "desc": [ + "【hasScrollBody】 : 스크롤 본체 여부 【bool】", + "【fillOverscroll】 : 스크롤 영역 채우기 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json new file mode 100644 index 00000000..e9c9a50e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver preencher restante", + "info": "Um sliver que contém um único elemento box, que preenche o espaço restante na janela de visualização. Dois valores bool podem ser especificados para controlar o efeito de deslizamento, como no exemplo a seguir, experimente você mesmo.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Se tem um corpo de rolagem 【bool】", + "【fillOverscroll】 : Se pode preencher a área de rolagem 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json new file mode 100644 index 00000000..913a2816 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver заполняет оставшееся", + "info": "Sliver, содержащий один дочерний элемент box, который заполняет оставшееся пространство в окне просмотра. Можно указать два логических значения для управления эффектом прокрутки, как показано в следующем примере, попробуйте сами.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Имеет ли прокручиваемую основу 【bool】", + "【fillOverscroll】 : Можно ли заполнить область прокрутки 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json new file mode 100644 index 00000000..19bbb668 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver填补剩余", + "info": "一个包含单个box子元素的sliver,它填充了视窗中的剩余空间。可指定两个bool值控制滑动效果,如下示例,自己体会。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining基本使用", + "desc": [ + "【hasScrollBody】 : 是否具有滚动主体 【bool】", + "【fillOverscroll】 : 是否可填充滚动区域 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart new file mode 100644 index 00000000..e3a0edf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart @@ -0,0 +1,150 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class SliverFillRemainingDemo extends StatefulWidget { + const SliverFillRemainingDemo({Key? key}) : super(key: key); + + @override + _SliverFillRemainingDemoState createState() => + _SliverFillRemainingDemoState(); +} + +class _SliverFillRemainingDemoState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + final Random r = Random(); + + bool hasScrollBody = false; + bool fillOverscroll = true; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), + slivers: [ + _buildSliverAppBar(), + _buildSliverList(), + SliverFillRemaining( + hasScrollBody: hasScrollBody, + fillOverscroll: fillOverscroll, + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage("assets/images/sabar_bar.webp"))), + // // color: Colors.teal[100], + child: _buildBottomChild(), + ), + ), + ], + ), + ); + } + + Widget _buildBottomChild() => Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Wrap( + spacing: 10, + children: [ + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + ), + onPressed: () { + setState(() { + hasScrollBody = !hasScrollBody; + }); + }, + child: Text('hasScrollBody:$hasScrollBody',style: const TextStyle(color: Colors.white),), + ), + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + ), + onPressed: () { + setState(() { + fillOverscroll = !fillOverscroll; + }); + }, + child: Text('fillOverscroll:$fillOverscroll',style: const TextStyle(color: Colors.white)), + ), + ], + ), + ), + ); + + Widget _buildSliverList() => SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 120.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json new file mode 100644 index 00000000..cd900f24 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver-Füllansichtsliste", + "info": "Eine Listenkomponente der Sliver-Familie, die über einen Delegate Unterkomponenten erstellt. Die Höhe der Elemente füllt den Ansichtsbereich, und es kann angegeben werden, ob ein Bruchteil verwendet wird.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFillViewport", + "desc": [ + "【viewportFraction】 : Ansichtsbruchteil 【double】", + "【delegate】 : Kind-Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json new file mode 100644 index 00000000..70abeab9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver Fill Viewport", + "info": "A list component of the Sliver family, which constructs child components through a delegate. The height of the item will fill the viewport, and you can specify the fraction.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFillViewport", + "desc": [ + "【viewportFraction】 : Viewport Fraction 【double】", + "【delegate】 : Child Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json new file mode 100644 index 00000000..99a48b3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Lista de vista de relleno Sliver", + "info": "Componente de lista de la familia Sliver, construye subcomponentes a través de delegate, la altura del elemento llenará la ventana gráfica, se puede especificar si es una fracción.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fracción de la ventana gráfica 【double】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json new file mode 100644 index 00000000..2b768323 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Liste de vue de remplissage Sliver", + "info": "Composant de liste de la famille Sliver, qui construit des sous-composants via un délégué, la hauteur de l'élément remplira la vue, et il est possible de spécifier si la fraction est divisée.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fraction de la vue 【double】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json new file mode 100644 index 00000000..b6e42bae --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver riempie la vista", + "info": "Componente della lista della famiglia Sliver, costruisce i componenti figli tramite il delegate, l'altezza dell'elemento riempirà la vista, è possibile specificare la frazione.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFillViewport", + "desc": [ + "【viewportFraction】 : Frazione della vista 【double】", + "【delegate】 : Delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json new file mode 100644 index 00000000..8d2507f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliverビューポートを埋めるリスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを通じて子コンポーネントを構築し、アイテムの高さがビューポートを埋めます。分率を指定することもできます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewportの基本使用", + "desc": [ + "【viewportFraction】 : ビューポート分率 【double】", + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json new file mode 100644 index 00000000..fbeb3ab5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver 뷰포트 채우기", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 통해 자식 컴포넌트를 구성하며, 아이템의 높이가 뷰포트를 채웁니다. 분율을 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewport 기본 사용법", + "desc": [ + "【viewportFraction】 : 뷰포트 분율 【double】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json new file mode 100644 index 00000000..a40a323a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Lista de visualização de preenchimento Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes através de um delegate. A altura do item preencherá a viewport, e pode-se especificar a fração de preenchimento.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fração da viewport 【double】", + "【delegate】 : Delegado dos filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json new file mode 100644 index 00000000..934b4569 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver заполнение списка представлений", + "info": "Компонент списка семейства Sliver, который создает дочерние компоненты через делегат, высота элемента заполняет видимую область, можно указать долю.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFillViewport", + "desc": [ + "【viewportFraction】 : Доля видимой области 【double】", + "【delegate】 : Делегат дочерних элементов 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json new file mode 100644 index 00000000..f1079775 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver填充视图列表", + "info": "Sliver家族的列表组件,通过delegate构造子组件,item的高度会填空视口,可以指定是否的分率。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewport基本使用", + "desc": [ + "【viewportFraction】 : 视口分率 【double】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart new file mode 100644 index 00000000..f8ce2d42 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverFillViewportDemo extends StatefulWidget { + const SliverFillViewportDemo({Key? key}) : super(key: key); + + @override + _SliverFillViewportDemoState createState() => _SliverFillViewportDemoState(); +} + +class _SliverFillViewportDemoState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + double _viewportFraction = 0.5; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildTool(), + SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverList()], + ), + ), + ], + ); + } + + Widget _buildSliverList() => SliverFillViewport( + viewportFraction: _viewportFraction, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + _buildTool() { + return Slider( + value: _viewportFraction, + min: 0.01, + divisions: 20, + label: _viewportFraction.toStringAsFixed(1), + max: 2.0, + onChanged: (v) => setState(() => _viewportFraction = v)); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json new file mode 100644 index 00000000..229d8972 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver feste erweiterte Liste", + "info": "Eine Listenkomponente der Sliver-Familie, die über einen Delegate Unterkomponenten konstruiert und die Höhe der Elemente festlegen kann. Wird häufig in CustomScrollView verwendet.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Erzwungene Länge in Hauptachsenrichtung 【double】", + "【delegate】 : Kinderdelegat 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json new file mode 100644 index 00000000..15722257 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver Fixed Extent List", + "info": "A list component of the Sliver family, which constructs child components through a delegate and can specify the height of the item. It is commonly used in CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFixedExtentList", + "desc": [ + "【itemExtent】: Forced length in the main axis 【double】", + "【delegate】: Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json new file mode 100644 index 00000000..cefbb2af --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista de extensión fija de Sliver", + "info": "Componente de lista de la familia Sliver, que construye subcomponentes a través de un delegado y puede especificar la altura de los elementos. Normalmente se utiliza en CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Longitud forzada en la dirección del eje principal 【double】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json new file mode 100644 index 00000000..35b9e914 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Liste d'extension fixe Sliver", + "info": "Composant de liste de la famille Sliver, qui construit les sous-composants via un délégué et permet de spécifier la hauteur des éléments. Généralement utilisé dans CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Longueur forcée dans la direction principale 【double】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json new file mode 100644 index 00000000..655ceb5a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista estensibile fissa Sliver", + "info": "Componente della lista della famiglia Sliver, che costruisce i componenti figli tramite il delegate, consente di specificare l'altezza dell'elemento. Solitamente utilizzato in CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Lunghezza forzata nella direzione dell'asse principale 【double】", + "【delegate】 : Delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json new file mode 100644 index 00000000..430e4383 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver固定延展リスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを使用して子コンポーネントを構築し、アイテムの高さを指定できます。通常、CustomScrollViewで使用されます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList基本使用", + "desc": [ + "【itemExtent】 : 主軸方向の強制長さ 【double】", + "【delegate】 : 子要素の代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json new file mode 100644 index 00000000..a2579c18 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver 고정 확장 리스트", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 통해 자식 컴포넌트를 구성하고, 아이템의 높이를 지정할 수 있습니다. 일반적으로 CustomScrollView에서 사용됩니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList 기본 사용", + "desc": [ + "【itemExtent】 : 주축 방향 강제 길이 【double】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json new file mode 100644 index 00000000..21fa98fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista de Extensão Fixa Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes através de um delegate, permitindo especificar a altura do item. Geralmente usado em CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Comprimento forçado na direção do eixo principal 【double】", + "【delegate】 : Delegate dos filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json new file mode 100644 index 00000000..b2e677eb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver фиксированный расширяемый список", + "info": "Компонент списка семейства Sliver, который создает дочерние компоненты через делегат и позволяет указать высоту элемента. Обычно используется в CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Принудительная длина по главной оси 【double】", + "【delegate】 : Делегат дочерних элементов 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json new file mode 100644 index 00000000..cc974701 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver固定延展列表", + "info": "Sliver家族的列表组件,通过delegate构造子组件,可以指定item的高度。通常用于CustomScrollView中。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList基本使用", + "desc": [ + "【itemExtent】 : 主轴方向强迫长度 【double】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart new file mode 100644 index 00000000..11efccb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverFixedExtentListDemo extends StatefulWidget { + const SliverFixedExtentListDemo({Key? key}) : super(key: key); + + @override + _SliverFixedExtentListDemoState createState() => _SliverFixedExtentListDemoState(); +} + +class _SliverFixedExtentListDemoState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverList()], + ), + ); + } + + Widget _buildSliverList() => SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json new file mode 100644 index 00000000..af304815 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver-Gitter", + "info": "Ein Gitterlisten-Widget der Sliver-Familie, ähnlich wie GirdView, das durch count und extent konstruiert wird. Wird normalerweise in CustomScrollView verwendet.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverList", + "desc": [ + "SliverGrid.count Konstruktion mit spezifizierter axialer Anzahl", + "SliverGrid.extent Konstruktion mit spezifizierter axialer Länge", + "Attributeigenschaften sind ähnlich wie bei GridView, siehe dazu" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json new file mode 100644 index 00000000..89980569 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver Grid", + "info": "A grid list component of the Sliver family, similar to GridView, constructed with count and extent. Usually used in CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverList", + "desc": [ + "SliverGrid.count constructs with specified axial count", + "SliverGrid.extent constructs with specified axial length", + "The attribute characteristics are the same as GridView, see it for details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json new file mode 100644 index 00000000..f0ccd1a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Cuadrícula Sliver", + "info": "Componente de lista de cuadrícula de la familia Sliver, similar a GirdView, construido a través de count y extent. Normalmente se utiliza en CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "SliverGrid.count construye especificando la cantidad axial", + "SliverGrid.extent construye especificando la longitud axial", + "Las características de los atributos son las mismas que GridView, se pueden ver en detalle" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json new file mode 100644 index 00000000..feac18d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Grille Sliver", + "info": "Composant de liste de grille de la famille Sliver, similaire à GirdView, construit via count et extent. Généralement utilisé dans CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverList", + "desc": [ + "SliverGrid.count construction avec un nombre spécifié dans l'axe", + "SliverGrid.extent construction avec une longueur spécifiée dans l'axe", + "Les caractéristiques des propriétés sont similaires à GridView, voir les détails" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json new file mode 100644 index 00000000..1fa0db2f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Griglia Sliver", + "info": "Componente della lista a griglia della famiglia Sliver, simile a GirdView, costruito tramite count e extent. Solitamente utilizzato in CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverList", + "desc": [ + "SliverGrid.count costruisce specificando il numero di assi", + "SliverGrid.extent costruisce specificando la lunghezza dell'asse", + "Le caratteristiche degli attributi sono le stesse di GridView, si può fare riferimento a quello per i dettagli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json new file mode 100644 index 00000000..f453572b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliverグリッド", + "info": "Sliverファミリーのグリッドリストコンポーネントで、GirdViewと類似しており、countとextentで構築されます。通常はCustomScrollViewで使用されます。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverListの基本的な使用", + "desc": [ + "SliverGrid.count 軸方向の数を指定して構築", + "SliverGrid.extent 軸方向の長さを指定して構築", + "属性特性はGridViewと同じで、詳細はそちらを参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json new file mode 100644 index 00000000..9495f1c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver 그리드", + "info": "Sliver 패밀리의 그리드 리스트 컴포넌트로, GirdView와 유사하며 count와 extent로 구성됩니다. 주로 CustomScrollView에서 사용됩니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList 기본 사용", + "desc": [ + "SliverGrid.count는 축 방향 수량으로 구성", + "SliverGrid.extent는 축 방향 길이로 구성", + "속성 특성은 GridView와 동일하며, 자세한 내용은 해당 문서 참조" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json new file mode 100644 index 00000000..68b0edae --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Grelha Sliver", + "info": "Componente de lista de grelha da família Sliver, semelhante ao GirdView, construído através de count e extent. Geralmente usado em CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "SliverGrid.count especifica a construção do número axial", + "SliverGrid.extent especifica a construção do comprimento axial", + "As características dos atributos são semelhantes ao GridView, consulte para mais detalhes" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json new file mode 100644 index 00000000..9bb25afd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver сетка", + "info": "Компонент списка сетки семейства Sliver, аналогичный GirdView, создается с помощью count и extent. Обычно используется в CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverList", + "desc": [ + "SliverGrid.count создается с указанием количества по оси", + "SliverGrid.extent создается с указанием длины по оси", + "Характеристики атрибутов такие же, как у GridView, подробности см. в нем" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json new file mode 100644 index 00000000..0a409789 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver网格", + "info": "Sliver家族的网格列表组件,和GirdView类似,通过count和extent构造。通常用于CustomScrollView中。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList基本使用", + "desc": [ + "SliverGrid.count 指定轴向数量构造", + "SliverGrid.extent 指定轴向长度构造", + "属性特征同GridView,可详见之" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart new file mode 100644 index 00000000..eef958f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class SliverGirdDemo extends StatelessWidget { + const SliverGirdDemo({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverList()], + ), + ); + } + + Widget _buildSliverList() => SliverGrid.extent( + childAspectRatio: 1 / 0.618, + maxCrossAxisExtent: 180, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + children: data + .map((e) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: e, + child: Text( + colorString(e), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + )) + .toList(), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json new file mode 100644 index 00000000..27f63ad3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignorieren Ereignisse", + "info": "Kann ein Sliver-Widget umhüllen und durch ignoring steuern, ob dieses Sliver-Widget auf Ereignisse reagieren kann.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverIgnorePointer", + "desc": [ + "【sliver】: Sliver-Widget 【Widget】", + "【ignoring】: Ereignisse ignorieren 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json new file mode 100644 index 00000000..ca7fcfdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignore Events", + "info": "Can wrap a sliver component, and control whether the sliver component can respond to events through ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverIgnorePointer", + "desc": [ + "【sliver】: sliver component 【Widget】", + "【ignoring】: whether to ignore events 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json new file mode 100644 index 00000000..f838f0f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignorar eventos", + "info": "Puede envolver un componente sliver, y controlar si este componente sliver puede responder a eventos a través de ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: si se ignoran los eventos 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json new file mode 100644 index 00000000..5e97cdb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignorer les Événements", + "info": "Peut envelopper un composant sliver, en contrôlant via 'ignoring' si ce composant sliver peut répondre aux événements.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverIgnorePointer", + "desc": [ + "【sliver】 : composant sliver 【Widget】", + "【ignoring】 : ignorer les événements 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json new file mode 100644 index 00000000..a66bb9dd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignora eventi", + "info": "Può avvolgere un componente sliver, controllando se il componente sliver può rispondere agli eventi tramite ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: ignora eventi 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json new file mode 100644 index 00000000..be097455 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliverイベント無視", + "info": "sliverコンポーネントをラップし、ignoringを使用してそのsliverコンポーネントがイベントに応答するかどうかを制御できます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointerの基本使用", + "desc": [ + "【sliver】 : sliverコンポーネント 【Widget】", + "【ignoring】 : イベントを無視するかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json new file mode 100644 index 00000000..44933a44 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver 이벤트 무시", + "info": "sliver 컴포넌트를 감싸고, ignoring을 통해 해당 sliver 컴포넌트가 이벤트에 반응할지 여부를 제어할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointer 기본 사용", + "desc": [ + "【sliver】 : sliver 컴포넌트 【Widget】", + "【ignoring】 : 이벤트 무시 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json new file mode 100644 index 00000000..8aba19eb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignorar Eventos", + "info": "Pode envolver um componente sliver, controlando através de ignoring se este componente sliver pode responder a eventos.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: ignorar eventos 【bool】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json new file mode 100644 index 00000000..cbe4f7b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver игнорировать события", + "info": "Может обернуть sliver-компонент, и с помощью ignoring контролировать, может ли этот sliver-компонент реагировать на события.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverIgnorePointer", + "desc": [ + "【sliver】 : sliver-компонент 【Widget】", + "【ignoring】 : игнорировать ли события 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json new file mode 100644 index 00000000..b3273228 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver忽略事件", + "info": "可以包裹一个sliver组件,通过ignoring来控制该sliver组件是否可以响应事件。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointer基本使用", + "desc": [ + "【sliver】 : sliver组件 【Widget】", + "【ignoring】 : 是否忽略事件 【bool】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart new file mode 100644 index 00000000..28123a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart @@ -0,0 +1,151 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class SliverIgnorePointerDemo extends StatefulWidget { + const SliverIgnorePointerDemo({Key? key}) : super(key: key); + + @override + _SliverIgnorePointerDemoState createState() => + _SliverIgnorePointerDemoState(); +} + +class _SliverIgnorePointerDemoState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + final Random r = Random(); + bool hasScrollBody = false; + bool fillOverscroll = true; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), + slivers: [ + _buildSliverAppBar(), + _buildSliverList(), + SliverIgnorePointer( + ignoring: true, + sliver: SliverFillRemaining( + hasScrollBody: hasScrollBody, + fillOverscroll: fillOverscroll, + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage("assets/images/sabar_bar.webp"))), + // // color: Colors.teal[100], + child: _buildBottomChild(), + ), + ), + ), + ], + ), + ); + } + + Widget _buildBottomChild() => Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Wrap( + spacing: 10, + children: [ + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + ), + onPressed: () { + setState(() { + hasScrollBody = !hasScrollBody; + }); + }, + child: Text('hasScrollBody:$hasScrollBody',style: const TextStyle(color: Colors.white),), + ), + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + ), + onPressed: () { + setState(() { + fillOverscroll = !fillOverscroll; + }); + }, + child: Text('fillOverscroll:$fillOverscroll',style: const TextStyle(color: Colors.white)), + ), + ], + ), + ), + ); + + Widget _buildSliverList() => SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 120.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json new file mode 100644 index 00000000..77965bcf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver-Layout-Builder", + "info": "Ein Mitglied der Sliver-Familie, das während des Scrollvorgangs durch das zurückgegebene SliverConstraints-Objekt die Konstruktion von Unterkomponenten ermöglicht.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverLayoutBuilder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json new file mode 100644 index 00000000..92c87ab4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver Layout Builder", + "info": "A member of the Sliver family, which allows the construction of child components through the SliverConstraints object during the scrolling process.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverLayoutBuilder", + "desc": [ + "【builder】: Component Builder 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json new file mode 100644 index 00000000..9983b1ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Constructor de diseño Sliver", + "info": "Miembro de la familia Sliver, que permite la construcción de componentes secundarios a través del objeto SliverConstraints devuelto durante el desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverLayoutBuilder", + "desc": [ + "【builder】: Constructor de componentes 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json new file mode 100644 index 00000000..eca65d51 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Constructeur de mise en page Sliver", + "info": "Membre de la famille Sliver, il permet de construire des composants enfants via l'objet SliverConstraints rappelé pendant le défilement.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverLayoutBuilder", + "desc": [ + "【builder】 : Constructeur de composant 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json new file mode 100644 index 00000000..a2d547f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Costruttore di layout Sliver", + "info": "Membro della famiglia Sliver, durante lo scorrimento è possibile costruire i componenti figli utilizzando l'oggetto SliverConstraints restituito dalla callback.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverLayoutBuilder", + "desc": [ + "【builder】 : Costruttore di componenti 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json new file mode 100644 index 00000000..26a99a1f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliverレイアウトビルダー", + "info": "Sliverファミリーの一員で、スライド中にコールバックされるSliverConstraintsオブジェクトを使用して子コンポーネントを構築できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilderの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json new file mode 100644 index 00000000..84a48d73 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver 레이아웃 빌더", + "info": "Sliver 패밀리의 일원으로, 스크롤 중에 콜백된 SliverConstraints 객체를 통해 하위 컴포넌트를 구성할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilder 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json new file mode 100644 index 00000000..46c083b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Construtor de Layout Sliver", + "info": "Membro da família Sliver, que permite a construção de componentes filhos através do objeto SliverConstraints retornado durante o deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverLayoutBuilder", + "desc": [ + "【builder】 : Construtor de componentes 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json new file mode 100644 index 00000000..0daadcdd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Конструктор макета Sliver", + "info": "Член семейства Sliver, который позволяет создавать дочерние компоненты через объект SliverConstraints, возвращаемый в процессе прокрутки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverLayoutBuilder", + "desc": [ + "【builder】 : Конструктор компонентов 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json new file mode 100644 index 00000000..4e8ad40a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver布局构造器", + "info": "Sliver家族一员,在滑动过程中可以通过回调出的 SliverConstraints 对象进行子组件的构造。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilder基本使用", + "desc": [ + "【builder】 : 组件构造器 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart new file mode 100644 index 00000000..88ec65aa --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class SliverLayoutBuilderDemo extends StatefulWidget { + const SliverLayoutBuilderDemo({Key? key}) : super(key: key); + + @override + _SliverLayoutBuilderDemoState createState() => + _SliverLayoutBuilderDemoState(); +} + +class _SliverLayoutBuilderDemoState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), + slivers: [ + _buildSliverAppBar(), + SliverLayoutBuilder( + builder: _buildSliver, + ), + _buildSliverList(), + ], + ), + ); + } + + Widget _buildSliverList() => SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 120.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + Widget _buildSliver(BuildContext context, SliverConstraints constraints) { + return SliverToBoxAdapter( + child: Container( + alignment: Alignment.center, + height: constraints.remainingPaintExtent / 3, + color: Colors.red, + child: const Text( + "SliverLayoutBuilder", + style: TextStyle(color: Colors.white, fontSize: 20), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json new file mode 100644 index 00000000..e55576cb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver-Liste", + "info": "Eine Listenkomponente der Sliver-Familie, die durch die Angabe eines Delegaten Unterkomponenten erstellt. Wird normalerweise in CustomScrollView verwendet.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverList", + "desc": [ + "【delegate】 : Kinderdelegierter 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json new file mode 100644 index 00000000..74c96848 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver List", + "info": "A list component of the Sliver family, which constructs child components by specifying a delegate. It is commonly used in CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverList", + "desc": [ + "【delegate】: Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json new file mode 100644 index 00000000..4be4dda9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente de lista de la familia Sliver, que construye subcomponentes especificando un delegate. Normalmente se utiliza en CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json new file mode 100644 index 00000000..81be999c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Liste Sliver", + "info": "Composant de liste de la famille Sliver, qui construit des sous-composants en spécifiant un délégué. Généralement utilisé dans CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverList", + "desc": [ + "【delegate】 : délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json new file mode 100644 index 00000000..d5cda55e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente lista della famiglia Sliver, che costruisce i componenti figli specificando un delegate. Comunemente utilizzato in CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverList", + "desc": [ + "【delegate】 : delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json new file mode 100644 index 00000000..952207b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliverリスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを指定して子コンポーネントを構築します。通常、CustomScrollViewで使用されます。", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverListの基本使用", + "desc": [ + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json new file mode 100644 index 00000000..ab539a54 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver 리스트", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 지정하여 자식 컴포넌트를 구성합니다. 주로 CustomScrollView에서 사용됩니다.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList 기본 사용", + "desc": [ + "【delegate】 : 자식 대리 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json new file mode 100644 index 00000000..e5dbe650 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes especificando um delegate. Normalmente usado em CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverList", + "desc": [ + "【delegate】 : Delegado de filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json new file mode 100644 index 00000000..0aed5120 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Список Sliver", + "info": "Компонент списка семейства Sliver, который создает дочерние элементы через указанный делегат. Обычно используется в CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverList", + "desc": [ + "【delegate】 : Дочерний делегат 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json new file mode 100644 index 00000000..6b776f33 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver列表", + "info": "Sliver家族的列表组件,通过指定delegate构造子组件。通常用于CustomScrollView中。", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList基本使用", + "desc": [ + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart new file mode 100644 index 00000000..ea903dca --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class SliverListDemo extends StatelessWidget { + const SliverListDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverList()], + ), + ); + } + + Widget _buildSliverList() => SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json new file mode 100644 index 00000000..b7417fa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Hauptachsen-Sliver-Gruppe", + "info": "Kann mehrere Sliver-Komponenten aufnehmen, die in der gleitenden Hauptachsenrichtung als Gruppe behandelt werden.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverMainAxisGroup", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】", + "Kann mit SliverPersistentHeader kombiniert werden, um Gruppierungen und den Effekt von fixierten Überschriften zu erzielen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json new file mode 100644 index 00000000..8478aa50 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Main Axis Sliver Group", + "info": "Can accommodate multiple Sliver components, treating them as a group in the sliding main axis direction.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverMainAxisGroup", + "desc": [ + "【slivers】: List of child components 【List】", + "Can be combined with SliverPersistentHeader to achieve grouping and sticky header effects." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json new file mode 100644 index 00000000..8665856f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Grupo de deslizamiento del eje principal", + "info": "Puede contener múltiples componentes Sliver, permitiendo que se consideren como un grupo en la dirección del eje principal de desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes hijos 【List】", + "Se puede combinar con SliverPersistentHeader para lograr un efecto de agrupación y fijación de títulos en la parte superior." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json new file mode 100644 index 00000000..7a5206ec --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Groupe d'axe principal glissant", + "info": "Peut contenir plusieurs composants Sliver, les considérant comme un groupe dans la direction de l'axe principal de défilement.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverMainAxisGroup", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】", + "Peut être combiné avec SliverPersistentHeader pour réaliser un effet de regroupement et de fixation du titre en haut." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json new file mode 100644 index 00000000..776ae341 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Gruppo di Sliver sull'Asse Principale", + "info": "Può contenere più componenti Sliver, trattandoli come un gruppo nella direzione di scorrimento dell'asse principale.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】", + "Può essere combinato con SliverPersistentHeader per realizzare raggruppamenti e l'effetto di titolo fisso in cima." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json new file mode 100644 index 00000000..046878ed --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "主軸スライダーグループ", + "info": "複数のSliverコンポーネントを収容し、それらをスクロールする主軸方向で一つのグループとして扱うことができます。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】", + "SliverPersistentHeaderと組み合わせて、グループ化やタイトルの吸着効果を実現できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json new file mode 100644 index 00000000..590367ab --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "주축 슬라이더 그룹", + "info": "여러 개의 Sliver 컴포넌트를 수용할 수 있으며, 스크롤하는 주축 방향에서 하나의 그룹으로 간주됩니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 기본 사용법", + "desc": [ + "【slivers】 : 자식 컴포넌트 리스트 【List】", + "SliverPersistentHeader와 결합하여 그룹화 및 제목 고정 효과를 구현할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json new file mode 100644 index 00000000..ba26253b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Grupo de Slides do Eixo Principal", + "info": "Pode conter vários componentes Sliver, permitindo que sejam tratados como um grupo na direção do eixo de deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】", + "Pode ser combinado com SliverPersistentHeader para alcançar efeitos de agrupamento e fixação de títulos no topo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json new file mode 100644 index 00000000..5b809284 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Группа слайдеров главной оси", + "info": "Может содержать несколько компонентов Sliver, позволяя рассматривать их как группу в направлении скольжения главной оси.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverMainAxisGroup", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】", + "Может использоваться в сочетании с SliverPersistentHeader для реализации группировки и эффекта прилипания заголовка." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json new file mode 100644 index 00000000..7abcc8f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "主轴滑片组", + "info": "可以容纳多个 Sliver 组件,让它们在滑动的主轴方向上视为一组。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】", + "可结合 SliverPersistentHeader 实现分组,标题吸顶效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart new file mode 100644 index 00000000..5675f9e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com + +class ItemData { + final String groupName; + final List users; + + ItemData({required this.groupName, this.users = const []}); + + static List get testData => [ + ItemData(groupName: '幻将术士', users: ['梦小梦', '梦千']), + ItemData( + groupName: '幻将剑客', users: ['捷特', '龙少', '莫向阳', '何解连', '浪封', '梦飞烟']), + ItemData(groupName: '幻将弓者', users: ['巫缨', '巫妻孋', '摄王', '裔王', '梦童']), + ItemData( + groupName: '其他', users: List.generate(20, (index) => '小兵$index')), + ]; +} + +class SliverMainAxisGroupDemo extends StatelessWidget{ + const SliverMainAxisGroupDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: ItemData.testData.map(_buildGroup).toList(), + ), + ); + } + + Widget _buildGroup(ItemData itemData) { + return SliverMainAxisGroup(slivers: [ + SliverPersistentHeader( + pinned: true, + delegate: _HeaderDelegate(itemData.groupName), + ), + SliverList( + // tag2 + delegate: SliverChildBuilderDelegate( + (_, index) => _buildItemByUser(itemData.users[index]), + childCount: itemData.users.length, + ), + ), + ]); + } + + Widget _buildItemByUser(String user) { + return Container( + alignment: Alignment.center, + height: 56, + child: Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 20, right: 10.0), + child: FlutterLogo(size: 30), + ), + Text( + user, + style: const TextStyle(fontSize: 16), + ), + ], + ), + ); + } +} + +class _HeaderDelegate extends SliverPersistentHeaderDelegate { + const _HeaderDelegate(this.title); + + final String title; + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + return Container( + alignment: Alignment.centerLeft, + color: const Color(0xffF6F6F6), + padding: const EdgeInsets.only(left: 20), + height: 40, + child: Text(title)); + } + + @override + double get maxExtent => minExtent; + + @override + double get minExtent => 40; + + @override + bool shouldRebuild(covariant _HeaderDelegate oldDelegate) => title!=oldDelegate.title; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json new file mode 100644 index 00000000..50b283d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver Transparenz", + "info": "Kann ein Kindelement der Sliver-Familie aufnehmen und die Transparenz des Kindelements durch opacity angeben.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOpacity", + "desc": [ + "【opacity】 : Transparenz 【double】", + "【sliver】 : Kindelement 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json new file mode 100644 index 00000000..a3d1e34e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver Opacity", + "info": "Can accommodate a child component of the Sliver family and specify the opacity of the child component through opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOpacity", + "desc": [ + "【opacity】: Opacity 【double】", + "【sliver】: Child Component 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json new file mode 100644 index 00000000..1a4aac8d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacidad de Sliver", + "info": "Puede contener un componente hijo de la familia Sliver y especificar la opacidad del componente hijo a través de opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOpacity", + "desc": [ + "【opacity】 : Opacidad 【double】", + "【sliver】 : Componente hijo 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json new file mode 100644 index 00000000..62627403 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacité de Sliver", + "info": "Peut contenir un composant enfant de la famille Sliver et spécifier l'opacité du composant enfant via opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOpacity", + "desc": [ + "【opacity】 : opacité 【double】", + "【sliver】 : composant enfant 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json new file mode 100644 index 00000000..25668b4c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacità Sliver", + "info": "Può contenere un componente figlio della famiglia Sliver e specificare l'opacità del componente figlio tramite opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverOpacity", + "desc": [ + "【opacity】 : opacità 【double】", + "【sliver】 : componente figlio 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json new file mode 100644 index 00000000..ff4b4bcb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver透明度", + "info": "Sliverファミリーの子コンポーネントを収容でき、opacityを通じて子コンポーネントの透明度を指定できます。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacityの基本使用", + "desc": [ + "【opacity】 : 透明度 【double】", + "【sliver】 : 子コンポーネント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json new file mode 100644 index 00000000..09c33194 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver 투명도", + "info": "Sliver 계열의 자식 위젯을 포함할 수 있으며, opacity를 통해 자식 위젯의 투명도를 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacity 기본 사용", + "desc": [ + "【opacity】 : 투명도 【double】", + "【sliver】 : 자식 위젯 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json new file mode 100644 index 00000000..4f9e76ef --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacidade Sliver", + "info": "Pode acomodar um componente filho da família Sliver e especificar a opacidade do componente filho através de opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverOpacity", + "desc": [ + "【opacity】 : opacidade 【double】", + "【sliver】 : componente filho 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json new file mode 100644 index 00000000..ca602737 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Прозрачность Sliver", + "info": "Может содержать дочерний компонент из семейства Sliver и указывать прозрачность дочернего компонента через opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOpacity", + "desc": [ + "【opacity】 : прозрачность 【double】", + "【sliver】 : дочерний компонент 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json new file mode 100644 index 00000000..7aa31a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver透明度", + "info": "可容纳一个Sliver家族的子组件,并通过opacity来指定子组件的透明度。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacity基本使用", + "desc": [ + "【opacity】 : 透明度 【double】", + "【sliver】 : 子组件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart new file mode 100644 index 00000000..209d7629 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverOpacityDemo extends StatelessWidget { + const SliverOpacityDemo({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + _buildSliverAppBar(), + SliverPadding( + padding: const EdgeInsets.only(top: 10), + sliver: SliverOpacity(opacity: 0.2, sliver: _buildSliverGrid())) + ], + ), + ); + } + + Widget _buildSliverGrid() => SliverGrid.extent( + childAspectRatio: 1 / 0.618, + maxCrossAxisExtent: 180, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + children: data + .map((e) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: e, + child: Text( + colorString(e), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + )) + .toList(), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json new file mode 100644 index 00000000..8067bd07 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Überlappungsabsorber", + "info": "Wickelt einen anderen Sliver ein und zwingt ihn, seinen Layoutbereich als überlappend zu betrachten. Muss in Verbindung mit SliverOverlapInjector verwendet werden.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Untergeordnete Komponente 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "Wenn die Komponenten SliverOverlapAbsorber und SliverOverlapInjector nicht verwendet werden, überlappt der Inhalt von NestedScrollView die Kopfleiste." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json new file mode 100644 index 00000000..b582af34 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Overlap Absorber", + "info": "Wraps another sliver and forces its layout extent to be treated as overlapping. Needs to be used in conjunction with SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Child component 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "If the SliverOverlapAbsorber and SliverOverlapInjector components are not used, the content of the NestedScrollView will overlap with the header bar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json new file mode 100644 index 00000000..b04a0462 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorbedor de superposición", + "info": "Envuelve otro sliver y fuerza a que su rango de diseño sea considerado como superposición. Debe usarse junto con SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente hijo 【Widget】", + "【handle】 : *Manejador 【SliverOverlapAbsorberHandle】", + "Si no se utilizan los componentes SliverOverlapAbsorber y SliverOverlapInjector, el contenido de NestedScrollView se superpondrá con la barra de encabezado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json new file mode 100644 index 00000000..11f24176 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorbeur de chevauchement", + "info": "Enveloppe un autre sliver et force sa plage de disposition à être considérée comme un chevauchement. Doit être utilisé avec SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【handle】 : *Gestionnaire 【SliverOverlapAbsorberHandle】", + "Si vous n'utilisez pas les composants SliverOverlapAbsorber et SliverOverlapInjector, le contenu de NestedScrollView se chevauchera avec la barre d'en-tête." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json new file mode 100644 index 00000000..621213c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Assorbitore di Sovrapposizione", + "info": "Avvolge un altro sliver e costringe la sua area di layout a essere considerata sovrapposta. Deve essere utilizzato insieme a SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【handle】 : *Gestore 【SliverOverlapAbsorberHandle】", + "Se non si utilizzano i componenti SliverOverlapAbsorber e SliverOverlapInjector, il contenuto di NestedScrollView si sovrapporrà alla barra dell'intestazione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json new file mode 100644 index 00000000..698bb492 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "オーバーラップアブソーバー", + "info": "別のsliverをラップし、そのレイアウト範囲をオーバーラップとして扱うように強制します。SliverOverlapInjectorと一緒に使用する必要があります。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorberの基本的な使用法", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【handle】 : *ハンドラ 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorberとSliverOverlapInjectorコンポーネントを使用しない場合、NestedScrollViewの内容がヘッダーバーと重なります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json new file mode 100644 index 00000000..7181ed39 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "겹침 흡수기", + "info": "다른 sliver를 감싸고, 그 레이아웃 범위가 겹치는 것으로 간주되도록 강제합니다. SliverOverlapInjector와 함께 사용해야 합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorber 기본 사용", + "desc": [ + "【sliver】 : 자식 위젯 【Widget】", + "【handle】 *핸들러 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorber와 SliverOverlapInjector 컴포넌트를 사용하지 않으면, NestedScrollView의 내용이 헤더 바와 겹치게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json new file mode 100644 index 00000000..2fd274d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorvedor de Sobreposição", + "info": "Envolve outro sliver e força que o seu alcance de layout seja considerado sobreposto. Precisa ser usado em conjunto com o SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente filho 【Widget】", + "【handle】 : *Manipulador 【SliverOverlapAbsorberHandle】", + "Se os componentes SliverOverlapAbsorber e SliverOverlapInjector não forem usados, o conteúdo do NestedScrollView sobreporá a barra de cabeçalho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json new file mode 100644 index 00000000..c7b565f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Поглотитель перекрытия", + "info": "Обертывает другой sliver и заставляет его область макета считаться перекрывающейся. Необходимо использовать вместе с SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【handle】 : *Обработчик 【SliverOverlapAbsorberHandle】", + "Если не использовать компоненты SliverOverlapAbsorber и SliverOverlapInjector, содержимое NestedScrollView будет перекрываться с заголовком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json new file mode 100644 index 00000000..7ced3355 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "重叠吸收器", + "info": "包裹另一个的sliver,并迫使其布局范围被视为重叠。需要和SliverOverlapInjector联用。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorber基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart new file mode 100644 index 00000000..5373277f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/16 +/// contact me by email 1981462002@qq.com + + +class SliverOverlapAbsorberDemo extends StatelessWidget { + const SliverOverlapAbsorberDemo({Key? key}) : super(key: key); + + final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 200, + child: Scaffold( + body: DefaultTabController( + length: _tabs.length, + child: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar( + title: const Text('旷古奇书'), + pinned: true, + elevation: 6, //影深 + expandedHeight: 220.0, + forceElevated: innerBoxIsScrolled, //为true时展开有阴影 + flexibleSpace: FlexibleSpaceBar( + background: Image.asset( + "assets/images/wy_300x200_filter.webp", + fit: BoxFit.cover, + ), + ), + bottom: TabBar( + tabs: _tabs + .map((String name) => Tab(text: name,)) + .toList(), + ), + ), + ), + ]; + }, + body: _buildTabBarView(), + ), + ), + )); + } + + Widget _buildTabBarView() { + return TabBarView( + children: _tabs.map((String name) { + return SafeArea( + top: false, + bottom: false, + child: Builder( + builder: (BuildContext context) { + return CustomScrollView( + key: PageStorageKey(name), + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + buildContent(name), + ], + ); + }, + ), + ); + }).toList(), + ); + } + + Widget buildContent(String name) => SliverPadding( + padding: const EdgeInsets.all(8.0), + sliver: SliverFixedExtentList( + itemExtent: 48.0, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + title: Text('《$name》 第 $index章'), + ); + }, + childCount: 50, + ), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json new file mode 100644 index 00000000..50ef4e3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Überlappungsinjektor", + "info": "Ein Sliver, der in Verbindung mit SliverOverlapAbsorber verwendet werden muss, um Überlappungsprobleme in der Ansicht zu behandeln.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOverlapInjector", + "desc": [ + "【sliver】 : Untergeordnete Komponente 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "Wenn die Komponenten SliverOverlapAbsorber und SliverOverlapInjector nicht verwendet werden, überlappt der Inhalt von NestedScrollView die Kopfleiste." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json new file mode 100644 index 00000000..f942f82a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Overlap Injector", + "info": "A sliver that needs to be used with SliverOverlapAbsorber to handle view overlap issues.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOverlapInjector", + "desc": [ + "【sliver】 : Child component 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "If the SliverOverlapAbsorber and SliverOverlapInjector components are not used, the content of the NestedScrollView will overlap with the header bar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json new file mode 100644 index 00000000..e8189dc5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Inyector de superposición", + "info": "Un sliver que debe usarse junto con SliverOverlapAbsorber para manejar problemas de superposición de vistas.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOverlapInjector", + "desc": [ + "【sliver】 : componente hijo 【Widget】", + "【handle】 : *manejador 【SliverOverlapAbsorberHandle】", + "Si no se utilizan los componentes SliverOverlapAbsorber y SliverOverlapInjector, el contenido de NestedScrollView se superpondrá con la barra de encabezado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json new file mode 100644 index 00000000..49fdcb17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Injecteur de chevauchement", + "info": "Un sliver, doit être utilisé conjointement avec SliverOverlapAbsorber pour gérer les problèmes de chevauchement de vues.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOverlapInjector", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【handle】 : *Gestionnaire 【SliverOverlapAbsorberHandle】", + "Si les composants SliverOverlapAbsorber et SliverOverlapInjector ne sont pas utilisés, le contenu de NestedScrollView chevauchera la barre d'en-tête." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json new file mode 100644 index 00000000..88185fd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Iniettore di sovrapposizione", + "info": "Uno sliver, deve essere utilizzato insieme a SliverOverlapAbsorber per gestire il problema della sovrapposizione delle viste.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverOverlapInjector", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【handle】 : *Processore 【SliverOverlapAbsorberHandle】", + "Se non si utilizzano i componenti SliverOverlapAbsorber e SliverOverlapInjector, il contenuto di NestedScrollView si sovrapporrà alla barra dell'intestazione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json new file mode 100644 index 00000000..5a2a19af --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "オーバーラップインジェクター", + "info": "Sliverで、SliverOverlapAbsorberと一緒に使用する必要があり、ビューのオーバーラップ問題を処理します。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjectorの基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【handle】 : *プロセッサ 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorberとSliverOverlapInjectorコンポーネントを使用しない場合、NestedScrollViewの内容はヘッダーバーと重なります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json new file mode 100644 index 00000000..8154e410 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "겹침 인젝터", + "info": "SliverOverlapAbsorber와 함께 사용해야 하는 sliver로, 뷰 겹침 문제를 처리합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjector 기본 사용법", + "desc": [ + "【sliver】 : 자식 컴포넌트 【Widget】", + "【handle】 : *처리기 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorber와 SliverOverlapInjector 컴포넌트를 사용하지 않으면, NestedScrollView의 내용이 헤더 바와 겹칩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json new file mode 100644 index 00000000..2aad85e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Injector de Sobreposição", + "info": "Um sliver que precisa ser usado em conjunto com o SliverOverlapAbsorber para lidar com problemas de sobreposição de visualizações.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverOverlapInjector", + "desc": [ + "【sliver】 : Componente Filho 【Widget】", + "【handle】 : *Manipulador 【SliverOverlapAbsorberHandle】", + "Se os componentes SliverOverlapAbsorber e SliverOverlapInjector não forem usados, o conteúdo do NestedScrollView irá sobrepor-se à barra do cabeçalho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json new file mode 100644 index 00000000..7becb227 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Инжектор перекрытия", + "info": "Sliver, который необходимо использовать вместе с SliverOverlapAbsorber для решения проблемы перекрытия представлений.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOverlapInjector", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【handle】 : *Обработчик 【SliverOverlapAbsorberHandle】", + "Если не использовать компоненты SliverOverlapAbsorber и SliverOverlapInjector, содержимое NestedScrollView будет перекрываться с заголовком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json new file mode 100644 index 00000000..519e019d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "重叠注射器", + "info": "一个sliver,需要和SliverOverlapAbsorber联用,处理视图重叠问题。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjector基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart new file mode 100644 index 00000000..51daa157 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/16 +/// contact me by email 1981462002@qq.com + + +class SliverOverlapInjectorDemo extends StatelessWidget { + const SliverOverlapInjectorDemo({Key? key}) : super(key: key); + + final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 200, + child: Scaffold( + body: DefaultTabController( + length: _tabs.length, + child: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar( + title: const Text('旷古奇书'), + pinned: true, + elevation: 6, //影深 + expandedHeight: 220.0, + forceElevated: innerBoxIsScrolled, //为true时展开有阴影 + flexibleSpace: FlexibleSpaceBar( + background: Image.asset( + "assets/images/wy_300x200_filter.webp", + fit: BoxFit.cover, + ), + ), + bottom: TabBar( + tabs: _tabs + .map((String name) => Tab(text: name,)) + .toList(), + ), + ), + ), + ]; + }, + body: _buildTabBarView(), + ), + ), + )); + } + + Widget _buildTabBarView() { + return TabBarView( + children: _tabs.map((String name) { + return SafeArea( + top: false, + bottom: false, + child: Builder( + builder: (BuildContext context) { + return CustomScrollView( + key: PageStorageKey(name), + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + buildContent(name), + ], + ); + }, + ), + ); + }).toList(), + ); + } + + Widget buildContent(String name) => SliverPadding( + padding: const EdgeInsets.all(8.0), + sliver: SliverFixedExtentList( + itemExtent: 48.0, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + title: Text('《$name》 第 $index章'), + ); + }, + childCount: 50, + ), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json new file mode 100644 index 00000000..0baed114 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver Innenabstand", + "info": "Kann ein untergeordnetes Element der Sliver-Familie aufnehmen, fügt einen eigenen Innenabstand hinzu, um die Platzierung des untergeordneten Elements zu begrenzen, wobei padding die Kern-Eigenschaft ist.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPadding", + "desc": [ + "【sliver】 : Untergeordnetes Element 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json new file mode 100644 index 00000000..0907c91a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver Padding", + "info": "Can accommodate a child component of the Sliver family, adding its own padding to limit the placement of the child component, with the core property being padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPadding", + "desc": [ + "【sliver】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json new file mode 100644 index 00000000..f30d9897 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Relleno interno de Sliver", + "info": "Puede contener un componente hijo de la familia Sliver, añadiendo su propio relleno interno para limitar el espacio ocupado por el componente hijo, la propiedad principal es padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPadding", + "desc": [ + "【sliver】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json new file mode 100644 index 00000000..801d55e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Espacement intérieur de Sliver", + "info": "Peut contenir un composant enfant de la famille Sliver, ajoute sa propre marge intérieure pour limiter l'emplacement du composant enfant, la propriété principale étant padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPadding", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json new file mode 100644 index 00000000..2e02d440 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Spaziatura interna Sliver", + "info": "Può contenere un componente figlio della famiglia Sliver, aggiungendo il proprio padding interno per limitare il posizionamento del componente figlio, la proprietà principale è padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SliverPadding", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json new file mode 100644 index 00000000..ce93600b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver内間隔", + "info": "Sliverファミリーの子コンポーネントを収容し、自身の内側の余白を追加して子コンポーネントの占める位置を制限します。コア属性はpaddingです。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPaddingの基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json new file mode 100644 index 00000000..fa541f02 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver 내부 여백", + "info": "Sliver 가족의 하위 구성 요소를 수용할 수 있으며, 자체 내부 여백을 추가하여 자식 구성 요소의 위치를 제한합니다. 핵심 속성은 padding입니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPadding 기본 사용", + "desc": [ + "【sliver】 : 하위 구성 요소 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json new file mode 100644 index 00000000..840c02b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Espaçamento interno do Sliver", + "info": "Pode acomodar um componente filho da família Sliver, adicionando o próprio preenchimento interno para limitar o espaço ocupado pelo componente filho, sendo o atributo principal o padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverPadding", + "desc": [ + "【sliver】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json new file mode 100644 index 00000000..6fb97bea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Отступ внутри Sliver", + "info": "Может содержать дочерний компонент из семейства Sliver, добавляя собственные внутренние отступы для ограничения места, занимаемого дочерним компонентом. Основное свойство - padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPadding", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json new file mode 100644 index 00000000..e4bd9cbc --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver内间距", + "info": "可容纳一个Sliver家族的子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPadding基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart new file mode 100644 index 00000000..26b707ba --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverPaddingDemo extends StatelessWidget { + const SliverPaddingDemo({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + _buildSliverAppBar(), + SliverPadding( + padding: const EdgeInsets.only(top: 10), + sliver: _buildSliverGrid()) + ], + ), + ); + } + + Widget _buildSliverGrid() => SliverGrid.extent( + childAspectRatio: 1 / 0.618, + maxCrossAxisExtent: 180, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + children: data + .map((e) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: e, + child: Text( + colorString(e), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + )) + .toList(), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json new file mode 100644 index 00000000..3ab0ea20 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Fixierter Header", + "info": "Wird normalerweise in CustomScrollView verwendet, um eine Komponente beim Scrollen oben zu fixieren, damit sie nicht verschwindet.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPersistentHeader", + "desc": [ + "【delegate】 : Delegat 【SliverPersistentHeaderDelegate】", + "【floating】 : Ob schwebend 【bool】", + "【pinned】 : Ob oben fixiert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json new file mode 100644 index 00000000..ef494ee2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Sticky Slider", + "info": "Usually used in CustomScrollView, it allows a component to stay at the top during scrolling and not disappear.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPersistentHeader", + "desc": [ + "【delegate】: Delegate 【SliverPersistentHeaderDelegate】", + "【floating】: Whether to float 【bool】", + "【pinned】: Whether to stay at the top 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json new file mode 100644 index 00000000..c0373b7d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Cabecera persistente", + "info": "Se utiliza normalmente en CustomScrollView para permitir que un componente permanezca en la parte superior durante el desplazamiento y no desaparezca.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPersistentHeader", + "desc": [ + "【delegate】 : delegado 【SliverPersistentHeaderDelegate】", + "【floating】 : si flota 【bool】", + "【pinned】 : si se queda en la parte superior 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json new file mode 100644 index 00000000..1f02f849 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "En-tête persistant", + "info": "Utilisé généralement dans CustomScrollView, il permet à un composant de rester en haut lors du défilement sans disparaître.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPersistentHeader", + "desc": [ + "【delegate】 : Délégué 【SliverPersistentHeaderDelegate】", + "【floating】 : Flottant 【bool】", + "【pinned】 : Reste en haut 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json new file mode 100644 index 00000000..8a3505c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Intestazione persistente", + "info": "Utilizzato solitamente in CustomScrollView, consente a un componente di rimanere in cima durante lo scorrimento, senza scomparire.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverPersistentHeader", + "desc": [ + "【delegate】 : delegato 【SliverPersistentHeaderDelegate】", + "【floating】 : se galleggiante 【bool】", + "【pinned】 : se rimane in cima 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json new file mode 100644 index 00000000..5e4734e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "吸頂スライド", + "info": "通常、CustomScrollViewで使用され、コンポーネントがスクロール中に上部に留まり、スクロールして消えないようにします。", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeaderの基本的な使用法", + "desc": [ + "【delegate】 : デリゲート 【SliverPersistentHeaderDelegate】", + "【floating】 : フローティングするかどうか 【bool】", + "【pinned】 : 上部に留まるかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json new file mode 100644 index 00000000..020f8232 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "스티커 슬라이드", + "info": "일반적으로 CustomScrollView에서 사용되며, 스크롤 중에 상단에 고정되어 사라지지 않도록 하는 컴포넌트입니다.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeader 기본 사용법", + "desc": [ + "【delegate】 : 대리자 【SliverPersistentHeaderDelegate】", + "【floating】 : 플로팅 여부 【bool】", + "【pinned】 : 상단 고정 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json new file mode 100644 index 00000000..2c485a8a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Cabeçalho Fixo Deslizante", + "info": "Geralmente usado em CustomScrollView, permite que um componente permaneça no topo durante a rolagem, sem desaparecer.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverPersistentHeader", + "desc": [ + "【delegate】 : Delegado 【SliverPersistentHeaderDelegate】", + "【floating】 : Se flutua 【bool】", + "【pinned】 : Se fica no topo 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json new file mode 100644 index 00000000..d5baa3db --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Прилипающий заголовок", + "info": "Обычно используется в CustomScrollView, позволяет компоненту оставаться вверху при прокрутке и не исчезать.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPersistentHeader", + "desc": [ + "【delegate】 : делегат 【SliverPersistentHeaderDelegate】", + "【floating】 : плавающий 【bool】", + "【pinned】 : закреплённый вверху 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json new file mode 100644 index 00000000..a72aae22 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "吸顶滑片", + "info": "通常用于 CustomScrollView 中,可以让一个组件在滑动中停留在顶部,不会滑动消失。", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeader基本使用", + "desc": [ + "【delegate】 : 代理 【SliverPersistentHeaderDelegate】", + "【floating】 : 是否浮动 【bool】", + "【pinned】 : 是否顶部停留 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart new file mode 100644 index 00000000..7ea9109c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart @@ -0,0 +1,158 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverPersistentHeaderDemo extends StatelessWidget { + const SliverPersistentHeaderDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 500, + child: CustomScrollView( + slivers: [ + _buildSliverAppBar(), + _buildPersistentHeader('袅缈岁月,青丝银发',const Color(0xffe7fcc9)), + _buildCommonWidget(), + _buildPersistentHeader('以梦为马,不负韶华',const Color(0xffcca4ff)), + _buildSliverList() + ], + ), + ); + } + + Widget _buildCommonWidget() => SliverToBoxAdapter( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + title: const Text("以梦为马"), + subtitle: const Text("海子"), + selected: true, + contentPadding: const EdgeInsets.all(5), + trailing: const Icon(Icons.more_vert), + ), + ), + ); + Widget _buildPersistentHeader(String text,Color color) => SliverPersistentHeader( + pinned: true, + delegate: _SliverDelegate( + minHeight: 40.0, + maxHeight: 100.0, + child: Container( + color: color, + child: Center( + child: Text(text, style: const TextStyle( + fontSize: 18, + shadows: [Shadow(color: Colors.white, offset: Offset(1, 1))]), + ), + )), + )); + + Widget _buildSliverList() => SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 2, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} + + +class _SliverDelegate extends SliverPersistentHeaderDelegate { + _SliverDelegate({ + required this.minHeight, + required this.maxHeight, + required this.child, + }); + + final double minHeight; //最小高度 + final double maxHeight; //最大高度 + final Widget child; //孩子 + + @override + double get minExtent => minHeight; + + @override + double get maxExtent => max(maxHeight, minHeight); + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + return SizedBox.expand(child: child); + } + + @override //是否需要重建 + bool shouldRebuild(_SliverDelegate oldDelegate) { + return maxHeight != oldDelegate.maxHeight || + minHeight != oldDelegate.minHeight || + child != oldDelegate.child; + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json new file mode 100644 index 00000000..6274480b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver-Prototyp-Erweiterungsliste", + "info": "Die Eigenschaft prototypeItem ist ein Widget, das die Größe der Elemente in der Hauptachsenrichtung einschränkt, aber nicht angezeigt wird. Der delegate akzeptiert einen SliverChildDelegate, um die Erstellung der Elemente abzuschließen.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Hauptachsenrichtungsgrößenkomponente 【Widget】", + "【delegate】 : Kind-Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json new file mode 100644 index 00000000..471973db --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver Prototype Extent List", + "info": "The prototypeItem property is a Widget, which is responsible for constraining the size of the item in the main axis direction, but it will not be displayed. The delegate accepts a SliverChildDelegate to complete the creation of the item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Main axis size component 【Widget】", + "【delegate】 : Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json new file mode 100644 index 00000000..6755cc3c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista de Extensión de Prototipo Sliver", + "info": "La propiedad prototypeItem es un Widget, que se encarga de restringir el tamaño del ítem en la dirección del eje principal, pero no se mostrará. El delegate acepta un SliverChildDelegate para completar la creación del ítem.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente de tamaño en la dirección del eje principal 【Widget】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json new file mode 100644 index 00000000..0642cc05 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Liste d'extension de prototype Sliver", + "info": "La propriété prototypeItem est un Widget, elle est responsable de contraindre la taille de l'item dans la direction de l'axe principal, mais ne sera pas affichée. Le delegate accepte un SliverChildDelegate pour créer l'item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Composant de taille dans la direction de l'axe principal 【Widget】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json new file mode 100644 index 00000000..b0130d17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista di estensione del prototipo Sliver", + "info": "La proprietà prototypeItem è un Widget, che si occupa di vincolare le dimensioni dell'elemento nella direzione dell'asse principale, ma non viene visualizzato. Il delegate accetta un SliverChildDelegate per completare la creazione dell'elemento.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente di dimensioni nella direzione dell'asse principale 【Widget】", + "【delegate】 : Delegato per i figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json new file mode 100644 index 00000000..5b31fd93 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliverプロトタイプ拡張リスト", + "info": "prototypeItemプロパティはWidgetで、主軸方向のitemのサイズを制約しますが、表示されません。delegateはSliverChildDelegateを受け取り、itemの作成を完了します。", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentListの基本使用", + "desc": [ + "【prototypeItem】 : 主軸方向サイズコンポーネント 【Widget】", + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json new file mode 100644 index 00000000..033af177 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver 프로토타입 확장 리스트", + "info": "prototypeItem 속성은 Widget이며, 주축 방향의 item 크기를 제한하지만 표시되지는 않습니다. delegate는 SliverChildDelegate를 받아 item 생성을 완료합니다.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentList 기본 사용", + "desc": [ + "【prototypeItem】 : 주축 방향 크기 컴포넌트 【Widget】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json new file mode 100644 index 00000000..daa4feea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista de Extensão de Protótipo Sliver", + "info": "A propriedade prototypeItem é um Widget, que é responsável por restringir o tamanho do item na direção do eixo principal, mas não será exibido. O delegate aceita um SliverChildDelegate para criar o item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente de tamanho na direção do eixo principal 【Widget】", + "【delegate】 : Delegado de criança 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json new file mode 100644 index 00000000..6ce33abf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Список расширений прототипа Sliver", + "info": "Свойство prototypeItem является Widget, оно отвечает за ограничение размера элемента в направлении основной оси, но не отображается. Delegate принимает SliverChildDelegate для создания элементов.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Компонент размера в направлении основной оси 【Widget】", + "【delegate】 : Делегат детей 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json new file mode 100644 index 00000000..4a5ffaf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver原型延伸列表", + "info": "其中prototypeItem属性是Widget,它负责约束主轴方向上item尺寸,但不会显示出来。delegate接受一个SliverChildDelegate完成item的创建。", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentList基本使用", + "desc": [ + "【prototypeItem】 : 主轴方向尺寸组件 【Widget】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart new file mode 100644 index 00000000..04deb557 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class SliverPrototypeExtentListDemo extends StatefulWidget { + const SliverPrototypeExtentListDemo({Key? key}) : super(key: key); + + @override + _SliverPrototypeExtentListDemoState createState() => + _SliverPrototypeExtentListDemoState(); +} + +class _SliverPrototypeExtentListDemoState + extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [_buildSliverAppBar(), _buildSliverList()], + ), + ); + } + + Widget _buildSliverList() => SliverPrototypeExtentList( + prototypeItem: Container( + height: 80, + ), + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 150.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 5, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json new file mode 100644 index 00000000..e2848f0a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver-Adapter", + "info": "Kann ein normales Widget aufnehmen und in ein Sliver-Widget umwandeln.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverToBoxAdapter", + "desc": [ + "【child】 : Untergeordnetes Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json new file mode 100644 index 00000000..efcf4521 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver Adapter", + "info": "An adapter that can accommodate a common component and convert it into a component of the Sliver family.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverToBoxAdapter", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json new file mode 100644 index 00000000..fc7ad225 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptador Sliver", + "info": "Puede contener un componente común y convertirlo en un adaptador para los componentes de la familia Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverToBoxAdapter", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json new file mode 100644 index 00000000..0d6c369d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptateur Sliver", + "info": "Un adaptateur qui peut contenir un composant ordinaire et le transformer en un composant de la famille Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverToBoxAdapter", + "desc": [ + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json new file mode 100644 index 00000000..684fd564 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adattatore Sliver", + "info": "Un adattatore che può contenere un componente normale e trasformarlo in un componente della famiglia Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverToBoxAdapter", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json new file mode 100644 index 00000000..30979cf2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliverアダプター", + "info": "通常のコンポーネントを収容し、それをSliverファミリーのコンポーネントに変換するアダプターです。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapterの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json new file mode 100644 index 00000000..89baca35 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver 어댑터", + "info": "일반 컴포넌트를 수용하고 Sliver 패밀리 컴포넌트로 변환할 수 있는 어댑터입니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapter 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json new file mode 100644 index 00000000..cd781211 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptador Sliver", + "info": "Pode acomodar um componente comum e transformá-lo num adaptador para componentes da família Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverToBoxAdapter", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json new file mode 100644 index 00000000..5912820d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver адаптер", + "info": "Адаптер, который может вместить обычный компонент и преобразовать его в компонент семейства Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverToBoxAdapter", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json new file mode 100644 index 00000000..10aef0b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver适配器", + "info": "可以容纳一个普通的组件,并将其转化成Sliver家族组件的适配器。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapter基本使用", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart new file mode 100644 index 00000000..31d23053 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class SliverToBoxAdapterDemo extends StatelessWidget { + const SliverToBoxAdapterDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + _buildSliverAppBar(), + _buildCommonWidget(), + _buildSliverList() + ], + ), + ); + } + + Widget _buildCommonWidget() => SliverToBoxAdapter( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + title: const Text("以梦为马"), + subtitle: const Text("海子"), + selected: true, + contentPadding: const EdgeInsets.all(5), + trailing: const Icon(Icons.more_vert), + ), + ), + ); + + Widget _buildSliverList() => SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: _buildLeading(), + title: const Text('张风捷特烈'), + actions: _buildActions(), + elevation: 2, + pinned: true, + backgroundColor: Colors.orange, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildLeading() => Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')); + + List _buildActions() => [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.star_border, + color: Colors.white, + ), + ) + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json new file mode 100644 index 00000000..7e133c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver Keep-Alive-Container", + "info": "Es ist eine abstrakte Klasse und kann nicht alleine verwendet werden. Nur seine Unterklassen können Keep-Alive-Kinder aufnehmen.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in SliverWithKeepAliveWidget", + "desc": [ + "【key】 : Schlüssel 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json new file mode 100644 index 00000000..fd21e244 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver Keep-Alive Container", + "info": "It is an abstract class and cannot be used alone. Only its subclasses can accommodate KeepAlive children.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to SliverWithKeepAliveWidget", + "desc": [ + "【key】 : key 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json new file mode 100644 index 00000000..f71c8206 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Contenedor Sliver con KeepAlive", + "info": "Es una clase abstracta y no se puede usar por sí sola. Solo sus subclases pueden contener hijos con KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a SliverWithKeepAliveWidget", + "desc": [ + "【key】 : clave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json new file mode 100644 index 00000000..30bc843a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Conteneur Sliver avec KeepAlive", + "info": "C'est une classe abstraite et ne peut pas être utilisée seule. Seules ses sous-classes peuvent contenir des enfants KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à SliverWithKeepAliveWidget", + "desc": [ + "【key】 : clé 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json new file mode 100644 index 00000000..2679e37d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Contenitore Sliver con KeepAlive", + "info": "È una classe astratta e non può essere utilizzata da sola. Solo le sue sottoclassi possono contenere figli KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a SliverWithKeepAliveWidget", + "desc": [ + "【key】 : chiave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json new file mode 100644 index 00000000..7871fae7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver保活コンテナ", + "info": "これは抽象クラスであり、単独で使用することはできません。そのサブクラスのみがKeepAliveの子を保持できます。", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 紹介", + "desc": [ + "【key】 : キー 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json new file mode 100644 index 00000000..ce057802 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver 생존 유지 컨테이너", + "info": "이것은 추상 클래스로, 단독으로 사용할 수 없습니다. 오직 그 하위 클래스만이 KeepAlive 자식을 포함할 수 있습니다.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 소개", + "desc": [ + "【key】 : 키 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json new file mode 100644 index 00000000..6ad1ecdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Recipiente Sliver com KeepAlive", + "info": "É uma classe abstrata e não pode ser usada sozinha. Apenas suas subclasses podem conter filhos KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao SliverWithKeepAliveWidget", + "desc": [ + "【key】 : chave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json new file mode 100644 index 00000000..42890b04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver контейнер с поддержкой активности", + "info": "Это абстрактный класс, который нельзя использовать отдельно. Только его подклассы могут содержать дочерние элементы KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в SliverWithKeepAliveWidget", + "desc": [ + "【key】 : ключ 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json new file mode 100644 index 00000000..801ceb7f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver保活容器", + "info": "它是抽象类,不能单独使用。只有其子类才可以容纳 KeepAlive 的孩子.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 介绍", + "desc": [ + "【key】 : 键 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart new file mode 100644 index 00000000..e079ddc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + + +class SliverWithKeepAliveWidgetDemo extends StatelessWidget { + const SliverWithKeepAliveWidgetDemo({Key? key}) : super(key: key); + + final String info = + '只有 SliverWithKeepAliveWidget 之下才可以包含 KeepAlive 组件, 由于其为抽象类,不能直接使用。其子类 SliverMultiBoxAdaptorWidget 也说抽象类,' + '用于容纳多个孩子,帮助它的子类使用 SliverChildDelegate 构建懒加载 children。' + '最终实现类为 SliverGrid、SliverList、SliverPrototypeExtentList、SliverFixedExtentList,表示他们都可以支持 item 的状态保持。' + '除此之外还有 _SliverFillViewportRenderObjectWidget 的私有实现类,这是 PageView 的底层实现,这也是为什么 PageView 也支持保活的原因。'; + + @override + Widget build(BuildContext context) { + + return Container( + color: Theme.of(context).primaryColor.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json new file mode 100644 index 00000000..5ab06a88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Ausrichtungsübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Alignment verwendet, um eine Übergangsanimation zwischen zwei Alignment-Objekten für das untergeordnete Widget zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AlignTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【alignment】 : Ausrichtungsanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json new file mode 100644 index 00000000..cb576d3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Alignment Transition", + "info": "A subclass of AnimatedWidget, using an animator of type Alignment to allow child components to transition between two Alignment objects.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AlignTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【alignment】: Alignment animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json new file mode 100644 index 00000000..969c3b2c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transición de alineación", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Alignment para permitir que los componentes hijos realicen una animación de transición entre dos objetos Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AlignTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【alignment】 : Animación de alineación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json new file mode 100644 index 00000000..afe4f300 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transition d'alignement", + "info": "Sous-classe de AnimatedWidget, utilisant un animateur de type Alignment pour permettre à un composant enfant de faire une transition animée entre deux objets Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AlignTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【alignment】 : Animation d'alignement 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json new file mode 100644 index 00000000..252739a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transizione di allineamento", + "info": "Una sottoclasse di AnimatedWidget, utilizza un animatore di tipo Alignment per far sì che i componenti figli effettuino una transizione animata tra due oggetti Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AlignTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【alignment】 : Animazione di allineamento 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json new file mode 100644 index 00000000..9d05b594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "整列遷移", + "info": "AnimatedWidgetのサブクラスで、Alignmentタイプのアニメーターを使用して子コンポーネントを2つのAlignmentオブジェクト間で遷移アニメーションさせます。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【alignment】 : 整列アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json new file mode 100644 index 00000000..4af24abf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "정렬 변환", + "info": "AnimatedWidget의 하위 클래스, Alignment 타입의 애니메이터를 사용하여 자식 위젯이 두 Alignment 객체 사이에서 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【alignment】 : 정렬 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json new file mode 100644 index 00000000..a7abb56e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transição de Alinhamento", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Alignment para permitir que um componente filho faça uma animação de transição entre dois objetos Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AlignTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【alignment】 : Animação de alinhamento 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json new file mode 100644 index 00000000..5ef6388f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Анимация выравнивания", + "info": "Подкласс AnimatedWidget, использующий аниматор типа Alignment для создания переходной анимации между двумя объектами Alignment для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AlignTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【alignment】 : Анимация выравнивания 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json new file mode 100644 index 00000000..8d6d6db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "对齐变换", + "info": "AnimatedWidget的子类,使用Alignment类型的动画器让子组件在两个Alignment对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【alignment】 : 对齐动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart new file mode 100644 index 00000000..daf4201f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart @@ -0,0 +1,54 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomAlignTransition extends StatefulWidget { + const CustomAlignTransition({Key? key}) : super(key: key); + + @override + _CustomAlignTransitionState createState() => _CustomAlignTransitionState(); +} + +class _CustomAlignTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 1), + ); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + width: MediaQuery.of(context).size.width, + color: Colors.grey.withAlpha(33), + height: 100, + child: AlignTransition( + alignment: AlignmentTween( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ).animate(_ctrl), + child: const Icon( + Icons.android, + color: Colors.green, + size: 60, + ), + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json new file mode 100644 index 00000000..553c66f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Ausrichtungsanimation", + "info": "Ermöglicht die Ausrichtungsanimation von Unterkomponenten, ermöglicht die Angabe von Dauer und Kurve und verfügt über ein Ereignis für das Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedAlign", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【duration】: Animationsdauer 【Duration】", + "【onEnd】: Rückruf bei Ende der Animation 【Function()】", + "【alignment】: Ausrichtungsart 【AlignmentGeometry】", + "【curve】: Animationskurve 【Duration】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json new file mode 100644 index 00000000..d3e7481b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Alignment Animation", + "info": "Allows child components to perform Align (alignment) animations, with specified duration and curve, and includes an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedAlign", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【alignment】: Alignment method 【AlignmentGeometry】", + "【curve】: Animation curve 【Duration】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json new file mode 100644 index 00000000..af8b46dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animación de alineación", + "info": "Permite que los componentes hijos realicen una animación de Align (alineación), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedAlign", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】", + "【curve】 : Curva de la animación 【Duration】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json new file mode 100644 index 00000000..38d3c4a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animation d'alignement", + "info": "Permet à un composant enfant de réaliser une animation d'alignement (Align), avec la possibilité de spécifier la durée et la courbe, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AnimatedAlign", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】", + "【curve】 : Courbe de l'animation 【Duration】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json new file mode 100644 index 00000000..0c6ea987 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Allineamento Animato", + "info": "Consente ai componenti figli di eseguire animazioni di allineamento (Align), con la possibilità di specificare la durata e la curva, e con un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedAlign", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】", + "【curve】 : Curva dell'animazione 【Duration】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json new file mode 100644 index 00000000..f14ebc2f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "アニメーションアライメント", + "info": "子コンポーネントにAlign(アライメント)アニメーションを行わせることができます。時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlignの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【alignment】 : アライメント方法 【AlignmentGeometry】", + "【curve】 : アニメーション曲線 【Duration】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json new file mode 100644 index 00000000..1dcd679e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "정렬 애니메이션", + "info": "자식 위젯이 Align(정렬) 애니메이션을 수행할 수 있게 하며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlign 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json new file mode 100644 index 00000000..2a9dfac3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animação de Alinhamento", + "info": "Permite que os componentes filhos realizem animações de Alinhamento (Align), podendo especificar a duração e a curva, com evento de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AnimatedAlign", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【curve】 : Curva da animação 【Duration】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json new file mode 100644 index 00000000..782ec832 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Анимация выравнивания", + "info": "Позволяет дочернему компоненту выполнять анимацию выравнивания (Align), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedAlign", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【curve】 : Кривая анимации 【Duration】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json new file mode 100644 index 00000000..f5ff4946 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "对齐动画", + "info": "能让子组件进行Align(对齐)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlign基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【curve】 : 动画曲线 【Duration】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart new file mode 100644 index 00000000..6005ec16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedAlign extends StatefulWidget { + const CustomAnimatedAlign({Key? key}) : super(key: key); + + @override + _CustomAnimatedAlignState createState() => _CustomAnimatedAlignState(); +} + +class _CustomAnimatedAlignState extends State { + final Alignment start = const Alignment(0, 0); + final Alignment end = Alignment.bottomRight; + + late Alignment _alignment; + + @override + void initState() { + _alignment = start; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + child: AnimatedAlign( + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + alignment: _alignment, + onEnd: () => print('End'), + child: Container( + height: 40, + width: 80, + alignment: Alignment.center, + color: Colors.blue, + child: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.white), + ), + ), + ), + ), + ], + ); + } + + Widget _buildSwitch() => Switch( + value: _alignment == end, + onChanged: (v) { + setState(() { + _alignment = v ? end : start; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json new file mode 100644 index 00000000..57e1754f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Animations-Builder", + "info": "Durch den Builder werden die entsprechenden Knoten der Animation lokal aktualisiert, und es wird vermieden, dass untergeordnete Komponenten aktualisiert werden, wodurch die Bauzeit reduziert und die Animationsleistung verbessert wird.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Anwendungsbeispiel für AnimatedBuilder", + "desc": [ + "【animation】 : *beobachtbares Objekt 【Listenable】", + "【builder】 : *Komponenten-Builder 【TransitionBuilder】", + "【child】 : untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json new file mode 100644 index 00000000..700c5563 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Animated Builder", + "info": "By using the builder, the corresponding node of the animation can be updated locally, and the refresh of child components can be avoided, reducing the build time and improving animation performance.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder Usage Example", + "desc": [ + "【animation】: *Listenable object 【Listenable】", + "【builder】: *Component builder 【TransitionBuilder】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json new file mode 100644 index 00000000..4c55c51f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Constructor de Animación", + "info": "A través del builder, hace que los nodos correspondientes a la animación se actualicen parcialmente, y evita la actualización de los componentes hijos, reduciendo el tiempo de construcción y mejorando el rendimiento de la animación.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Caso de uso de AnimatedBuilder", + "desc": [ + "【animation】 : *Objeto observable 【Listenable】", + "【builder】 : *Constructor de componentes 【TransitionBuilder】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json new file mode 100644 index 00000000..5f566be4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Constructeur d'animation", + "info": "Rend les nœuds correspondant à l'animation mis à jour localement via le builder, évite le rafraîchissement des composants enfants, réduit le temps de construction et améliore les performances de l'animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemple d'utilisation d'AnimatedBuilder", + "desc": [ + "【animation】 : *Objet observable 【Listenable】", + "【builder】 : *Constructeur de composant 【TransitionBuilder】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json new file mode 100644 index 00000000..24f5dc3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Costruttore di animazioni", + "info": "Attraverso il builder, il nodo corrispondente all'animazione viene aggiornato localmente, evitando l'aggiornamento dei componenti figli, riducendo il tempo di costruzione e migliorando le prestazioni dell'animazione.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Esempio di utilizzo di AnimatedBuilder", + "desc": [ + "【animation】 : *oggetto ascoltabile 【Listenable】", + "【builder】 : *costruttore di componenti 【TransitionBuilder】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json new file mode 100644 index 00000000..bb283ed6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "アニメーションビルダー", + "info": "ビルダーを通じてアニメーションに対応するノードを部分的に更新し、子コンポーネントのリフレッシュを避け、ビルド時間を短縮し、アニメーションのパフォーマンスを向上させます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 使用例", + "desc": [ + "【animation】 : *リスナブルオブジェクト 【Listenable】", + "【builder】 : *コンポーネントビルダー 【TransitionBuilder】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json new file mode 100644 index 00000000..8f79a9c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "애니메이션 빌더", + "info": "빌더를 통해 애니메이션에 해당하는 노드를 부분적으로 업데이트하고, 하위 컴포넌트의 새로고침을 방지하여 빌드 시간을 줄이고 애니메이션 성능을 향상시킵니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 사용 예제", + "desc": [ + "【animation】 : *리스너 가능 객체 【Listenable】", + "【builder】 : *컴포넌트 빌더 【TransitionBuilder】", + "【child】 : 하위 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json new file mode 100644 index 00000000..6fa9c0de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Construtor de Animação", + "info": "Através do builder, o nó correspondente à animação é atualizado localmente, evitando a atualização de componentes filhos, reduzindo o tempo de construção e melhorando o desempenho da animação.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemplo de uso do AnimatedBuilder", + "desc": [ + "【animation】 : *objeto observável 【Listenable】", + "【builder】 : *construtor de componente 【TransitionBuilder】", + "【child】 : componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json new file mode 100644 index 00000000..1eac5f1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Анимационный конструктор", + "info": "С помощью builder делает узел, соответствующий анимации, частично обновляемым, а также позволяет избежать обновления дочерних компонентов, сократить время сборки и повысить производительность анимации.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Пример использования AnimatedBuilder", + "desc": [ + "【animation】 : *Объект, который можно прослушивать 【Listenable】", + "【builder】 : *Конструктор компонентов 【TransitionBuilder】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json new file mode 100644 index 00000000..afc38032 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "动画构造器", + "info": "通过 builder 使动画对应的节点变为局部更新,并且可避免子组件刷新,减少构建的时间,提高动画性能。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 使用案例", + "desc": [ + "【animation】 : *可监听对象 【Listenable】", + "【builder】 : *组件构造器 【TransitionBuilder】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart new file mode 100644 index 00000000..ea7fe567 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart @@ -0,0 +1,62 @@ + +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class AnimatedBuilderDemo extends StatefulWidget { + const AnimatedBuilderDemo({Key? key}) : super(key: key); + + @override + _AnimatedBuilderDemoState createState() => _AnimatedBuilderDemoState(); +} + +class _AnimatedBuilderDemoState extends State + with SingleTickerProviderStateMixin { + late AnimationController controller; + + @override + void initState() { + super.initState(); + controller = AnimationController( + vsync: this, + lowerBound: 0.3, + upperBound: 1.0, + duration: const Duration(milliseconds: 500)) + ..forward(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + controller.forward(from: 0); + }, + child: AnimatedBuilder( + animation: controller, + builder: (ctx, child) { + return Transform.scale( + scale: controller.value, + child: Opacity(opacity: controller.value, child: child), + ); + }, + child: buildChild()), + ); + } + + Widget buildChild() => Container( + height: 100, + width: 100, + decoration: const BoxDecoration( + color: Colors.orange, + shape: BoxShape.circle, + ), + alignment: Alignment.center, + child: const Text( + 'Toly', + style: TextStyle(fontSize: 40, color: Colors.white), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json new file mode 100644 index 00000000..3c9dd45c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animierter Container", + "info": "Vereint alignment, padding, color, decoration, width, height, constraints, margin, transform in einem. Alle diese Eigenschaften können animiert werden, können Dauer und Kurve angeben und haben ein Ereignis am Ende der Animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedContainer", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【color】 : Farbe 【Color】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【decoration】 : Dekoration 【Decoration】", + "【constraints】 : Einschränkungen 【BoxConstraints】", + "【transform】 : Transformation 【Matrix4】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json new file mode 100644 index 00000000..f9f0462c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Container Animation", + "info": "Combines alignment, padding, color, decoration, width, height, constraints, margin, and transform, all of which can be animated. You can specify the duration and curve, and there is an animation end event.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedContainer", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【color】: Color 【Color】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【decoration】: Decoration 【Decoration】", + "【constraints】: Constraints 【BoxConstraints】", + "【transform】: Transformation 【Matrix4】", + "【margin】: Margin 【EdgeInsetsGeometry】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json new file mode 100644 index 00000000..c8284b88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Contenedor Animado", + "info": "Combina alignment, padding, color, decoration, width, height, constraints, margin, transform en uno solo. Todas estas propiedades pueden animarse, se pueden especificar la duración y la curva, y tiene un evento de finalización de animación.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedContainer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【color】 : Color 【Color】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【decoration】 : Decoración 【Decoration】", + "【constraints】 : Restricciones 【BoxConstraints】", + "【transform】 : Transformación 【Matrix4】", + "【margin】 : Margen exterior 【EdgeInsetsGeometry】", + "【padding】 : Margen interior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json new file mode 100644 index 00000000..430220de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animation de conteneur", + "info": "Combine alignment, padding, color, decoration, width, height, constraints, margin, transform en un seul, toutes ces propriétés peuvent être animées, la durée et la courbe peuvent être spécifiées, et il y a un événement de fin d'animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedContainer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【color】 : Couleur 【Color】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【decoration】 : Décoration 【Decoration】", + "【constraints】 : Contraintes 【BoxConstraints】", + "【transform】 : Transformation 【Matrix4】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json new file mode 100644 index 00000000..fcb17f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animazione del contenitore", + "info": "Raccoglie alignment, padding, color, decoration, width, height, constraints, margin, transform in un unico componente. Tutti questi attributi possono essere animati, è possibile specificare la durata e la curva, e c'è un evento di fine animazione.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedContainer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【color】 : Colore 【Color】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【decoration】 : Decorazione 【Decoration】", + "【constraints】 : Vincoli 【BoxConstraints】", + "【transform】 : Trasformazione 【Matrix4】", + "【margin】 : Margine esterno 【EdgeInsetsGeometry】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json new file mode 100644 index 00000000..85d41bc0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "コンテナアニメーション", + "info": "alignment、padding、color、decoration、width、height、constraints、margin、transformを集約し、これらのプロパティはすべてアニメーション可能で、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainerの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【color】 : 色 【Color】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】", + "【alignment】 : 配置 【AlignmentGeometry】", + "【decoration】 : 装飾 【Decoration】", + "【constraints】 : 制約 【BoxConstraints】", + "【transform】 : 変換 【Matrix4】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json new file mode 100644 index 00000000..0e4e5f8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "애니메이션 컨테이너", + "info": "alignment, padding, color, decoration, width, height, constraints, margin, transform을 모두 포함하며, 이러한 속성들은 모두 애니메이션 가능하며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainer 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【color】 : 색상 【Color】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】", + "【alignment】 : 정렬 【AlignmentGeometry】", + "【decoration】 : 장식 【Decoration】", + "【constraints】 : 제약 【BoxConstraints】", + "【transform】 : 변환 【Matrix4】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json new file mode 100644 index 00000000..f13eb49f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animação de Contêiner", + "info": "Combina alignment, padding, color, decoration, width, height, constraints, margin, transform em um único lugar, todas essas propriedades podem ser animadas, é possível especificar a duração e a curva, e há um evento de término da animação.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedContainer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【color】 : Cor 【Color】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【decoration】 : Decoração 【Decoration】", + "【constraints】 : Restrições 【BoxConstraints】", + "【transform】 : Transformação 【Matrix4】", + "【margin】 : Margem externa 【EdgeInsetsGeometry】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json new file mode 100644 index 00000000..d0a51b15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Анимация контейнера", + "info": "Объединяет alignment, padding, color, decoration, width, height, constraints, margin, transform. Все эти свойства могут быть анимированы, можно указать длительность и кривую, есть событие завершения анимации.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedContainer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【color】 : Цвет 【Color】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】", + "【alignment】 : Выравнивание 【AlignmentGeometry】", + "【decoration】 : Декорация 【Decoration】", + "【constraints】 : Ограничения 【BoxConstraints】", + "【transform】 : Преобразование 【Matrix4】", + "【margin】 : Внешний отступ 【EdgeInsetsGeometry】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json new file mode 100644 index 00000000..dbec27ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "容器动画", + "info": "集合alignment、padding、color、decoration、width、height、constraints、margin、transform于一身,这些属性皆可动画,可指定时长和曲线,有动画结束事件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【color】 : 颜色 【Color】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】", + "【alignment】 : 对齐 【AlignmentGeometry】", + "【decoration】 : 装饰 【Decoration】", + "【constraints】 : 约束 【BoxConstraints】", + "【transform】 : 变化 【Matrix4】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart new file mode 100644 index 00000000..e65689a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedContainer extends StatefulWidget { + const CustomAnimatedContainer({Key? key}) : super(key: key); + + @override + _CustomAnimatedContainerState createState() => + _CustomAnimatedContainerState(); +} + +class _CustomAnimatedContainerState extends State { + final Decoration startDecoration = const BoxDecoration( + color: Colors.deepPurple, + borderRadius: BorderRadius.all(Radius.circular(30)), + boxShadow: [ + BoxShadow( + offset: Offset(1, 1), + color: Colors.purple, + blurRadius: 5, + spreadRadius: 2) + ]); + final Decoration endDecoration = const BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.all(Radius.circular(10)), + boxShadow: [ + BoxShadow( + offset: Offset(1, 1), + color: Colors.blue, + blurRadius: 10, + spreadRadius: 0) + ]); + + final Alignment startAlignment = Alignment.topLeft + const Alignment(0.2, 0.2); + final Alignment endAlignment = Alignment.center; + + final double startHeight = 150.0; + final double endHeight = 100.0; + + late Decoration _decoration; + late double _height; + late Alignment _alignment; + + @override + void initState() { + super.initState(); + _decoration = startDecoration; + _height = startHeight; + _alignment = startAlignment; + } + + bool get selected => _height == endHeight; + @override + Widget build(BuildContext context) { + return Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Switch( + value: selected, + onChanged: onChanged, + ), + buildAnim() + ], + ); + } + Widget _buildChild() => const Icon( + Icons.camera_outlined, + size: 30, + color: Colors.white, + ); + Widget buildAnim() => AnimatedContainer( + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + decoration: _decoration, + alignment: _alignment, + onEnd: onEnd, + height: _height, + width: _height, + child: _buildChild(), + ); + void onChanged(bool value) { + setState(() { + _height = value ? endHeight : startHeight; + _decoration = value ? endDecoration : startDecoration; + _alignment = value ? endAlignment : startAlignment; + }); + } + void onEnd() { + print('End'); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json new file mode 100644 index 00000000..f98e5055 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Komponentenwechsel", + "info": "Zeigt Animationseffekte beim Wechsel zwischen zwei Komponenten an. Eigenschaften wie Animationskurve, Dauer, Ausrichtung usw. können angegeben werden. Es ist eine sehr nützliche Komponente.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedCrossFade", + "desc": [ + "【firstChild】 : Erstes Kind 【Widget】", + "【secondChild】 : Zweites Kind 【Widget】", + "【crossFadeState】 : Welches anzeigen 【CrossFadeState】", + "【duration】 : Dauer 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Animationskurve von AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Erste Kurve 【Curve】", + "【secondCurve】 : Zweite Kurve 【Curve】", + "【sizeCurve】 : Größenänderungskurve 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json new file mode 100644 index 00000000..047e68db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Component Switch", + "info": "Presents animation effects when switching between two components, allowing you to specify properties such as animation curves, duration, alignment, etc. It is a very useful component.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedCrossFade", + "desc": [ + "【firstChild】 : First Child 【Widget】", + "【secondChild】 : Second Child 【Widget】", + "【crossFadeState】 : Which to Display 【CrossFadeState】", + "【duration】 : Duration 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Animation Curves of AnimatedCrossFade", + "desc": [ + "【firstCurve】 : First Curve 【Curve】", + "【secondCurve】 : Second Curve 【Curve】", + "【sizeCurve】 : Size Change Curve 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json new file mode 100644 index 00000000..f743f544 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transición de componentes", + "info": "Muestra un efecto de animación al cambiar entre dos componentes, se pueden especificar propiedades como la curva de animación, la duración, la alineación, etc. Es un componente muy útil.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primer hijo 【Widget】", + "【secondChild】 : Segundo hijo 【Widget】", + "【crossFadeState】 : Mostrar cuál 【CrossFadeState】", + "【duration】 : Duración 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva de animación de AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Primera curva 【Curve】", + "【secondCurve】 : Segunda curva 【Curve】", + "【sizeCurve】 : Curva de cambio de tamaño 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json new file mode 100644 index 00000000..530d0ad9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transition de composants", + "info": "Anime la transition entre deux composants avec des effets, en spécifiant des propriétés telles que la courbe d'animation, la durée, l'alignement, etc. C'est un composant très utile.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedCrossFade", + "desc": [ + "【firstChild】 : Premier enfant 【Widget】", + "【secondChild】 : Deuxième enfant 【Widget】", + "【crossFadeState】 : Afficher lequel 【CrossFadeState】", + "【duration】 : Durée 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Courbe d'animation d'AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Première courbe 【Curve】", + "【secondCurve】 : Deuxième courbe 【Curve】", + "【sizeCurve】 : Courbe de changement de taille 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json new file mode 100644 index 00000000..9795e9a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transizione Componenti", + "info": "Presenta un effetto animato quando si passa da un componente all'altro, è possibile specificare proprietà come la curva di animazione, la durata, l'allineamento, ecc. È un componente molto utile.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primo figlio 【Widget】", + "【secondChild】 : Secondo figlio 【Widget】", + "【crossFadeState】 : Mostra quale 【CrossFadeState】", + "【duration】 : Durata 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva di Animazione di AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Prima curva 【Curve】", + "【secondCurve】 : Seconda curva 【Curve】", + "【sizeCurve】 : Curva di variazione dimensionale 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json new file mode 100644 index 00000000..33881318 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "コンポーネント切り替え", + "info": "2つのコンポーネントを切り替える際にアニメーション効果を表示し、アニメーションカーブ、時間、配置方法などの属性を指定できます。非常に便利なコンポーネントです。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFadeの基本使用", + "desc": [ + "【firstChild】 : 最初の子 【Widget】", + "【secondChild】 : 2番目の子 【Widget】", + "【crossFadeState】 : 表示する番号 【CrossFadeState】", + "【duration】 : 時間 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFadeのアニメーションカーブ", + "desc": [ + "【firstCurve】 : 最初のカーブ 【Curve】", + "【secondCurve】 : 2番目のカーブ 【Curve】", + "【sizeCurve】 : サイズ変化カーブ 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json new file mode 100644 index 00000000..6531263e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "컴포넌트 전환", + "info": "두 컴포넌트를 전환할 때 애니메이션 효과를 나타내며, 애니메이션 곡선, 지속 시간, 정렬 방식 등의 속성을 지정할 수 있습니다. 매우 유용한 컴포넌트입니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFade 기본 사용", + "desc": [ + "【firstChild】 : 첫 번째 자식 【Widget】", + "【secondChild】 : 두 번째 자식 【Widget】", + "【crossFadeState】 : 몇 번째를 표시할지 【CrossFadeState】", + "【duration】 : 지속 시간 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFade 애니메이션 곡선", + "desc": [ + "【firstCurve】 : 첫 번째 곡선 【Curve】", + "【secondCurve】 : 두 번째 곡선 【Curve】", + "【sizeCurve】 : 크기 변화 곡선 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json new file mode 100644 index 00000000..1537e8a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transição de Componentes", + "info": "Apresenta um efeito de animação ao alternar entre dois componentes, podendo especificar propriedades como a curva de animação, duração, alinhamento, etc. É um componente muito útil.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primeiro filho 【Widget】", + "【secondChild】 : Segundo filho 【Widget】", + "【crossFadeState】 : Mostrar qual 【CrossFadeState】", + "【duration】 : Duração 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva de Animação do AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Primeira curva 【Curve】", + "【secondCurve】 : Segunda curva 【Curve】", + "【sizeCurve】 : Curva de mudança de tamanho 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json new file mode 100644 index 00000000..2ab52f73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Переключение компонентов", + "info": "При переключении двух компонентов отображается анимация, можно указать такие свойства, как кривая анимации, продолжительность, выравнивание и т.д. Это очень полезный компонент.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedCrossFade", + "desc": [ + "【firstChild】 : Первый ребенок 【Widget】", + "【secondChild】 : Второй ребенок 【Widget】", + "【crossFadeState】 : Показать какой 【CrossFadeState】", + "【duration】 : Продолжительность 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Кривая анимации AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Первая кривая 【Curve】", + "【secondCurve】 : Вторая кривая 【Curve】", + "【sizeCurve】 : Кривая изменения размера 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json new file mode 100644 index 00000000..1c069585 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "组件切换", + "info": "将两个组件切换时呈现动画效果,可指定动画曲线、时长、对齐方式等属性。是一个非常有用的组件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFade基本使用", + "desc": [ + "【firstChild】 : 第一孩子 【Widget】", + "【secondChild】 : 第二孩子 【Widget】", + "【crossFadeState】 : 显示第几个 【CrossFadeState】", + "【duration】 : 时长 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFade动画曲线", + "desc": [ + "【firstCurve】 : 第一曲线 【Curve】", + "【secondCurve】 : 第二曲线 【Curve】", + "【sizeCurve】 : 尺寸变化曲线 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart new file mode 100644 index 00000000..627d7861 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-20 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedCrossFade extends StatefulWidget { + const CustomAnimatedCrossFade({Key? key}) : super(key: key); + + @override + _CustomAnimatedCrossFadeState createState() => + _CustomAnimatedCrossFadeState(); +} + +class _CustomAnimatedCrossFadeState extends State { + CrossFadeState _crossFadeState = CrossFadeState.showFirst; + + bool get isFirst => _crossFadeState == CrossFadeState.showFirst; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + AnimatedCrossFade( + firstChild: Container( + alignment: Alignment.center, + width: 200, + height: 150, + color: Colors.orange, + child: const FlutterLogo(textColor: Colors.blue, size: 100,), + ), + secondChild: Container( + width: 200, + height: 150, + alignment: Alignment.center, + color: Colors.blue, + child: const FlutterLogo( + textColor: Colors.white, +// colors: Colors.orange, + size: 100, + style: FlutterLogoStyle.stacked,), + ), + duration: const Duration(milliseconds: 600), + crossFadeState: _crossFadeState, + ), + _buildSwitch(), + ], + + ); + } + + Widget _buildSwitch() => + Switch(value: isFirst, onChanged: (v) { + setState(() { + _crossFadeState = + v ? CrossFadeState.showFirst : CrossFadeState.showSecond; + }); + }); +} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart similarity index 83% rename from packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart index eab90617..946798ae 100644 --- a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-20 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 100, -// "name": 'AnimatedCrossFade动画曲线', -// "priority": 2, -// "subtitle": -// "【firstCurve】 : 第一曲线 【Curve】\n" -// "【secondCurve】 : 第二曲线 【Curve】\n" -// "【sizeCurve】 : 尺寸变化曲线 【CrossFadeState】", -// } class CurveAnimatedCrossFade extends StatefulWidget { const CurveAnimatedCrossFade({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json new file mode 100644 index 00000000..100cc066 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Container-Animation", + "info": "Ermöglicht die Animation von TextStyle (Textstil) für untergeordnete Textkomponenten, gibt Dauer und Kurve an und verfügt über ein Ereignis zum Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【textAlign】 : Textausrichtung 【TextAlign】", + "【softWrap】 : Umhüllung 【bool】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【overflow】 : Überlaufmodus 【TextOverflow】", + "【style】 : Textstil 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json new file mode 100644 index 00000000..59279303 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Container Animation", + "info": "Allows child text components to perform TextStyle (text style) animations, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedDefaultTextStyle", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【textAlign】: Text alignment 【TextAlign】", + "【softWrap】: Whether to wrap 【bool】", + "【maxLines】: Maximum number of lines 【int】", + "【overflow】: Overflow mode 【TextOverflow】", + "【style】: Text style 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json new file mode 100644 index 00000000..c54a2bd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animación de contenedor", + "info": "Permite que los componentes de texto hijos realicen una animación de TextStyle (estilo de texto), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【softWrap】 : Si se envuelve 【bool】", + "【maxLines】 : Número máximo de líneas 【int】", + "【overflow】 : Modo de desbordamiento 【TextOverflow】", + "【style】 : Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json new file mode 100644 index 00000000..939dd077 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animation de conteneur", + "info": "Permet aux composants texte enfants d'effectuer une animation TextStyle (style de texte), peut spécifier la durée et la courbe, et dispose d'un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【softWrap】 : Encapsulage 【bool】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【overflow】 : Mode de débordement 【TextOverflow】", + "【style】 : Style de texte 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json new file mode 100644 index 00000000..058c9f6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animazione del contenitore", + "info": "Consente ai componenti di testo figlio di animare lo stile del testo (TextStyle), con la possibilità di specificare durata e curva, e un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【softWrap】 : Avvolgimento del testo 【bool】", + "【maxLines】 : Numero massimo di righe 【int】", + "【overflow】 : Modalità di overflow 【TextOverflow】", + "【style】 : Stile del testo 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json new file mode 100644 index 00000000..77d50c44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "コンテナアニメーション", + "info": "子テキストコンポーネントにTextStyle(テキストスタイル)アニメーションを適用できます。時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyleの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【softWrap】 : ラップするかどうか 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : オーバーフローモード 【TextOverflow】", + "【style】 : テキストスタイル 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json new file mode 100644 index 00000000..b68b4dce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "컨테이너 애니메이션", + "info": "자식 텍스트 컴포넌트에 TextStyle(텍스트 스타일) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyle 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【softWrap】 : 감싸기 여부 【bool】", + "【maxLines】 : 최대 줄 수 【int】", + "【overflow】 : 오버플로우 모드 【TextOverflow】", + "【style】 : 텍스트 스타일 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json new file mode 100644 index 00000000..d95c63a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animação de Contêiner", + "info": "Permite que componentes de texto filhos realizem animações de TextStyle (estilo de texto), pode especificar duração e curva, e possui evento de término de animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【softWrap】 : Se deve envolver 【bool】", + "【maxLines】 : Número máximo de linhas 【int】", + "【overflow】 : Modo de overflow 【TextOverflow】", + "【style】 : Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json new file mode 100644 index 00000000..83117ad5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Анимация контейнера", + "info": "Позволяет дочерним текстовым компонентам анимировать TextStyle (стиль текста), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【softWrap】 : Обёртка 【bool】", + "【maxLines】 : Максимальное количество строк 【int】", + "【overflow】 : Режим переполнения 【TextOverflow】", + "【style】 : Стиль текста 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json new file mode 100644 index 00000000..0f48f68e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "容器动画", + "info": "能让子文字组件进行TextStyle(文字样式)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyle基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【softWrap】 : 是否包裹 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : 溢出模式 【TextOverflow】", + "【style】 : 文字样式 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart new file mode 100644 index 00000000..5923a1f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedDefaultTextStyle extends StatefulWidget { + const CustomAnimatedDefaultTextStyle({Key? key}) : super(key: key); + + @override + _CustomAnimatedDefaultTextStyleState createState() => + _CustomAnimatedDefaultTextStyleState(); +} + +class _CustomAnimatedDefaultTextStyleState + extends State { + final TextStyle start = const TextStyle( + color: Colors.blue, + fontSize: 50, + shadows: [ + Shadow(offset: Offset(1, 1), color: Colors.black, blurRadius: 3) + ]); + final TextStyle end = const TextStyle( + color: Colors.white, + fontSize: 20, + shadows: [ + Shadow(offset: Offset(1, 1), color: Colors.purple, blurRadius: 3) + ]); + + late TextStyle _style; + + @override + void initState() { + _style = start; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + alignment: Alignment.center, + color: Colors.grey.withAlpha(22), + width: 300, + height: 100, + child: AnimatedDefaultTextStyle( + textAlign: TextAlign.start, + softWrap: true, + maxLines: 1, + overflow: TextOverflow.ellipsis, + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + style: _style, + onEnd: () => print('End'), + child: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.white), + ), + ), + ), + ], + ); + } + + Widget _buildSwitch() => Switch( + value: _style == end, + onChanged: (v) { + setState(() { + _style = v ? end : start; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json new file mode 100644 index 00000000..df9f0464 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Animierte Bruchteilbox", + "info": "Animierte Version von FractionallySizedBox, die sich automatisch und sanft innerhalb der angegebenen Dauer zur Zielgröße und Position des Kindelements übergeht, wenn sich widthFactor oder heightFactor ändern sowie wenn sich die Ausrichtung ändert.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animationsübergangseffekt", + "desc": [ + "In diesem Fall werden die Parameter heightFactor, widthFactor und alignment beim Klicken geändert, um den Animationseffekt zu sehen.", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Animationsende 【Function()】", + "【alignment】 : Animationszentrum 【Alignment】", + "【curve】 : Animationskurve 【Duration】", + "【heightFactor】 : Höhenfaktor 【double?】", + "【widthFactor】 : Breitenfaktor 【double?】", + "【turns】 : Drehungsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json new file mode 100644 index 00000000..5edb98fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Animated Fractionally Sized Box", + "info": "An animated version of FractionallySizedBox, which automatically and smoothly transitions to the target size and position of the child component within the specified duration when the widthFactor or heightFactor changes, or when the alignment changes.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animation Transition Effect", + "desc": [ + "In this case, the heightFactor, widthFactor, and alignment parameters are modified when clicked to view the animation effect.", + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【onEnd】 : Animation end callback 【Function()】", + "【alignment】 : Animation transformation center 【Alignment】", + "【curve】 : Animation curve 【Duration】", + "【heightFactor】 : Height factor 【double?】", + "【widthFactor】 : Width factor 【double?】", + "【turns】 : Rotation amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json new file mode 100644 index 00000000..a05b4fdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Caja de tamaño fraccional animada", + "info": "Versión animada de FractionallySizedBox, cuando cambia el widthFactor o el heightFactor, así como cuando cambia el alignment, se realizará una transición suave automática a las dimensiones y posición objetivo del componente hijo en la duración especificada.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de transición animada", + "desc": [ + "En este caso, al hacer clic se modifican los parámetros heightFactor, widthFactor, alignment para ver el efecto de movimiento animado.", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【curve】 : Curva de la animación 【Duration】", + "【heightFactor】 : Factor de altura 【double?】", + "【widthFactor】 : Factor de ancho 【double?】", + "【turns】 : Cantidad de rotación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json new file mode 100644 index 00000000..9662b770 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Boîte fractionnée animée", + "info": "Version animée de FractionallySizedBox, lorsque widthFactor ou heightFactor change, ainsi que lorsque l'alignement change, elle transite automatiquement et en douceur vers la taille et la position cible du composant enfant dans la durée spécifiée.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet de transition animée", + "desc": [ + "Dans ce cas, en cliquant, les paramètres heightFactor, widthFactor et alignment sont modifiés pour observer l'effet de mouvement animé.", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【curve】 : Courbe de l'animation 【Duration】", + "【heightFactor】 : Facteur de hauteur 【double?】", + "【widthFactor】 : Facteur de largeur 【double?】", + "【turns】 : Quantité de rotation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json new file mode 100644 index 00000000..96dd4486 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Scatola animata frazionata", + "info": "Versione animata di FractionallySizedBox, quando widthFactor o heightFactor cambiano, così come quando alignment cambia, si transiziona automaticamente e dolcemente alle dimensioni e posizioni target del componente figlio entro la durata specificata.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di transizione animata", + "desc": [ + "In questo caso, cliccando si modificano i parametri heightFactor, widthFactor, alignment, per osservare l'effetto del movimento animato.", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【alignment】 : Centro di trasformazione dell'animazione 【Alignment】", + "【curve】 : Curva dell'animazione 【Duration】", + "【heightFactor】 : Fattore di altezza 【double?】", + "【widthFactor】 : Fattore di larghezza 【double?】", + "【turns】 : Quantità di rotazione 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json new file mode 100644 index 00000000..70b690cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "アニメーションフラクショナリーボックス", + "info": "FractionallySizedBox のアニメーションバージョンで、widthFactor または heightFactor が変化したとき、および alignment が変更されたときに、指定された期間内で子コンポーネントの目標サイズと位置に自動的にスムーズに遷移します。", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "アニメーション遷移効果", + "desc": [ + "このケースでは、クリックすると heightFactor、widthFactor、alignment パラメータが変更され、アニメーションの動きを確認できます。", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【alignment】 : アニメーション変換中心 【Alignment】", + "【curve】 : アニメーションカーブ 【Duration】", + "【heightFactor】 : 高さ分率 【double?】", + "【widthFactor】 : 幅分率 【double?】", + "【turns】 : 回転量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json new file mode 100644 index 00000000..036dd40f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "애니메이션 분율 박스", + "info": "FractionallySizedBox의 애니메이션 버전으로, widthFactor 또는 heightFactor가 변경될 때, 그리고 alignment가 변경될 때 지정된 지속 시간 동안 자동으로 부드럽게 자식 위젯의 목표 크기와 위치로 전환됩니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "애니메이션 전환 효과", + "desc": [ + "이 예제에서는 클릭 시 heightFactor, widthFactor, alignment 매개변수를 수정하여 애니메이션 동작 효과를 확인합니다.", + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【heightFactor】 : 높이 분율 【double?】", + "【widthFactor】 : 너비 분율 【double?】", + "【turns】 : 회전량 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json new file mode 100644 index 00000000..1b385553 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Caixa de Fração Animada", + "info": "Versão animada do FractionallySizedBox, quando o widthFactor ou heightFactor muda, assim como a alignment, ele faz automaticamente uma transição suave para o tamanho e posição desejados do componente filho dentro da duração especificada.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Transição Animada", + "desc": [ + "Neste caso, ao clicar, os parâmetros heightFactor, widthFactor e alignment são modificados para visualizar o efeito de movimento da animação.", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim da animação 【Function()】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【curve】 : Curva da animação 【Duration】", + "【heightFactor】 : Fator de altura 【double?】", + "【widthFactor】 : Fator de largura 【double?】", + "【turns】 : Quantidade de rotação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json new file mode 100644 index 00000000..8efe05d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Анимированный FractionallySizedBox", + "info": "Анимированная версия FractionallySizedBox, которая автоматически плавно переходит к целевому размеру и положению дочернего компонента в течение указанной продолжительности при изменении widthFactor или heightFactor, а также при изменении alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Анимационный переход", + "desc": [ + "В этом примере при нажатии изменяются параметры heightFactor, widthFactor и alignment, чтобы увидеть эффект анимации.", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【alignment】 : Центр анимационного преобразования 【Alignment】", + "【curve】 : Кривая анимации 【Duration】", + "【heightFactor】 : Коэффициент высоты 【double?】", + "【widthFactor】 : Коэффициент ширины 【double?】", + "【turns】 : Количество поворотов 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json new file mode 100644 index 00000000..5408f22f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "动画分率盒", + "info": "FractionallySizedBox 的动画版本,当 widthFactor 或 heightFactor 变化时, 以及 alignment 改变时,都会在指定的持续时间内自动平滑过渡到子组件的目标尺寸和位置。", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "动画过渡效果", + "desc": [ + "该案例中,点击时会修改 heightFactor、widthFactor、alignment 参数,查看动画运动效果。", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 动画变换中心 【Alignment】", + "【curve】 : 动画曲线 【Duration】", + "【heightFactor】 : 高度分率 【double?】", + "【widthFactor】 : 宽度分率 【double?】", + "【turns】 : 旋转量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart new file mode 100644 index 00000000..c870a455 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +class AnimatedFractionallySizedBoxDemo extends StatefulWidget { + const AnimatedFractionallySizedBoxDemo({super.key}); + + @override + State createState() => _AnimatedFractionallySizedBoxDemoState(); +} + +class _AnimatedFractionallySizedBoxDemoState + extends State { + bool selected = false; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 240, + child: Center( + child: GestureDetector( + onTap: () { + setState(() { + selected = !selected; + }); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildCell(), + const SizedBox(height: 4), + const Text('点击面板') + ], + ), + ), + ), + ); + } + + Widget _buildCell() { + return SizedBox( + width: 200, + height: 200, + child: ColoredBox( + color: Colors.red, + child: AnimatedFractionallySizedBox( + widthFactor: selected ? 0.25 : 0.75, + heightFactor: selected ? 0.75 : 0.25, + alignment: selected ? Alignment.topLeft : Alignment.bottomRight, + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + child: const ColoredBox( + color: Colors.blue, + child: FlutterLogo(size: 75), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json new file mode 100644 index 00000000..4b077f16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Animierte Liste", + "info": "Erweiterte Version von ListView, die Animationen für Elemente ermöglicht. Zum Beispiel Animationen beim Hinzufügen oder Entfernen von Elementen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedList", + "desc": [ + "【itemBuilder】 : Komponentenkonstruktor 【AnimatedListItemBuilder】", + "【initialItemCount】 : Anzahl der Unterkomponenten 【int】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【controller】 : Scroll-Controller 【ScrollController】", + "【reverse】 : Daten umgekehrt 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json new file mode 100644 index 00000000..ffc8e335 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Animated List", + "info": "An enhanced version of ListView, which can animate items. For example, animations for adding or deleting items.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedList", + "desc": [ + "【itemBuilder】: Component builder 【AnimatedListItemBuilder】", + "【initialItemCount】: Number of child components 【int】", + "【scrollDirection】: Scroll direction 【Axis】", + "【controller】: Scroll controller 【ScrollController】", + "【reverse】: Whether the data is reversed 【bool】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json new file mode 100644 index 00000000..e4b800f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista animada", + "info": "Versión mejorada de ListView, permite animar los ítems. Por ejemplo, animaciones al añadir o eliminar ítems.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedList", + "desc": [ + "【itemBuilder】: Constructor de componentes 【AnimatedListItemBuilder】", + "【initialItemCount】: Número de componentes hijos 【int】", + "【scrollDirection】: Dirección de desplazamiento 【Axis】", + "【controller】: Controlador de desplazamiento 【ScrollController】", + "【reverse】: Si los datos están invertidos 【bool】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json new file mode 100644 index 00000000..085b8bb7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Liste animée", + "info": "Une version améliorée de ListView, permettant d'animer les éléments. Par exemple, des animations lors de l'ajout ou de la suppression d'éléments.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedList", + "desc": [ + "【itemBuilder】 : Constructeur de composants 【AnimatedListItemBuilder】", + "【initialItemCount】 : Nombre de composants enfants 【int】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【reverse】 : Inversion des données 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json new file mode 100644 index 00000000..d31874c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista Animata", + "info": "Versione potenziata di ListView, consente di animare gli item. Ad esempio, animazioni degli item durante l'aggiunta o la rimozione.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedList", + "desc": [ + "【itemBuilder】 : Costruttore di componenti 【AnimatedListItemBuilder】", + "【initialItemCount】 : Numero di componenti figli 【int】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【controller】 : Controllore di scorrimento 【ScrollController】", + "【reverse】 : Se i dati sono invertiti 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json new file mode 100644 index 00000000..3a73e79f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "アニメーションリスト", + "info": "強化版のListViewで、アイテムにアニメーションを適用できます。例えば、追加や削除時のアイテムのアニメーションなど。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedListの基本使用", + "desc": [ + "【itemBuilder】 : コンポーネントビルダー 【AnimatedListItemBuilder】", + "【initialItemCount】 : サブコンポーネントの数 【int】", + "【scrollDirection】 : スライド方向 【Axis】", + "【controller】 : スライドコントローラー 【ScrollController】", + "【reverse】 : データが逆順かどうか 【bool】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json new file mode 100644 index 00000000..6e1f1c13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "애니메이션 리스트", + "info": "강화된 ListView, 아이템에 애니메이션을 적용할 수 있습니다. 예를 들어 추가, 삭제 시 아이템의 애니메이션.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedList 기본 사용", + "desc": [ + "【itemBuilder】 : 컴포넌트 생성기 【AnimatedListItemBuilder】", + "【initialItemCount】 : 하위 컴포넌트 수 【int】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【reverse】 : 데이터 반전 여부 【bool】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json new file mode 100644 index 00000000..5b981ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista Animada", + "info": "Versão aprimorada do ListView, que permite animar os itens. Por exemplo, animações ao adicionar ou remover itens.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedList", + "desc": [ + "【itemBuilder】: Construtor de componentes 【AnimatedListItemBuilder】", + "【initialItemCount】: Número de subcomponentes 【int】", + "【scrollDirection】: Direção de deslizamento 【Axis】", + "【controller】: Controlador de deslizamento 【ScrollController】", + "【reverse】: Se os dados estão invertidos 【bool】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json new file mode 100644 index 00000000..7aade432 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Анимированный список", + "info": "Улучшенная версия ListView, которая позволяет анимировать элементы. Например, анимация при добавлении или удалении элементов.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedList", + "desc": [ + "【itemBuilder】 : Конструктор компонента 【AnimatedListItemBuilder】", + "【initialItemCount】 : Количество дочерних компонентов 【int】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【reverse】 : Обратный порядок данных 【bool】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json new file mode 100644 index 00000000..0553e92f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "动画列表", + "info": "强化版的ListView,可以对item进行动画处理。比如在添加、删除是item的动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedList基本使用", + "desc": [ + "【itemBuilder】 : 组件构造器 【AnimatedListItemBuilder】", + "【initialItemCount】 : 子组件数量 【int】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【controller】 : 滑动控制器 【ScrollController】", + "【reverse】 : 数据是否反向 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart new file mode 100644 index 00000000..9f5ded80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedList extends StatefulWidget { + const CustomAnimatedList({super.key}); + + @override + State createState() => _CustomAnimatedListState(); +} + +class _CustomAnimatedListState extends State { + final GlobalKey _listKey = GlobalKey(); + late ListModel _list; + int? _selectedItem; + int _nextItem = 0; + + @override + void initState() { + super.initState(); + _list = ListModel( + listKey: _listKey, + initialItems: [0, 1, 2, 3], + removedItemBuilder: _buildRemovedItem, + ); + _nextItem = 4; + } + + Widget _buildItem( + BuildContext context, int index, Animation animation) { + return _CardItem( + animation: animation, + item: _list[index], + selected: _selectedItem == _list[index], + onTap: () { + setState(() { + _selectedItem = _selectedItem == _list[index] ? null : _list[index]; + }); + }, + ); + } + + Widget _buildRemovedItem( + int item, BuildContext context, Animation animation) { + return _CardItem( + animation: animation, + item: item, + selected: false, + ); + } + + void _insert() { + final int index = + _selectedItem == null ? _list.length : _list.indexOf(_selectedItem!); + _list.insert(index, _nextItem++); + } + + void _remove() { + if (_selectedItem != null) { + _list.removeAt(_list.indexOf(_selectedItem!)); + setState(() { + _selectedItem = null; + }); + } + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(33), + width: MediaQuery.of(context).size.width/2, + child: Column( + children: [ + _buildBtn(), + SizedBox( + width: MediaQuery.of(context).size.width/2, + height: 300, + child: AnimatedList( + padding: const EdgeInsets.all(10.0), + key: _listKey, + initialItemCount: _list.length, + itemBuilder: _buildItem, + ), + ) + ], + )); + } + + Widget _buildBtn() => Row( + children: [ + IconButton( + icon: const Icon( + Icons.add_circle, + color: Colors.blue, + ), + onPressed: _insert, + ), + IconButton( + icon: const Icon(Icons.remove_circle, color: Colors.blue), + onPressed: _remove, + ), + ], + ); +} + +class ListModel { + ListModel({ + required this.listKey, + required this.removedItemBuilder, + required Iterable initialItems, + }) : assert(removedItemBuilder != null), + _items = List.from(initialItems); + final GlobalKey listKey; + final dynamic removedItemBuilder; + final List _items; + + AnimatedListState? get _animatedList => listKey.currentState; + + void insert(int index, E item) { + _items.insert(index, item); + _animatedList?.insertItem(index); + } + + E removeAt(int index) { + final E removedItem = _items.removeAt(index); + if (removedItem != null) { + _animatedList?.removeItem( + index, + (BuildContext context, Animation animation) => + removedItemBuilder(removedItem, context, animation), + ); + } + return removedItem; + } + + int get length => _items.length; + + E operator [](int index) => _items[index]; + + int indexOf(E item) => _items.indexOf(item); +} + +class _CardItem extends StatelessWidget { + const _CardItem( + {super.key, + required this.animation, + this.onTap, + required this.item, + this.selected = false}) + : assert(item >= 0); + final Animation animation; + final VoidCallback? onTap; + final int item; + final bool selected; + + @override + Widget build(BuildContext context) { + return SizeTransition( + axis: Axis.vertical, + sizeFactor: animation, + child: Card( + child: Container( + color: Colors.primaries[item % Colors.primaries.length], + child: CheckboxListTile( + dense: true, + title: Text( + 'Item $item', + style: const TextStyle(color: Colors.white, fontSize: 18), + ), + value: selected, + onChanged: (v) { + onTap?.call(); + }), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json new file mode 100644 index 00000000..1b4de573 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Animierte Modalschranke", + "info": "Intern basiert es auf ModalBarrier und bietet die gleiche Funktionalität, jedoch kann dieser Komponente eine Farbanimation übergeben werden, um einen Übergangseffekt zu erzielen.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Gibt an, ob ein Klick zurückkehrt 【bool】", + "【color】 : Farbe 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json new file mode 100644 index 00000000..e412ca89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Animated Barrier Module", + "info": "Internally relies on ModalBarrier for implementation, with the same functionality, except that this component can accept a color animation for transition display.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to AnimatedModalBarrier", + "desc": [ + "【dismissible】: Whether to return on click 【bool】", + "【color】: Color 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json new file mode 100644 index 00000000..18c13fdb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barrera Modal Animada", + "info": "Implementado internamente con ModalBarrier, con la misma funcionalidad, pero este componente puede recibir una animación de color para una transición suave.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a AnimatedModalBarrier", + "desc": [ + "【dismissible】: Si se puede volver al hacer clic 【bool】", + "【color】: Color 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json new file mode 100644 index 00000000..e9ed5dea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barrière Modale Animée", + "info": "Implémenté en interne avec ModalBarrier, fonctionne de la même manière, mais ce composant peut recevoir une animation de couleur pour une transition visuelle.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Retour au clic 【bool】", + "【color】 : Couleur 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json new file mode 100644 index 00000000..c127583c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barriera Modale Animata", + "info": "Implementato internamente con ModalBarrier, le funzionalità sono le stesse, ma questo componente può ricevere un'animazione di colore per una transizione graduale.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Se cliccato, ritorna 【bool】", + "【color】 : Colore 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json new file mode 100644 index 00000000..8bf23aef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "アニメーションバリアモジュール", + "info": "内部的にModalBarrierに依存して実装されており、機能は同じですが、このコンポーネントにはカラーアニメーションを渡して、トランジションを表示することができます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 紹介", + "desc": [ + "【dismissible】 : クリックで戻るかどうか 【bool】", + "【color】 : 色 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json new file mode 100644 index 00000000..041ab445 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "애니메이션 배리어 모드", + "info": "내부적으로 ModalBarrier를 기반으로 구현되었으며, 기능은 동일합니다. 다만 이 컴포넌트는 색상 애니메이션을 전달하여 전환 효과를 나타낼 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 소개", + "desc": [ + "【dismissible】 : 클릭 시 반환 여부 【bool】", + "【color】 : 색상 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json new file mode 100644 index 00000000..8614f706 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barreira Modal Animada", + "info": "Implementado internamente com ModalBarrier, com funcionalidades idênticas, exceto que este componente pode receber uma animação de cor para transição.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao AnimatedModalBarrier", + "desc": [ + "【dismissible】: Clicar para retornar 【bool】", + "【color】: Cor 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json new file mode 100644 index 00000000..a4d6fdce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Анимированный барьер", + "info": "Внутренняя реализация зависит от ModalBarrier, функциональность идентична, за исключением того, что этот компонент может принимать анимацию цвета для плавного отображения.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Возврат при клике 【bool】", + "【color】 : Цвет 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json new file mode 100644 index 00000000..7697738b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "动画屏障模", + "info": "内部依赖 ModalBarrier 实现,功能一致,只不过该组件可以传入一个颜色动画,进行过渡展现。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 介绍", + "desc": [ + "【dismissible】 : 点击是否返回 【bool】", + "【color】 : 颜色 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart new file mode 100644 index 00000000..a01d1d7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class AnimatedModalBarrierDemo extends StatefulWidget { + const AnimatedModalBarrierDemo({Key? key}) : super(key: key); + + @override + _AnimatedModalBarrierDemoState createState() => + _AnimatedModalBarrierDemoState(); +} + +class _AnimatedModalBarrierDemoState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _color; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + )..forward(); + _color = ColorTween( + begin: Colors.blue, + end: Colors.purple, + ).animate(_controller); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 100, + child: Stack(alignment: Alignment.center, children: [ + AnimatedModalBarrier( + dismissible: true, + color: _color, + ), + const Text( + '点击背景返回', + style: TextStyle(color: Colors.white), + ) + ]), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json new file mode 100644 index 00000000..37fe54b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Transparenz-Animation", + "info": "Ermöglicht die Animation der Opazität (Transparenz) von Kindkomponenten, ermöglicht die Angabe von Dauer und Kurve und verfügt über ein Ereignis zum Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedOpacity", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【opacity】 : Transparenz 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json new file mode 100644 index 00000000..bbfbc733 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Opacity Animation", + "info": "Allows child components to perform opacity animations, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedOpacity", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【opacity】: Opacity 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json new file mode 100644 index 00000000..3b874d14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animación de Opacidad", + "info": "Permite animar la opacidad de los componentes hijos, se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedOpacity", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【opacity】 : Opacidad 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json new file mode 100644 index 00000000..2217fa08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animation de transparence", + "info": "Permet à un composant enfant de réaliser une animation d'opacité, avec une durée et une courbe spécifiables, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedOpacity", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Callback de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【opacity】 : Opacité 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json new file mode 100644 index 00000000..f2ad7713 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animazione di opacità", + "info": "Consente ai componenti figli di eseguire un'animazione di Opacity (opacità), può specificare la durata e la curva, e ha un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedOpacity", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【opacity】 : Opacità 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json new file mode 100644 index 00000000..b36dddf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "透明度アニメーション", + "info": "子コンポーネントにOpacity(透明度)アニメーションを適用でき、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacityの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【opacity】 : 透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json new file mode 100644 index 00000000..7305222c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "투명도 애니메이션", + "info": "자식 위젯에 Opacity(투명도) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacity 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【opacity】 : 투명도 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json new file mode 100644 index 00000000..0c8f1602 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animação de Opacidade", + "info": "Permite que os componentes filhos realizem animações de Opacidade, podendo especificar a duração e a curva, com eventos de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedOpacity", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【opacity】 : Opacidade 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json new file mode 100644 index 00000000..1320b3bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Анимация прозрачности", + "info": "Позволяет дочерним компонентам выполнять анимацию Opacity (прозрачности), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedOpacity", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【opacity】 : Прозрачность 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json new file mode 100644 index 00000000..4939396b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "透明动画", + "info": "能让子组件进行Opacity(透明度)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacity基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【opacity】 : 透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart new file mode 100644 index 00000000..8bc2cba6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedOpacity extends StatefulWidget { + const CustomAnimatedOpacity({Key? key}) : super(key: key); + + @override + _CustomAnimatedOpacityState createState() => _CustomAnimatedOpacityState(); +} + +class _CustomAnimatedOpacityState extends State { + double _opacity = 1.0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Switch( + value: _opacity == 0, + onChanged: (v) { + setState(() { + _opacity = v ? 0 : 1.0; + }); + }), + Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + child: AnimatedOpacity( + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + opacity: _opacity, + onEnd: () => print('End'), + child: const Icon(Icons.android, color: Colors.green, size: 60), + ), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json new file mode 100644 index 00000000..b87470c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animierter Abstand", + "info": "Ermöglicht Padding (Innenabstand) Animationen für Kind-Komponenten, kann Dauer und Kurve angeben, hat ein Ereignis für das Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPadding", + "desc": [ + "【child】 : Kind-Komponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json new file mode 100644 index 00000000..ab9b53fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Padding Animation", + "info": "Allows child components to perform padding animation, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPadding", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json new file mode 100644 index 00000000..1b6f6113 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animación de margen", + "info": "Permite que los componentes hijos realicen una animación de Padding (margen interior), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPadding", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【padding】 : Margen interior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json new file mode 100644 index 00000000..f0cd004b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animation de marge", + "info": "Permet à un composant enfant d'animer le Padding (marge intérieure), avec la possibilité de spécifier la durée et la courbe, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPadding", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json new file mode 100644 index 00000000..ec6ac5f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animazione del margine", + "info": "Consente ai componenti figli di eseguire animazioni di Padding (margine interno), con la possibilità di specificare durata e curva, e con un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPadding", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json new file mode 100644 index 00000000..31976442 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "パディングアニメーション", + "info": "子コンポーネントにPadding(パディング)アニメーションを行わせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPaddingの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【padding】 : パディング 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json new file mode 100644 index 00000000..6d5c3d4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "패딩 애니메이션", + "info": "자식 위젯에 패딩(내부 여백) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPadding 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json new file mode 100644 index 00000000..bf6ac0b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animação de Margem", + "info": "Permite que os componentes filhos realizem animações de Padding (margem interna), pode especificar a duração e a curva, e tem um evento de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPadding", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json new file mode 100644 index 00000000..7b2c17d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Анимация отступов", + "info": "Позволяет дочерним компонентам анимировать отступы (Padding), можно указать длительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPadding", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json new file mode 100644 index 00000000..0b7eafc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "边距动画", + "info": "能让子组件进行Padding(内边距)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPadding基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart new file mode 100644 index 00000000..000ae15e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedPadding extends StatefulWidget { + const CustomAnimatedPadding({Key? key}) : super(key: key); + + @override + _CustomAnimatedPaddingState createState() => _CustomAnimatedPaddingState(); +} + +class _CustomAnimatedPaddingState extends State { + final EdgeInsets startPadding = const EdgeInsets.all(10); + final EdgeInsets endPadding = const EdgeInsets.all(30); + + late EdgeInsets _padding; + + @override + void initState() { + _padding = startPadding; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Switch( + value: _padding == endPadding, + onChanged: (v) { + setState(() { + _padding = v ? endPadding : startPadding; + }); + }), + Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 100, + child: AnimatedPadding( + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + padding: _padding, + onEnd: () => print('End'), + child: Container( + alignment: Alignment.center, + color: Colors.blue, + child: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.white), + ), + ), + ), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json new file mode 100644 index 00000000..12cbe318 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animiertes Physikalisches Modell", + "info": "Eine PhysicalModel-Komponente mit Animationseffekten bei Änderungen der relevanten Eigenschaften, im Wesentlichen eine Kombination aus PhysicalModel und Animation. Es können Eigenschaften wie Schatten, Schattentiefe, abgerundete Ecken, Animationsdauer, Endrückruf usw. angegeben werden.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPhysicalModel", + "desc": [ + "【color】 : Hintergrundfarbe 【Color】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf nach Abschluss der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【shape】 : Form 【BoxShape】", + "【elevation】 : Schattentiefe 【double】", + "【borderRadius】 : Abgerundete Ecken 【BorderRadius】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json new file mode 100644 index 00000000..70d62f75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animated Physical Model", + "info": "A PhysicalModel component with animation effects when related properties change, essentially a combination of PhysicalModel and animation. Properties such as shadow, elevation, borderRadius, animation duration, and end callback can be specified.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPhysicalModel", + "desc": [ + "【color】: Background color 【Color】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【shape】: Shape 【BoxShape】", + "【elevation】: Elevation 【double】", + "【borderRadius】: Border radius 【BorderRadius】", + "【shadowColor】: Shadow color 【Color】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json new file mode 100644 index 00000000..d7df7f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modelo Físico Animado", + "info": "Un componente PhysicalModel con efectos de animación cuando cambian las propiedades relacionadas, esencialmente es una combinación de PhysicalModel y animación. Se pueden especificar propiedades como sombra, profundidad de sombra, esquinas redondeadas, duración de la animación, devolución de llamada al finalizar, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPhysicalModel", + "desc": [ + "【color】 : Color de fondo 【Color】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profundidad de sombra 【double】", + "【borderRadius】 : Esquinas redondeadas 【BorderRadius】", + "【shadowColor】 : Color de la sombra 【Color】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json new file mode 100644 index 00000000..53c14c05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animation de module physique", + "info": "Un composant PhysicalModel avec des effets d'animation lorsque les propriétés associées changent, essentiellement une combinaison de PhysicalModel et d'animation. Vous pouvez spécifier des propriétés telles que l'ombre, la profondeur de l'ombre, le rayon de bordure, la durée de l'animation, le rappel de fin, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPhysicalModel", + "desc": [ + "【color】 : Couleur de fond 【Color】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【shape】 : Forme 【BoxShape】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【borderRadius】 : Rayon de bordure 【BorderRadius】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json new file mode 100644 index 00000000..8ffe12ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modello Fisico Animato", + "info": "Componente PhysicalModel con effetti di animazione quando cambiano le proprietà relative, essenzialmente una combinazione di PhysicalModel e animazione. È possibile specificare proprietà come ombre, profondità dell'ombra, angoli arrotondati, durata dell'animazione, callback di fine, ecc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPhysicalModel", + "desc": [ + "【color】 : Colore di sfondo 【Color】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profondità dell'ombra 【double】", + "【borderRadius】 : Angoli arrotondati 【BorderRadius】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json new file mode 100644 index 00000000..ef133412 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "物理モジュールアニメーション", + "info": "関連する属性が変化する際にアニメーション効果を持つPhysicalModelコンポーネントで、本質的にはPhysicalModelとアニメーションの組み合わせです。影、影の深さ、角の丸み、アニメーションの長さ、終了コールバックなどの属性を指定できます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModelの基本使用", + "desc": [ + "【color】 : 背景色 【Color】", + "【duration】 : アニメーションの長さ 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーションカーブ 【Duration】", + "【shape】 : 形状 【BoxShape】", + "【elevation】 : 影の深さ 【double】", + "【borderRadius】 : 角の丸み 【BorderRadius】", + "【shadowColor】 : 影の色 【Color】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json new file mode 100644 index 00000000..a5814d3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "물리 모듈 애니메이션", + "info": "관련 속성이 변경될 때 애니메이션 효과가 있는 PhysicalModel 컴포넌트로, 본질적으로 PhysicalModel과 애니메이션의 결합체입니다. 그림자, 그림자 깊이, 둥근 모서리, 애니메이션 지속 시간, 종료 콜백 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModel 기본 사용", + "desc": [ + "【color】 : 배경색 【Color】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【shape】 : 모양 【BoxShape】", + "【elevation】 : 그림자 깊이 【double】", + "【borderRadius】 : 둥근 모서리 【BorderRadius】", + "【shadowColor】 : 그림자 색상 【Color】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json new file mode 100644 index 00000000..1157fca6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modelo Físico Animado", + "info": "Componente PhysicalModel com efeitos de animação quando as propriedades relacionadas mudam, essencialmente uma combinação de PhysicalModel e animação. Pode especificar propriedades como sombra, profundidade de sombra, cantos arredondados, duração da animação, callback de término, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPhysicalModel", + "desc": [ + "【color】 : Cor de fundo 【Color】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profundidade de sombra 【double】", + "【borderRadius】 : Cantos arredondados 【BorderRadius】", + "【shadowColor】 : Cor da sombra 【Color】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json new file mode 100644 index 00000000..4f04e95f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Анимация физического модуля", + "info": "Компонент PhysicalModel с анимацией при изменении связанных свойств, по сути, представляет собой комбинацию PhysicalModel и анимации. Можно указать такие свойства, как тень, глубина тени, скругление углов, длительность анимации, обратный вызов по завершении и другие.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPhysicalModel", + "desc": [ + "【color】 : Цвет фона 【Color】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【shape】 : Форма 【BoxShape】", + "【elevation】 : Глубина тени 【double】", + "【borderRadius】 : Скругление углов 【BorderRadius】", + "【shadowColor】 : Цвет тени 【Color】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json new file mode 100644 index 00000000..12cf3594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "物理模块动画", + "info": "相关属性变化时具有动画效果的PhysicalModel组件,本质是PhysicalModel和动画结合的产物。可指定阴影、影深、圆角、动画时长、结束回调等属性。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModel基本使用", + "desc": [ + "【color】 : 背景色 【Color】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【shape】 : 形状 【BoxShape】", + "【elevation】 : 影深 【double】", + "【borderRadius】 : 圆角 【BorderRadius】", + "【shadowColor】 : 阴影色 【Color】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart new file mode 100644 index 00000000..c96a4f6e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class AnimatedPhysicalModelDemo extends StatefulWidget { + const AnimatedPhysicalModelDemo({Key? key}) : super(key: key); + + @override + _AnimatedPhysicalModelDemoState createState() => + _AnimatedPhysicalModelDemoState(); +} + +class _AnimatedPhysicalModelDemoState extends State { + bool flag = false; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + SizedBox( + width: 150, + height: 150, + child: AnimatedPhysicalModel( + duration: const Duration(seconds: 2), + curve: Curves.fastOutSlowIn, + shadowColor: flag?Colors.orange:Colors.purple, + elevation: flag?10:5, + child: Image.asset( + 'assets/images/caver.webp', + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.all(Radius.circular(flag? 10:75)), + clipBehavior: Clip.hardEdge, + shape: BoxShape.rectangle, + color: Colors.deepPurpleAccent, + onEnd: () => print('----onEnd---'), + ), + ), + ], + ); + } + + Widget _buildSwitch() => Switch( + value: flag, + onChanged: (v) { + setState(() { + flag = v; + }); + }); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json new file mode 100644 index 00000000..c1da6abe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Positionierte Animation", + "info": "Ermöglicht die Positionierungsanimation von Unterkomponenten, kann Dauer und Kurve angeben und hat ein Ereignis zum Ende der Animation. Kann nur in einem Stack verwendet werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPositioned", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【top】 : Abstand zum oberen Rand des Elternteils 【double】", + "【right】 : Abstand zum rechten Rand des Elternteils 【double】", + "【left】 : Abstand zum linken Rand des Elternteils 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternteils 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json new file mode 100644 index 00000000..a27ec880 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Positioning Animation", + "info": "Allows child components to perform Positioned (positioning) animations, with specified duration and curves, and has an animation end event. Can only be used within a Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPositioned", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【top】: Distance to parent top 【double】", + "【right】: Distance to parent right 【double】", + "【left】: Distance to parent left 【double】", + "【bottom】: Distance to parent bottom 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json new file mode 100644 index 00000000..5128fa97 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animación de Posicionamiento", + "info": "Permite que los componentes hijos realicen animaciones de Positioned (posicionamiento), se pueden especificar la duración y la curva, y hay un evento de finalización de la animación. Solo se puede usar dentro de Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPositioned", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【top】 : Distancia a la parte superior del padre 【double】", + "【right】 : Distancia a la derecha del padre 【double】", + "【left】 : Distancia a la izquierda del padre 【double】", + "【bottom】 : Distancia a la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json new file mode 100644 index 00000000..fb134380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animation de positionnement", + "info": "Permet à un composant enfant d'effectuer une animation Positioned (positionnement), avec une durée et une courbe spécifiables, et un événement de fin d'animation. Ne peut être utilisé que dans un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPositioned", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【right】 : Distance par rapport à la droite du parent 【double】", + "【left】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json new file mode 100644 index 00000000..2e5cb4dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animazione di Posizionamento", + "info": "Consente ai componenti figli di eseguire animazioni di posizionamento (Positioned), con durata e curva specificabili, e un evento di fine animazione. Può essere utilizzato solo all'interno di uno Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPositioned", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【right】 : Distanza dal bordo destro del genitore 【double】", + "【left】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json new file mode 100644 index 00000000..2ed82519 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "位置アニメーション", + "info": "子コンポーネントをPositioned(位置)アニメーションさせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。Stack内でのみ使用できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【top】 : 親の上端までの距離 【double】", + "【right】 : 親の右端までの距離 【double】", + "【left】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json new file mode 100644 index 00000000..0bbbb46b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "위치 애니메이션", + "info": "자식 컴포넌트를 Positioned(위치) 애니메이션으로 이동시킬 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다. Stack 내에서만 사용할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositioned 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【top】 : 부모 상단까지의 거리 【double】", + "【right】 : 부모 오른쪽까지의 거리 【double】", + "【left】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json new file mode 100644 index 00000000..117e6a50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animação de Posicionamento", + "info": "Permite que os componentes filhos realizem animações de Positioned (posicionamento), podendo especificar a duração e a curva, com evento de término da animação. Só pode ser usado dentro de uma Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPositioned", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【top】 : Distância até o topo do pai 【double】", + "【right】 : Distância até a direita do pai 【double】", + "【left】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json new file mode 100644 index 00000000..577fb636 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Анимация позиционирования", + "info": "Позволяет дочерним компонентам выполнять анимацию Positioned (позиционирования), можно указать продолжительность и кривую, есть событие завершения анимации. Может использоваться только в Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPositioned", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【top】 : Расстояние до верхнего края родителя 【double】", + "【right】 : Расстояние до правого края родителя 【double】", + "【left】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до нижнего края родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json new file mode 100644 index 00000000..4fe0c26f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "定位动画", + "info": "能让子组件进行Positioned(定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositioned基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【top】 : 到父顶距离 【double】", + "【right】 : 到父右距离 【double】", + "【left】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart new file mode 100644 index 00000000..65885b9e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedPositioned extends StatefulWidget { + const CustomAnimatedPositioned({Key? key}) : super(key: key); + + @override + _CustomAnimatedPositionedState createState() => + _CustomAnimatedPositionedState(); +} + +class _CustomAnimatedPositionedState extends State { + final double startTop = 0.0; + final double endTop = 30.0; + + double _top = 0.0; + + @override + void initState() { + _top = startTop; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + color: Colors.grey.withAlpha(33), + width: 200, + height: 100, + child: Stack( + children: _buildChildren(), + ), + ), + ], + ); + } + + List _buildChildren() => [ + AnimatedPositioned( + duration: const Duration(seconds: 1), + top: _top, + left: _top * 4, + child: const Icon( + Icons.android, + color: Colors.green, + size: 50, + ), + ), + AnimatedPositioned( + duration: const Duration(seconds: 1), + top: 50 - _top, + left: 150 - _top * 4, + child: const Icon( + Icons.android, + color: Colors.red, + size: 50, + ), + ) + ]; + + Widget _buildSwitch() => Switch( + value: _top == endTop, + onChanged: (v) { + setState(() { + _top = v ? endTop : startTop; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json new file mode 100644 index 00000000..2ef2b715 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Richtungsbasierte Positionierungsanimation", + "info": "Ermöglicht es Kindkomponenten, eine PositionedDirectional (richtungsbasierte Positionierung) Animation durchzuführen, wobei Dauer und Kurve angegeben werden können und ein Ereignis am Ende der Animation vorhanden ist. Kann nur innerhalb eines Stacks verwendet werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPositionedDirectional", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【top】 : Abstand zum oberen Rand des Elternteils 【double】", + "【end】 : Abstand zum rechten Rand des Elternteils 【double】", + "【start】 : Abstand zum linken Rand des Elternteils 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternteils 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json new file mode 100644 index 00000000..b4f69a91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Directional Positioning Animation", + "info": "Allows child components to perform PositionedDirectional (directional positioning) animations, with specified duration and curve, and has an animation end event. Can only be used within Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPositionedDirectional", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【top】: Distance to parent top 【double】", + "【end】: Distance to parent right 【double】", + "【start】: Distance to parent left 【double】", + "【bottom】: Distance to parent bottom 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json new file mode 100644 index 00000000..dfd55b24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animación de Posicionamiento Direccional", + "info": "Permite que los componentes hijos realicen animaciones de PositionedDirectional (posicionamiento direccional), se pueden especificar la duración y la curva, y tiene un evento de finalización de la animación. Solo se puede usar dentro de un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【top】 : Distancia desde la parte superior del padre 【double】", + "【end】 : Distancia desde la derecha del padre 【double】", + "【start】 : Distancia desde la izquierda del padre 【double】", + "【bottom】 : Distancia desde la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json new file mode 100644 index 00000000..0bab7f7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animation de positionnement directionnel", + "info": "Permet à un composant enfant d'effectuer une animation de PositionedDirectional (positionnement directionnel), avec une durée et une courbe spécifiables, et un événement de fin d'animation. Ne peut être utilisé que dans un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPositionedDirectional", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【top】 : Distance du haut du parent 【double】", + "【end】 : Distance de la droite du parent 【double】", + "【start】 : Distance de la gauche du parent 【double】", + "【bottom】 : Distance du bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json new file mode 100644 index 00000000..c435d24c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animazione di posizionamento direzionale", + "info": "Consente ai componenti figli di eseguire un'animazione PositionedDirectional (posizionamento direzionale), con durata e curva specificabili, e un evento di fine animazione. Può essere utilizzato solo all'interno di uno Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【end】 : Distanza dal bordo destro del genitore 【double】", + "【start】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json new file mode 100644 index 00000000..f4ccfa9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "方向定位アニメーション", + "info": "子コンポーネントをPositionedDirectional(方向定位)アニメーションさせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。Stack内でのみ使用できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【top】 : 親の上端までの距離 【double】", + "【end】 : 親の右端までの距離 【double】", + "【start】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json new file mode 100644 index 00000000..7fb29376 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "방향 위치 애니메이션", + "info": "자식 구성 요소를 PositionedDirectional(방향 위치) 애니메이션으로 만들 수 있으며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다. Stack 내에서만 사용할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional 기본 사용", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【top】 : 부모 상단까지의 거리 【double】", + "【end】 : 부모 오른쪽까지의 거리 【double】", + "【start】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json new file mode 100644 index 00000000..2bc583d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animação de Posicionamento Direcional", + "info": "Permite que os componentes filhos realizem animações de PositionedDirectional (Posicionamento Direcional), podendo especificar a duração e a curva, com eventos de término da animação. Só pode ser usado dentro de uma Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【top】 : Distância até o topo do pai 【double】", + "【end】 : Distância até a direita do pai 【double】", + "【start】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json new file mode 100644 index 00000000..e68ad622 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Анимация направленного позиционирования", + "info": "Позволяет дочерним компонентам выполнять анимацию PositionedDirectional (направленное позиционирование), можно указать продолжительность и кривую, есть событие окончания анимации. Может использоваться только внутри Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPositionedDirectional", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов окончания анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【top】 : Расстояние до верха родителя 【double】", + "【end】 : Расстояние до правой стороны родителя 【double】", + "【start】 : Расстояние до левой стороны родителя 【double】", + "【bottom】 : Расстояние до низа родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json new file mode 100644 index 00000000..585f8084 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "方向定位动画", + "info": "能让子组件进行PositionedDirectional(方向定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【top】 : 到父顶距离 【double】", + "【end】 : 到父右距离 【double】", + "【start】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart new file mode 100644 index 00000000..558c62ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedPositionedDirectional extends StatefulWidget { + const CustomAnimatedPositionedDirectional({Key? key}) : super(key: key); + + @override + _CustomAnimatedPositionedDirectionalState createState() => + _CustomAnimatedPositionedDirectionalState(); +} + +class _CustomAnimatedPositionedDirectionalState + extends State { + final double startTop = 0.0; + final double endTop = 30.0; + + double _top = 0.0; + + @override + void initState() { + _top = startTop; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + Container( + color: Colors.grey.withAlpha(33), + width: 200, + height: 100, + child: Stack( + children: _buildChildren(), + ), + ), + ], + ); + } + + List _buildChildren() => [ + AnimatedPositionedDirectional( + duration: const Duration(seconds: 1), + top: _top, + start: _top * 4, + child: const Icon( + Icons.android, + color: Colors.green, + size: 50, + ), + ), + AnimatedPositionedDirectional( + duration: const Duration(seconds: 1), + top: 50 - _top, + start: 150 - _top * 4, + child: const Icon( + Icons.android, + color: Colors.red, + size: 50, + ), + ) + ]; + + Widget _buildSwitch() => Switch( + value: _top == endTop, + onChanged: (v) { + setState(() { + _top = v ? endTop : startTop; + }); + }); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json new file mode 100644 index 00000000..31511c6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Rotationsanimation", + "info": "Wenn sich die gegebene Rotationsmenge ändert, kann die Unterkomponente automatisch den relativen Rotationswert anpassen, und es gibt eine animierte Änderung zwischen den vorherigen und nachfolgenden Werten.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Rotationsanimationseffekt", + "desc": [ + "In diesem Beispiel wird der Parameter turns durch Ziehen angepasst, um den animierten Bewegungseffekt zu sehen. Der Rotationswinkel beträgt: turns*2*pi", + "【child】 : Kinderkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Animationsende 【Function()】", + "【alignment】 : Zentrum der Animationstransformation 【Alignment】", + "【curve】 : Animationskurve 【Duration】", + "【filterQuality】 : Filterqualität 【FilterQuality】", + "【turns】 : Rotationsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json new file mode 100644 index 00000000..f11797f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Rotation Animation", + "info": "When the given rotation amount changes, the child component can automatically adjust relative to the rotation value, and there is an animated transition between the previous and new values.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Rotation Animation Effect", + "desc": [ + "In this case, drag to adjust the turns parameter to see the animation effect. The rotation angle is: turns*2*pi", + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【alignment】: Animation transformation center 【Alignment】", + "【curve】: Animation curve 【Duration】", + "【filterQuality】: Filter quality 【FilterQuality】", + "【turns】: Rotation amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json new file mode 100644 index 00000000..15e01c40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animación de rotación", + "info": "Cuando cambia la cantidad de rotación dada, el componente hijo puede ajustarse automáticamente en relación con el valor de rotación, y hay un cambio animado entre los valores anteriores y posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de rotación", + "desc": [ + "En este caso, arrastra para ajustar el parámetro turns y observa el efecto de movimiento de la animación. El ángulo de rotación es: turns*2*pi", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【curve】 : Curva de la animación 【Duration】", + "【filterQuality】 : Calidad del filtro 【FilterQuality】", + "【turns】 : Cantidad de rotación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json new file mode 100644 index 00000000..970fae79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animation de rotation", + "info": "Lorsque la quantité de rotation donnée change, le composant enfant peut s'ajuster automatiquement par rapport à la valeur de rotation, avec une animation entre les valeurs précédentes et suivantes.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de rotation", + "desc": [ + "Dans cet exemple, faites glisser pour ajuster le paramètre turns et observez l'effet de l'animation. L'angle de rotation est : turns*2*pi", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel à la fin de l'animation 【Function()】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【curve】 : Courbe de l'animation 【Duration】", + "【filterQuality】 : Qualité du filtre 【FilterQuality】", + "【turns】 : Quantité de rotation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json new file mode 100644 index 00000000..5fdc7385 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animazione di rotazione", + "info": "Quando la quantità di rotazione specificata cambia, il componente figlio può regolarsi automaticamente rispetto al valore di rotazione, con un'animazione che mostra la transizione tra i valori precedenti e successivi.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di animazione di rotazione", + "desc": [ + "In questo esempio, trascina per regolare il parametro turns e osserva l'effetto dell'animazione. L'angolo di rotazione è: turns*2*pi", + "【child】 : componente figlio 【Widget】", + "【duration】 : durata dell'animazione 【Duration】", + "【onEnd】 : callback alla fine dell'animazione 【Function()】", + "【alignment】 : centro di trasformazione dell'animazione 【Alignment】", + "【curve】 : curva dell'animazione 【Duration】", + "【filterQuality】 : qualità del filtro 【FilterQuality】", + "【turns】 : quantità di rotazione 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json new file mode 100644 index 00000000..1e813b8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "回転アニメーション", + "info": "指定された回転量が変化した場合、子コンポーネントは回転値に応じて自動的に調整され、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "回転アニメーション効果", + "desc": [ + "このケースでは、turns パラメータをドラッグして調整し、アニメーションの動きを確認します。回転角度は: turns*2*pi", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【alignment】 : アニメーションの変換中心 【Alignment】", + "【curve】 : アニメーション曲線 【Duration】", + "【filterQuality】 : フィルター品質 【FilterQuality】", + "【turns】 : 回転量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json new file mode 100644 index 00000000..4f3ac69c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "회전 애니메이션", + "info": "주어진 회전량이 변경될 때, 자식 구성 요소가 회전 값에 따라 자동으로 조정되며, 이전 값과 이후 값 사이에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "회전 애니메이션 효과", + "desc": [ + "이 예제에서는 turns 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인합니다. 회전 각도는: turns*2*pi", + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【filterQuality】 : 필터 품질 【FilterQuality】", + "【turns】 : 회전량 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json new file mode 100644 index 00000000..10bc8835 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animação de Rotação", + "info": "Quando a quantidade de rotação dada muda, o componente filho pode ajustar automaticamente o valor relativo à rotação, e há uma animação entre os valores anteriores e posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Rotação", + "desc": [ + "Neste exemplo, arraste para ajustar o parâmetro turns e observe o efeito da animação. O ângulo de rotação é: turns*2*pi", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【curve】 : Curva da animação 【Duration】", + "【filterQuality】 : Qualidade do filtro 【FilterQuality】", + "【turns】 : Quantidade de rotação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json new file mode 100644 index 00000000..78487046 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Анимация вращения", + "info": "Когда заданное количество вращения изменяется, дочерний компонент может автоматически настраиваться относительно значения вращения, и есть анимационные изменения между предыдущим и текущим значениями.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации вращения", + "desc": [ + "В этом примере, перетащите для регулировки параметра turns, чтобы увидеть эффект анимации. Угол вращения: turns*2*pi", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【alignment】 : Центр преобразования анимации 【Alignment】", + "【curve】 : Кривая анимации 【Duration】", + "【filterQuality】 : Качество фильтра 【FilterQuality】", + "【turns】 : Количество вращения 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json new file mode 100644 index 00000000..b36954d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "旋转动画", + "info": "给定的旋转量发生变化时,子组件可以自动调整相对于旋转值,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "旋转动画效果", + "desc": [ + "该案例中,拖拽调节 turns 参数,查看动画运动效果。旋转角度为: turns*2*pi", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 动画变换中心 【Alignment】", + "【curve】 : 动画曲线 【Duration】", + "【filterQuality】 : 滤镜质量 【FilterQuality】", + "【turns】 : 旋转量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart new file mode 100644 index 00000000..beff715f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart @@ -0,0 +1,76 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class AnimatedRotationDemo extends StatefulWidget { + const AnimatedRotationDemo({super.key}); + + @override + State createState() => _AnimatedRotationDemoState(); +} + +class _AnimatedRotationDemoState extends State { + double _turns = 0; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + child: SizedBox( + height: 200, + child: Center( + child: AnimatedRotation( + turns: _turns, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container( + color: Colors.red, + height: 40, + width: 40, + ), + ), + ), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('scale:${_turns.toStringAsFixed(2)}', + style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: 0, + max: 1, + value: _turns, + onChanged: (double value) { + setState(() { + _turns = value; + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json new file mode 100644 index 00000000..1d2dc66d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Skalierungsanimation", + "info": "Wenn sich die gegebene Skalierung ändert, kann die Unterkomponente automatisch relativ zum Skalierungswert angepasst werden, und die vorherigen und nachfolgenden Werte haben eine animierte Änderung.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Skalierungsanimationseffekt", + "desc": [ + "In diesem Beispiel ziehen Sie den scale-Parameter, um den Animationsbewegungseffekt zu sehen.", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf beim Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【alignment】 : Animationszentrum 【Alignment】", + "【filterQuality】 : Filterqualität 【FilterQuality】", + "【scale】 : Skalierungsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json new file mode 100644 index 00000000..7bacac75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Scaling Animation", + "info": "When the given scaling amount changes, the child component can automatically adjust relative to the scaling value, and there is an animation change between the previous and next values.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Scaling Animation Effect", + "desc": [ + "In this case, drag to adjust the scale parameter to view the animation effect.", + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【alignment】: Animation transformation center 【Alignment】", + "【filterQuality】: Filter quality 【FilterQuality】", + "【scale】: Scaling amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json new file mode 100644 index 00000000..ccab272e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animación de escala", + "info": "Cuando cambia la cantidad de escala dada, el componente hijo puede ajustarse automáticamente en relación con el valor de escala, y hay una animación entre los valores anteriores y posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de escala", + "desc": [ + "En este caso, arrastre para ajustar el parámetro scale y observe el efecto de movimiento de la animación.", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【filterQuality】 : Calidad del filtro 【FilterQuality】", + "【scale】 : Cantidad de escala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json new file mode 100644 index 00000000..f5116c21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animation de mise à l'échelle", + "info": "Lorsque la quantité de mise à l'échelle donnée change, le composant enfant peut s'ajuster automatiquement par rapport à la valeur de mise à l'échelle, et les valeurs avant et après ont une animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de mise à l'échelle", + "desc": [ + "Dans ce cas, faites glisser pour ajuster le paramètre scale et observez l'effet de l'animation.", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【filterQuality】 : Qualité du filtre 【FilterQuality】", + "【scale】 : Quantité de mise à l'échelle 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json new file mode 100644 index 00000000..43bd1950 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animazione di Scala", + "info": "Quando la quantità di scala data cambia, il componente figlio può regolarsi automaticamente rispetto al valore di scala, con un'animazione tra i valori precedenti e successivi.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di Animazione di Scala", + "desc": [ + "In questo caso, trascina per regolare il parametro scale e osserva l'effetto di movimento dell'animazione.", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback alla fine dell'animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【alignment】 : Centro di trasformazione dell'animazione 【Alignment】", + "【filterQuality】 : Qualità del filtro 【FilterQuality】", + "【scale】 : Quantità di scala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json new file mode 100644 index 00000000..99a8ee38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "スケーリングアニメーション", + "info": "指定されたスケーリング量が変化すると、子コンポーネントは自動的にスケーリング値に応じて調整され、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "スケーリングアニメーション効果", + "desc": [ + "このケースでは、scaleパラメータをドラッグして調整し、アニメーションの動き効果を確認します。", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの持続時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【alignment】 : アニメーションの変形中心 【Alignment】", + "【filterQuality】 : フィルター品質 【FilterQuality】", + "【scale】 : スケーリング量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json new file mode 100644 index 00000000..c18e6510 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "스케일 애니메이션", + "info": "주어진 스케일 양이 변경될 때, 자식 구성 요소가 스케일 값에 따라 자동으로 조정되며, 이전 값과 이후 값 간에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "스케일 애니메이션 효과", + "desc": [ + "이 예제에서는 scale 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인합니다.", + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【filterQuality】 : 필터 품질 【FilterQuality】", + "【scale】 : 스케일 양 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json new file mode 100644 index 00000000..3d30020a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animação de Escala", + "info": "Quando a quantidade de escala fornecida muda, o componente filho pode ajustar automaticamente em relação ao valor de escala, e há uma animação entre os valores anteriores e posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Escala", + "desc": [ + "Neste exemplo, arraste para ajustar o parâmetro de escala e observe o efeito da animação.", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【filterQuality】 : Qualidade do filtro 【FilterQuality】", + "【scale】 : Quantidade de escala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json new file mode 100644 index 00000000..fe5c1558 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Анимация масштабирования", + "info": "Когда заданный масштаб изменяется, дочерний компонент может автоматически регулироваться относительно значения масштабирования, и значения до и после имеют анимационные изменения.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации масштабирования", + "desc": [ + "В этом примере перетащите для настройки параметра scale и посмотрите эффект анимации.", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по окончании анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【alignment】 : Центр преобразования анимации 【Alignment】", + "【filterQuality】 : Качество фильтра 【FilterQuality】", + "【scale】 : Масштаб 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json new file mode 100644 index 00000000..845ded52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "缩放动画", + "info": "给定的缩放量发生变化时,子组件可以自动调整相对于缩放值,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "缩放动画效果", + "desc": [ + "该案例中,拖拽调节 scale 参数,查看动画运动效果。", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【alignment】 : 动画变换中心 【Alignment】", + "【filterQuality】 : 滤镜质量 【FilterQuality】", + "【scale】 : 缩放量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart new file mode 100644 index 00000000..5f02a598 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart @@ -0,0 +1,70 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + +class AnimatedScaleDemo extends StatefulWidget { + const AnimatedScaleDemo({super.key}); + + @override + State createState() => _AnimatedScaleDemoState(); +} + +class _AnimatedScaleDemoState extends State { + double _scale = 1; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + child: SizedBox( + height: 200, + child: Center( + child: AnimatedScale( + scale: _scale, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container(color: Colors.red,height: 40,width: 40,), + ), + ), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('scale:${_scale.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: 0, + max: 5.0, + value: _scale, + onChanged: (double value) { + setState(() { + _scale = value; + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json new file mode 100644 index 00000000..5d979ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Gleitende Animation", + "info": "Wenn sich der gegebene Versatz ändert, kann die Unterkomponente den relativen Versatz automatisch anpassen, und die vorherigen und nachfolgenden Werte haben eine animierte Veränderung.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Gleitende Animationseffekt", + "desc": [ + "In diesem Fall ziehen Sie die x,y-Parameter, um den Animationseffekt zu sehen. Dabei ist der Versatz = x,y * Breite und Höhe des Rahmens", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf beim Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【offset】 : Versatz 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json new file mode 100644 index 00000000..bac59c4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Slide Animation", + "info": "When the given offset changes, the child component can automatically adjust the relative offset, and there is an animated change between the previous and current values.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Slide Animation Effect", + "desc": [ + "In this case, drag to adjust the x, y parameters to view the animation effect. The offset = x, y * the width and height of the box.", + "【child】: child component 【Widget】", + "【duration】: animation duration 【Duration】", + "【onEnd】: animation end callback 【Function()】", + "【curve】: animation curve 【Duration】", + "【offset】: offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json new file mode 100644 index 00000000..70971c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animación de deslizamiento", + "info": "Cuando el desplazamiento dado cambia, los componentes hijos pueden ajustar automáticamente el desplazamiento relativo, y los valores anteriores y posteriores tienen una animación de cambio.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de deslizamiento", + "desc": [ + "En este caso, arrastre para ajustar los parámetros x, y y observe el efecto de movimiento de la animación. Donde el desplazamiento = x, y * ancho y alto del cuadro", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al final de la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【offset】 : Desplazamiento 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json new file mode 100644 index 00000000..30064c4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animation de glissement", + "info": "Lorsque l'offset donné change, le composant enfant peut ajuster automatiquement l'offset relatif, et les valeurs avant et après ont une animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de glissement", + "desc": [ + "Dans ce cas, faites glisser pour ajuster les paramètres x, y et observez l'effet de l'animation. Où l'offset = x, y * largeur et hauteur de la boîte", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【offset】 : Offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json new file mode 100644 index 00000000..1b46a47b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animazione di scorrimento", + "info": "Quando l'offset dato cambia, i componenti figli possono regolare automaticamente l'offset relativo e i valori precedenti e successivi hanno un'animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto animazione di scorrimento", + "desc": [ + "In questo caso, trascina per regolare i parametri x,y e osserva l'effetto di movimento dell'animazione. Dove offset = x,y * larghezza e altezza del riquadro", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【offset】 : Offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json new file mode 100644 index 00000000..c70d021a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "スライドアニメーション", + "info": "指定されたオフセットが変化するとき、子コンポーネントは自動的に相対的なオフセットを調整し、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "スライドアニメーション効果", + "desc": [ + "このケースでは、x、yパラメータをドラッグして調整し、アニメーションの動き効果を確認します。オフセット = x、y * ボックスの幅と高さ", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【curve】 : アニメーションカーブ 【Duration】", + "【offset】 : オフセット 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json new file mode 100644 index 00000000..ae881562 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "슬라이드 애니메이션", + "info": "주어진 오프셋이 변경될 때, 자식 컴포넌트가 자동으로 상대 오프셋을 조정할 수 있으며, 이전과 이후 값에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "슬라이드 애니메이션 효과", + "desc": [ + "이 예제에서 x, y 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인하세요. 여기서 오프셋 = x, y * 상자 너비 및 높이", + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【offset】 : 오프셋 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json new file mode 100644 index 00000000..728d47cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animação de Deslize", + "info": "Quando o deslocamento fornecido muda, o componente filho pode ajustar automaticamente o deslocamento relativo, e os valores anteriores e posteriores têm uma mudança animada.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Deslize", + "desc": [ + "Neste caso, arraste para ajustar os parâmetros x, y e observe o efeito do movimento da animação. Onde o deslocamento = x, y * largura e altura da caixa", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【offset】 : Deslocamento 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json new file mode 100644 index 00000000..102c86d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Анимация скольжения", + "info": "Когда заданное смещение изменяется, дочерний компонент может автоматически регулировать относительное смещение, и значения до и после имеют анимационные изменения.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации скольжения", + "desc": [ + "В этом примере перетащите параметры x, y, чтобы увидеть эффект анимации. Смещение = x, y * ширина и высота рамки", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【offset】 : Смещение 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json new file mode 100644 index 00000000..611a2879 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "滑动动画", + "info": "给定的偏移量发生变化时,子组件可以自动调整相对偏移量,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "滑动动画效果", + "desc": [ + "该案例中,拖拽调节 x,y 参数,查看动画运动效果。其中偏移量 = x,y * 方框宽高", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【offset】 : 偏移量 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart new file mode 100644 index 00000000..10da0649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart @@ -0,0 +1,94 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + +class AnimatedSlideDemo extends StatefulWidget { + const AnimatedSlideDemo({super.key}); + + @override + State createState() => _AnimatedSlideDemoState(); +} + +class _AnimatedSlideDemoState extends State { + Offset offset = Offset.zero; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + // alignment: Alignment.center, + child: SizedBox( + height: 200, + child: Center( + child: AnimatedSlide( + offset: offset, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container(color: Colors.red,height: 40,width: 40,), + ), + ), + ), + ), + ), + SizedBox( + height: 200, + child: Column( + children: [ + Text('Y:${offset.dy.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: RotatedBox( + quarterTurns: 1, + child: Slider( + min: -2.0, + max: 2.0, + value: offset.dy, + onChanged: (double value) { + setState(() { + offset = Offset(offset.dx, value); + }); + }, + ), + ), + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('X:${offset.dx.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: -4.0, + max: 4.0, + value: offset.dx, + onChanged: (double value) { + setState(() { + offset = Offset(value, offset.dy); + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json new file mode 100644 index 00000000..11a1f9c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Animierter Wechsel", + "info": "Führt eine Animation aus, wenn sich das Kind-Widget ändert. Der Schlüssel des Kind-Widgets muss angegeben werden. Die Animationsart kann angepasst werden, und Eigenschaften wie Animationsdauer und Animationskurve können festgelegt werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedSwitcher", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【switchOutCurve】 : Ausblendkurve 【Curves】", + "【switchInCurve】 : Einblendkurve 【Curves】", + "【switchInCurve】 : Einblendkurve 【Curves】", + "【transitionBuilder】 : Animationsgenerator 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json new file mode 100644 index 00000000..1efd5c64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Animated Switcher", + "info": "Executes animations when child components change. The key of the child components needs to be specified for identification. The animation method can be customized, and properties such as animation duration and animation curve can be specified.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedSwitcher", + "desc": [ + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【switchOutCurve】 : Switch out curve 【Curves】", + "【switchInCurve】 : Switch in curve 【Curves】", + "【switchInCurve】 : Switch in curve 【Curves】", + "【transitionBuilder】 : Animation builder 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json new file mode 100644 index 00000000..e6686707 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Cambio animado", + "info": "Ejecuta una animación cuando cambia el componente hijo, es necesario especificar la clave del componente hijo para identificarlo. La forma de la animación se puede personalizar, se pueden especificar propiedades como la duración de la animación, la curva de la animación, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedSwitcher", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【switchOutCurve】 : Curva de salida 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【transitionBuilder】 : Constructor de animación 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json new file mode 100644 index 00000000..b7002d43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Changement animé", + "info": "Exécute une animation lorsque les composants enfants changent, nécessite de spécifier une clé pour identifier les composants enfants. Le style d'animation peut être personnalisé, permettant de spécifier la durée de l'animation, la courbe d'animation, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AnimatedSwitcher", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【switchOutCurve】 : Courbe de sortie 【Curves】", + "【switchInCurve】 : Courbe d'entrée 【Curves】", + "【switchInCurve】 : Courbe d'entrée 【Curves】", + "【transitionBuilder】 : Constructeur d'animation 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json new file mode 100644 index 00000000..f82759ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Cambio Animato", + "info": "Esegue un'animazione quando il componente figlio cambia, è necessario specificare la chiave del componente figlio per l'identificazione. Il metodo di animazione può essere personalizzato, è possibile specificare la durata dell'animazione, la curva dell'animazione e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedSwitcher", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【switchOutCurve】 : Curva di uscita 【Curves】", + "【switchInCurve】 : Curva di ingresso 【Curves】", + "【switchInCurve】 : Curva di ingresso 【Curves】", + "【transitionBuilder】 : Costruttore di animazione 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json new file mode 100644 index 00000000..343dac5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "アニメーション切り替え", + "info": "子コンポーネントが変更されたときにアニメーションを実行します。子コンポーネントのkeyを指定して識別する必要があります。アニメーションの方法はカスタマイズ可能で、アニメーションの時間やアニメーションカーブなどの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcherの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【switchOutCurve】 : 切り出しカーブ 【Curves】", + "【switchInCurve】 : 切り込みカーブ 【Curves】", + "【switchInCurve】 : 切り込みカーブ 【Curves】", + "【transitionBuilder】 : アニメーションビルダー 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json new file mode 100644 index 00000000..127b5bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "애니메이션 전환", + "info": "자식 컴포넌트가 변경될 때 애니메이션을 실행하며, 자식 컴포넌트의 key를 지정하여 식별해야 합니다. 애니메이션 방식은 사용자 정의가 가능하며, 애니메이션 지속 시간, 애니메이션 곡선 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcher 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【switchOutCurve】 : 전환 아웃 곡선 【Curves】", + "【switchInCurve】 : 전환 인 곡선 【Curves】", + "【switchInCurve】 : 전환 인 곡선 【Curves】", + "【transitionBuilder】 : 애니메이션 빌더 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json new file mode 100644 index 00000000..bcb3ab6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Alternância Animada", + "info": "Executa uma animação quando o componente filho muda, é necessário especificar a chave do componente filho para identificação. O modo de animação pode ser personalizado, podendo especificar a duração da animação, a curva da animação, entre outros atributos.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedSwitcher", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【switchOutCurve】 : Curva de saída 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【transitionBuilder】 : Construtor de animação 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json new file mode 100644 index 00000000..8b2cf9cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Анимированный переключатель", + "info": "Выполняет анимацию при изменении дочернего компонента, необходимо указать ключ дочернего компонента для идентификации. Способ анимации может быть настроен, можно указать продолжительность анимации, кривую анимации и другие свойства.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedSwitcher", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【switchOutCurve】 : Кривая выхода 【Curves】", + "【switchInCurve】 : Кривая входа 【Curves】", + "【switchInCurve】 : Кривая входа 【Curves】", + "【transitionBuilder】 : Конструктор анимации 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json new file mode 100644 index 00000000..6b783f19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "动画切换", + "info": "当子组件变化时执行动画,需要指定子组件的key进行标识。动画方式可以自定义,能指定动画时长、动画曲线等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcher基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【switchOutCurve】 : 切出曲线 【Curves】", + "【switchInCurve】 : 切入曲线 【Curves】", + "【switchInCurve】 : 切入曲线 【Curves】", + "【transitionBuilder】 : 动画构造器 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart new file mode 100644 index 00000000..dd7f8164 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + + +class CustomAnimatedSwitcher extends StatefulWidget { + const CustomAnimatedSwitcher({Key? key}) : super(key: key); + + @override + _CustomAnimatedSwitcherState createState() => _CustomAnimatedSwitcherState(); +} + +class _CustomAnimatedSwitcherState extends State { + int _count = 0; + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + _buildMinusBtn(), + SizedBox(width:80,child: _buildAnimatedSwitcher(context)), + _buildAddBtn() + ], + ); + } + + Widget _buildAnimatedSwitcher(BuildContext context) => + AnimatedSwitcher( + duration: const Duration(milliseconds: 400), + transitionBuilder: (Widget child, Animation animation) => + ScaleTransition( + child: RotationTransition(turns: animation, child: child), + scale: animation), + child: Text( + '$_count', + key: ValueKey(_count), + style: Theme.of(context).textTheme.headlineSmall, + ), + ); + + Widget _buildMinusBtn() { + return MaterialButton( + padding: const EdgeInsets.all(0), + textColor: const Color(0xffFfffff), + elevation: 3, + color: Colors.red, + highlightColor: const Color(0xffF88B0A), + splashColor: Colors.red, + child: const Icon( + Icons.remove, + color: Colors.white, + ), + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onPressed: () => setState(() => _count -= 1)); + } + + Widget _buildAddBtn() => MaterialButton( + padding: const EdgeInsets.all(0), + textColor: const Color(0xffFfffff), + elevation: 3, + color: Colors.blue, + highlightColor: const Color(0xffF88B0A), + splashColor: Colors.red, + child: const Icon( + Icons.add, + color: Colors.white, + ), + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onPressed: () => setState(() => _count += 1)); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json new file mode 100644 index 00000000..3800fd0a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Animiertes Thema", + "info": "Eine Komponente mit animierten Effekten bei Themenänderungen, im Wesentlichen eine Kombination aus der Theme-Komponente und Animationen. Kann ThemeData, Animationsdauer, Kurve, Endrückruf usw. angeben. Entspricht einer erweiterten Version der Theme-Komponente.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedTheme", + "desc": [ + "【data】 : Themen-Daten 【ThemeData】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json new file mode 100644 index 00000000..922c7eec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Animated Theme", + "info": "A component with animation effects when the theme changes, essentially a combination of the Theme component and animation. You can specify ThemeData, animation duration, curve, end callback, etc. It is equivalent to an enhanced version of the Theme component.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedTheme", + "desc": [ + "【data】 : Theme data 【ThemeData】", + "【duration】 : Animation duration 【Duration】", + "【onEnd】 : Animation end callback 【Function()】", + "【curve】 : Animation curve 【Duration】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json new file mode 100644 index 00000000..75c8c2b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animado", + "info": "Componente con efectos de animación cuando cambia el tema, esencialmente es una combinación del componente Theme y animaciones. Se puede especificar ThemeData, duración de la animación, curva, devolución de llamada al finalizar, etc. Equivale a una versión mejorada del componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedTheme", + "desc": [ + "【data】 : Datos del tema 【ThemeData】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json new file mode 100644 index 00000000..f0926763 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Thème animé", + "info": "Un composant avec des effets d'animation lors du changement de thème, essentiellement une combinaison du composant Theme et d'animations. Peut spécifier ThemeData, la durée de l'animation, la courbe, le rappel de fin, etc. Équivalent à une version améliorée du composant Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedTheme", + "desc": [ + "【data】 : Données du thème 【ThemeData】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json new file mode 100644 index 00000000..ec4dc6e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animato", + "info": "Componente con effetti animati quando il tema cambia, essenzialmente una combinazione del componente Theme e delle animazioni. È possibile specificare ThemeData, durata dell'animazione, curva, callback di fine, ecc. Equivale a una versione potenziata del componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedTheme", + "desc": [ + "【data】 : Dati del tema 【ThemeData】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json new file mode 100644 index 00000000..35034028 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "アニメーションテーマ", + "info": "テーマ変更時にアニメーション効果を持つコンポーネントで、本質的にはThemeコンポーネントとアニメーションを組み合わせたものです。ThemeData、アニメーション時間、曲線、終了コールバックなどを指定できます。強化版のThemeコンポーネントと言えます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedThemeの基本使用", + "desc": [ + "【data】 : テーマデータ 【ThemeData】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json new file mode 100644 index 00000000..8081edd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "애니메이션 테마", + "info": "테마 변경 시 애니메이션 효과가 있는 컴포넌트로, 본질적으로 Theme 컴포넌트와 애니메이션의 결합물입니다. ThemeData, 애니메이션 지속 시간, 곡선, 종료 콜백 등을 지정할 수 있습니다. 강화된 버전의 Theme 컴포넌트에 해당합니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedTheme 기본 사용", + "desc": [ + "【data】 : 테마 데이터 【ThemeData】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json new file mode 100644 index 00000000..978ace02 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animado", + "info": "Componente com efeitos de animação durante a mudança de tema, essencialmente uma combinação do componente Theme com animação. Pode especificar ThemeData, duração da animação, curva, callback de término, etc. Equivalente a uma versão aprimorada do componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedTheme", + "desc": [ + "【data】 : Dados do tema 【ThemeData】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json new file mode 100644 index 00000000..fb343373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Анимированная тема", + "info": "Компонент с анимацией при изменении темы, по сути, является комбинацией компонента Theme и анимации. Можно указать ThemeData, продолжительность анимации, кривую, обратный вызов завершения и т.д. Это улучшенная версия компонента Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedTheme", + "desc": [ + "【data】 : Данные темы 【ThemeData】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json new file mode 100644 index 00000000..65224b21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "动画主题", + "info": "主题变化时具有动画效果的组件,本质是Theme组件和动画结合的产物。可指定ThemeData、动画时长、曲线、结束回调等。相当于增强版的Theme组件。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedTheme基本使用", + "desc": [ + "【data】 : 主题数据 【ThemeData】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart new file mode 100644 index 00000000..eda0d045 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class AnimatedThemeDemo extends StatefulWidget { + const AnimatedThemeDemo({Key? key}) : super(key: key); + + @override + _AnimatedThemeDemoState createState() => _AnimatedThemeDemoState(); +} + +class _AnimatedThemeDemoState extends State { + ThemeData startThem = ThemeData( + primaryColor: Colors.blue, + textTheme: const TextTheme( + headlineMedium: TextStyle( + color: Colors.white, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + )); + + ThemeData endThem = ThemeData( + primaryColor: Colors.red, + textTheme: const TextTheme( + headlineMedium: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.normal, + ))); + + late ThemeData them; + + @override + void initState() { + super.initState(); + them = startThem; + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildSwitch(), + AnimatedTheme( + data: them, + duration: const Duration(seconds: 2), + curve: Curves.fastOutSlowIn, + onEnd: () { + print('----onEnd---'); + }, + child: const ChildContent(), + ), + ], + ); + } + + Widget _buildSwitch() { + print(them == endThem); + return Switch( + value: them == endThem, + onChanged: (v) { + setState(() { + them = v ? endThem : startThem; + }); + }); + } +} + +class ChildContent extends StatelessWidget { + const ChildContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: 250, + height: 60, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + color: Theme.of(context).primaryColor, + ), + padding: const EdgeInsets.all(10), + child: Text( + 'Flutter Unit', + style: Theme.of(context).textTheme.headlineMedium, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json new file mode 100644 index 00000000..cf8888cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Anwendungsleiste", + "info": "Eine allgemeine Struktur für die obere Leiste einer Anwendung, in der entsprechende Komponenten an bestimmten Stellen platziert werden können. Wird häufig in Scaffold-Komponenten verwendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AppBar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【title】 : Mittlere Komponente 【Widget】", + "【actions】 : Rechte Komponente 【List】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【backgroundColor】 : Hintergrundfarbe 【Hintergrundfarbe】", + "【centerTitle】 : Zentrierung in der Mitte 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Verwendung von AppBar mit TabBar und TabBarView", + "desc": [ + "【bottom】 : Untere Komponente 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json new file mode 100644 index 00000000..0a73cc16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "App Header", + "info": "A common structure for the top bar of an application, where corresponding components can be placed in specified areas, often used in the Scaffold component.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AppBar", + "desc": [ + "【leading】 : Left component 【Widget】", + "【title】 : Middle component 【Widget】", + "【actions】 : Right component 【List】", + "【elevation】 : Shadow depth 【double】", + "【shape】 : Shape 【ShapeBorder】", + "【backgroundColor】 : Background color 【Color】", + "【centerTitle】 : Whether the title is centered 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Using AppBar with TabBar and TabBarView", + "desc": [ + "【bottom】 : Bottom component 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json new file mode 100644 index 00000000..b055e3b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra de aplicación", + "info": "Una estructura común para la barra superior de una aplicación, que permite colocar componentes correspondientes en áreas específicas, comúnmente utilizada en el componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AppBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Componente derecho 【List】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Profundidad de sombra 【Color de fondo】", + "【centerTitle】 : Centrar el título 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso combinado de AppBar con TabBar y TabBarView", + "desc": [ + "【bottom】 : Componente inferior 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json new file mode 100644 index 00000000..99b7c29c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barre d'application", + "info": "Une structure commune pour une barre en haut de l'application, où des composants peuvent être placés dans des zones spécifiées, souvent utilisée dans le composant Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de l'AppBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【title】 : Composant central 【Widget】", + "【actions】 : Composant droit 【List】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【backgroundColor】 : Profondeur de l'ombre 【Couleur de fond】", + "【centerTitle】 : Centrage du titre 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Utilisation combinée de l'AppBar avec TabBar et TabBarView", + "desc": [ + "【bottom】 : Composant inférieur 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json new file mode 100644 index 00000000..67ffa34d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra dell'applicazione", + "info": "Una struttura comune per la barra superiore di un'applicazione, che consente di posizionare componenti specifici in aree designate, spesso utilizzata nel componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AppBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【title】 : Componente centrale 【Widget】", + "【actions】 : Componente destro 【List】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Colore di sfondo 【Colore】", + "【centerTitle】 : Centratura del titolo 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso combinato di AppBar con TabBar e TabBarView", + "desc": [ + "【bottom】 : Componente inferiore 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json new file mode 100644 index 00000000..55bc8d2a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "アプリケーションバー", + "info": "アプリの上部バーの一般的な構造で、指定された部分に適切なコンポーネントを配置できます。Scaffoldコンポーネントでよく使用されます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBarの基本使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【title】 : 中央コンポーネント 【Widget】", + "【actions】 : 右側コンポーネント 【List】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【backgroundColor】 : 背景色 【背景色】", + "【centerTitle】 : 中央を中央揃えにするか 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBarとTabBar、TabBarViewの連携使用", + "desc": [ + "【bottom】 : 下部コンポーネント 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json new file mode 100644 index 00000000..09bbd0c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "앱 상단 바", + "info": "앱 상단 바의 일반적인 구조로, 지정된 위치에 해당 컴포넌트를 배치할 수 있으며, 주로 Scaffold 컴포넌트에서 사용됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBar 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【title】 : 중앙 컴포넌트 【Widget】", + "【actions】 : 오른쪽 컴포넌트 【List】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【backgroundColor】 : 배경색 【Color】", + "【centerTitle】 : 중앙 제목 정렬 여부 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBar와 TabBar, TabBarView 함께 사용", + "desc": [ + "【bottom】 : 하단 컴포넌트 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json new file mode 100644 index 00000000..2f139cc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra de Aplicação", + "info": "Uma estrutura comum para a barra superior de uma aplicação, onde componentes correspondentes podem ser colocados em áreas específicas, frequentemente utilizada no componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AppBar", + "desc": [ + "【leading】 : Componente do lado esquerdo 【Widget】", + "【title】 : Componente do meio 【Widget】", + "【actions】 : Componente do lado direito 【List】", + "【elevation】 : Profundidade da sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Cor de fundo 【Cor de fundo】", + "【centerTitle】 : Centralizar no meio 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso do AppBar com TabBar e TabBarView", + "desc": [ + "【bottom】 : Componente inferior 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json new file mode 100644 index 00000000..b3d5c22a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Верхняя панель приложения", + "info": "Общая структура верхней панели приложения, в которой можно разместить соответствующие компоненты в указанных местах, часто используется в компоненте Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AppBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【title】 : Центральный компонент 【Widget】", + "【actions】 : Правый компонент 【List】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【backgroundColor】 : Цвет фона 【Цвет】", + "【centerTitle】 : Центрирование заголовка 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Использование AppBar с TabBar и TabBarView", + "desc": [ + "【bottom】 : Нижний компонент 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json new file mode 100644 index 00000000..1ab0dc10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "应用头栏", + "info": "一个应用顶部栏的通用结构,可在指定的部位放置相应的组件,常用于Scaffold组件中。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【title】 : 中间组件 【Widget】", + "【actions】 : 右侧组件 【List】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【backgroundColor】 : 影深 【背景色】", + "【centerTitle】 : 中间是否居中 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBar与TabBar、TabBarView联用", + "desc": [ + "【bottom】 : 底部组件 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart new file mode 100644 index 00000000..1b86573e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +import '../PopupMenuButton/node1_base.dart'; + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + + +class CustomAppBar extends StatelessWidget { + const CustomAppBar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AppBar( + title: const Text('风雅六社'), + leading: const BackButton(), + backgroundColor: Colors.amber[500], + elevation: 2, + centerTitle: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + topRight: Radius.circular(5), + bottomLeft: Radius.circular(5), + )), + actions: [ + IconButton( + icon: const Icon(Icons.star), + tooltip: 'liked_widget_bloc', + onPressed: () { + // do nothing + }), + const CustomPopupMenuButton() + ], + ); + } +} diff --git a/packages/widgets/lib/StatefulWidget/AppBar/node2_tab.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart similarity index 90% rename from packages/widgets/lib/StatefulWidget/AppBar/node2_tab.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart index 29301e14..5eaf703f 100644 --- a/packages/widgets/lib/StatefulWidget/AppBar/node2_tab.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; import '../PopupMenuButton/node1_base.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 57, -// "name": 'AppBar与TabBar、TabBarView联用', -// "priority": 2, -// "subtitle": -// "【bottom】 : 底部组件 【PreferredSizeWidget】", -// } + class TabAppBar extends StatefulWidget { const TabAppBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json new file mode 100644 index 00000000..926bc240 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Automatische Lebenserhaltung", + "info": "In einer Liste mit verzögerter Ladung ermöglicht es den Unterbäumen, den Zustand beizubehalten. Allein verwendet hat es keine Wirkung und muss in Verbindung mit KeepAliveNotification verwendet werden.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in AutomaticKeepAlive", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "In den Quellcodes von Listen- und Seitenwechselkomponenten wie ListView, SliverList, GridView, SliverGrid, PageView, TabBarView wird die AutomaticKeepAlive-Komponente verwendet. Um den Zustand eines States zu erhalten, kann AutomaticKeepAliveClientMixin verwendet werden, das eine einfache Kapselung der Verwendung von KeepAliveNotification darstellt. Dieses Beispiel zeigt die Zustandserhaltung der ListView-Einträge." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json new file mode 100644 index 00000000..721b09ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Automatic Keep Alive", + "info": "In lazy-loaded lists, allows subtrees to request to maintain state. It has no effect when used alone and needs to be used in conjunction with KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to AutomaticKeepAlive", + "desc": [ + "【child】: Child component 【Widget】", + "The AutomaticKeepAlive component is used in the source code of list and page-switching components such as ListView, SliverList, GridView, SliverGrid, PageView, and TabBarView. When keeping a State alive, you can use AutomaticKeepAliveClientMixin, which is a simple encapsulation of the use of KeepAliveNotification. This example demonstrates the state preservation of ListView items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json new file mode 100644 index 00000000..ab29b9ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Mantenimiento automático", + "info": "En listas de carga perezosa, permite que los subárboles soliciten mantener el estado. No tiene efecto si se usa solo, debe usarse junto con KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a AutomaticKeepAlive", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "El componente AutomaticKeepAlive se utiliza en el código fuente de componentes de lista y cambio de página como ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, etc. Para mantener vivo un State, se puede usar AutomaticKeepAliveClientMixin, que es una encapsulación simple del uso de KeepAliveNotification. Este ejemplo muestra cómo mantener vivo el estado de un elemento en ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json new file mode 100644 index 00000000..e4380b34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Maintien automatique en vie", + "info": "Dans les listes chargées de manière paresseuse, permet aux sous-arbres de demander à maintenir leur état. Utilisé seul, il n'a aucun effet. Doit être utilisé avec KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à AutomaticKeepAlive", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Le composant AutomaticKeepAlive est utilisé dans les composants de liste et de pagination tels que ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, etc. Pour maintenir en vie un certain State, on peut utiliser AutomaticKeepAliveClientMixin, qui est un enrobage simplifié de l'utilisation de KeepAliveNotification. Cet exemple montre le maintien en vie de l'état des entrées de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json new file mode 100644 index 00000000..8a34fd8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Mantenimento Automatico", + "info": "Nelle liste a caricamento lento, consente ai sottoalberi di richiedere il mantenimento dello stato. Non ha effetto se usato da solo, deve essere utilizzato insieme a KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a AutomaticKeepAlive", + "desc": [ + "【child】 : componente figlio 【Widget】", + "Nei componenti come ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, il componente AutomaticKeepAlive è ampiamente utilizzato. Per mantenere attivo uno stato, è possibile utilizzare AutomaticKeepAliveClientMixin, che è un'implementazione semplificata dell'uso di KeepAliveNotification. Questo esempio mostra il mantenimento dello stato degli elementi in ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json new file mode 100644 index 00000000..ec58d18d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "自動キープアライブ", + "info": "遅延読み込みのリストで、サブツリーが状態を維持することを許可します。単独で使用しても効果はなく、KeepAliveNotification と併用する必要があります。", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "ListView、SliverList、GridView、SliverGrid、PageView、TabBarView などのリストやページ切り替えコンポーネントのソースコードでは、AutomaticKeepAlive コンポーネントが使用されています。特定の State をキープアライブする場合、AutomaticKeepAliveClientMixin を使用して操作できます。これは KeepAliveNotification を使用するための簡易なラッパーです。この例では、ListView の項目の状態をキープアライブする方法を示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json new file mode 100644 index 00000000..a1b74b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "자동 생존 유지", + "info": "지연 로드 목록에서 하위 트리가 상태를 유지하도록 요청할 수 있으며, 단독으로 사용할 경우 효과가 없으며 KeepAliveNotification과 함께 사용해야 합니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "ListView, SliverList, GridView, SliverGrid, PageView, TabBarView 등의 목록 및 페이지 전환 위젯 소스 코드에는 AutomaticKeepAlive 위젯이 사용됩니다. 특정 State를 생존 유지할 때 AutomaticKeepAliveClientMixin을 사용하여 작업할 수 있으며, 이는 KeepAliveNotification 사용을 간단하게 캡슐화한 것입니다. 이 예제는 ListView 항목의 상태 생존 유지를 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json new file mode 100644 index 00000000..c234a4e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Manutenção automática", + "info": "Em listas de carregamento preguiçoso, permite que as subárvores solicitem a manutenção do estado. O uso isolado não tem efeito e deve ser usado em conjunto com o KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao AutomaticKeepAlive", + "desc": [ + "【child】 : componente filho 【Widget】", + "O componente AutomaticKeepAlive é utilizado em ListView, SliverList, GridView, SliverGrid, PageView, TabBarView e outros componentes de lista e de mudança de página. Para manter o estado de um State, pode-se usar o AutomaticKeepAliveClientMixin, que é um encapsulamento simplificado do uso do KeepAliveNotification. Este exemplo mostra a manutenção do estado de um item da ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json new file mode 100644 index 00000000..6b757e2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Автоматическое поддержание активности", + "info": "В лениво загружаемых списках позволяет поддеревьям запрашивать сохранение состояния. Само по себе не имеет эффекта, необходимо использовать вместе с KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в AutomaticKeepAlive", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Компонент AutomaticKeepAlive используется в исходном коде списков и страничных компонентов, таких как ListView, SliverList, GridView, SliverGrid, PageView, TabBarView и других. Для поддержания активности определенного State можно использовать AutomaticKeepAliveClientMixin, который представляет собой простую обертку для использования KeepAliveNotification. Этот пример демонстрирует поддержание состояния элементов ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json new file mode 100644 index 00000000..630f8742 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "自动保活", + "info": "在懒加载的列表中,允许子树请求保持状态,单独使用无效果,需要配合 KeepAliveNotification 使用。", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "在 ListView、SliverList、GridView、SliverGrid、PageView、TabBarView 等列表、切页组件源码中都有使用到 AutomaticKeepAlive 组件。在保活某个 State 时,可以使用 AutomaticKeepAliveClientMixin 进行操作,它是对 KeepAliveNotification 使用的一个简易封装。该示例展示出 ListView 条目的状态保活。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart new file mode 100644 index 00000000..0416dbc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class AutomaticKeepAliveDemo extends StatelessWidget { + const AutomaticKeepAliveDemo({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: ListView.builder( + itemCount: data.length, + itemBuilder: (_, index) => _ColorBox( + color: data[index], + index: index, + ), + ), + ); + } +} + +class _ColorBox extends StatefulWidget { + final Color color; + final int index; + + const _ColorBox({super.key, required this.color, required this.index}); + + @override + _ColorBoxState createState() => _ColorBoxState(); +} + +class _ColorBoxState extends State<_ColorBox> with AutomaticKeepAliveClientMixin { + bool _checked = false; + + @override + void initState() { + super.initState(); + _checked = false; + print('-----_ColorBoxState#initState---${widget.index}-------'); + } + + @override + void dispose() { + print('-----_ColorBoxState#dispose---${widget.index}-------'); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return Container( + alignment: Alignment.center, + height: 50, + color: widget.color, + child: Row( + children: [ + const SizedBox( + width: 60, + ), + Checkbox( + value: _checked, + onChanged: (bool? v) { + setState(() { + _checked = v ?? false; + }); + }, + ), + Text( + "index ${widget.index}: ${colorString(widget.color)}", + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ], + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + @override + bool get wantKeepAlive => true; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json new file mode 100644 index 00000000..5659293c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Untere Navigationsleiste", + "info": "Eine einbettbare untere Navigationsleiste, die normalerweise am unteren Ende des Scaffold-Widgets verwendet wird. Kann Eigenschaften wie Farbe, Schattentiefe, Form usw. angeben und kann mit PageView einen Seitenwechsel-Effekt erzielen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomAppBar", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【NotchedShape】", + "【notchMargin】 : Abstand 【double】", + "【color】 : Farbe 【Color】", + "【child】 : Kind 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json new file mode 100644 index 00000000..c4bb3f05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Bottom Navigation", + "info": "A recessed bottom navigation bar, typically used at the bottom of a Scaffold component, can specify properties such as color, elevation, shape, etc., and can achieve page-switching effects with PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomAppBar", + "desc": [ + "【elevation】: Elevation 【double】", + "【shape】: Shape 【NotchedShape】", + "【notchMargin】: Notch Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json new file mode 100644 index 00000000..ac76510d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra de navegación inferior", + "info": "Una barra de navegación inferior que se puede incrustar, generalmente se usa en la parte inferior del componente Scaffold, se pueden especificar propiedades como color, profundidad de sombra, forma, etc., y se puede implementar un efecto de cambio de página con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BottomAppBar", + "desc": [ + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【NotchedShape】", + "【notchMargin】 : Distancia de separación 【double】", + "【color】 : Color 【Color】", + "【child】 : Hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json new file mode 100644 index 00000000..bcfc5fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barre de navigation inférieure", + "info": "Une barre de navigation inférieure encastrable, généralement utilisée au bas du composant Scaffold, peut spécifier des propriétés telles que la couleur, la profondeur de l'ombre, la forme, etc., et peut réaliser un effet de changement de page avec PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomAppBar", + "desc": [ + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【NotchedShape】", + "【notchMargin】 : Distance d'intervalle 【double】", + "【color】 : Couleur 【Color】", + "【child】 : Enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json new file mode 100644 index 00000000..ccdb358b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra di navigazione inferiore", + "info": "Una barra di navigazione inferiore incassabile, solitamente utilizzata nella parte inferiore del componente Scaffold, può specificare proprietà come colore, profondità dell'ombra, forma, ecc., e può realizzare l'effetto di cambio pagina con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BottomAppBar", + "desc": [ + "【elevation】 : profondità dell'ombra 【double】", + "【shape】 : forma 【NotchedShape】", + "【notchMargin】 : distanza di intervallo 【double】", + "【color】 : colore 【Color】", + "【child】 : figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json new file mode 100644 index 00000000..de775395 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "ボトムナビゲーション", + "info": "凹型のボトムナビゲーションバーで、通常Scaffoldコンポーネントの下部に使用され、色、影の深さ、形状などの属性を指定できます。PageViewと組み合わせてページ切り替え効果を実現できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBarの基本使用法", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【NotchedShape】", + "【notchMargin】 : 間隔距離 【double】", + "【color】 : 色 【Color】", + "【child】 : 子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json new file mode 100644 index 00000000..c91f6fa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "하단 네비게이션", + "info": "들여쓰기 가능한 하단 네비게이션 바로, 일반적으로 Scaffold 컴포넌트의 하단에 사용되며, 색상, 그림자 깊이, 모양 등 속성을 지정할 수 있으며, PageView와 함께 페이지 전환 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBar 기본 사용법", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【NotchedShape】", + "【notchMargin】 : 간격 거리 【double】", + "【color】 : 색상 【Color】", + "【child】 : 자식 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json new file mode 100644 index 00000000..33969f6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra de Navegação Inferior", + "info": "Uma barra de navegação inferior recortável, geralmente usada na parte inferior do componente Scaffold, pode especificar propriedades como cor, profundidade de sombra, forma, etc., e pode ser usada com PageView para implementar efeitos de mudança de página.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomAppBar", + "desc": [ + "【elevation】 : Profundidade de Sombra 【double】", + "【shape】 : Forma 【NotchedShape】", + "【notchMargin】 : Distância de Espaçamento 【double】", + "【color】 : Cor 【Color】", + "【child】 : Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json new file mode 100644 index 00000000..105a260a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Нижняя навигация", + "info": "Встраиваемая нижняя панель навигации, обычно используемая в нижней части компонента Scaffold, может быть указана с такими свойствами, как цвет, глубина тени, форма и может быть реализована с эффектом перелистывания страниц с помощью PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomAppBar", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【NotchedShape】", + "【notchMargin】 : Расстояние между элементами 【double】", + "【color】 : Цвет 【Color】", + "【child】 : Дочерний элемент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json new file mode 100644 index 00000000..e367a9f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "底部导航", + "info": "一个可凹嵌的底部导航栏,通常用于Scaffold组件的底部,可指定颜色、影深、形状等属性,可与PageView实现切页效果。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBar基本用法", + "desc": [ + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【NotchedShape】", + "【notchMargin】 : 间隔距离 【double】", + "【color】 : 颜色 【Color】", + "【child】 : 孩子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart new file mode 100644 index 00000000..f0478b4e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomBottomAppBar extends StatefulWidget { + const CustomBottomAppBar({Key? key}) : super(key: key); + + @override + _CustomBottomAppBarState createState() => _CustomBottomAppBarState(); +} + +class _CustomBottomAppBarState extends State { + int _position = 0; + FloatingActionButtonLocation _location = + FloatingActionButtonLocation.centerDocked; + final Map iconsMap = { + "图鉴": Icons.home, + "动态": Icons.toys, + "喜欢": Icons.favorite, + "手册": Icons.class_, + }; + Color activeColor = Colors.blue.withAlpha(240); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: 180, + child: Scaffold( + backgroundColor: Colors.purple.withAlpha(22), + floatingActionButton: FloatingActionButton( + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + child: const Icon(Icons.add), + ), + bottomNavigationBar: _buildBottomAppBar(), + floatingActionButtonLocation: _location, + body: _buildContent(), + ), + ); + } + + Widget _buildBottomAppBar() { + return BottomAppBar( + elevation: 1, + shape: const CircularNotchedRectangle(), + notchMargin: 5, + color: Colors.red, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: info.asMap().keys.map((i) => _buildChild(i)).toList() + ..insertAll(isCenter ? 2 : 4, [const SizedBox(width: 30)])), + ); + } + + Container _buildContent() { + return Container( + alignment: Alignment.center, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + '当前页索引:$_position', + style: const TextStyle(color: Colors.blue, fontSize: 18), + ), + Switch( + value: isCenter, + onChanged: (v) { + setState(() { + _location = v + ? FloatingActionButtonLocation.centerDocked + : FloatingActionButtonLocation.endDocked; + }); + }), + ], + ), + ); + } + + List get info => iconsMap.keys.toList(); + + bool get isCenter => _location == FloatingActionButtonLocation.centerDocked; + + Widget _buildChild(int i) { + bool active = i == _position; + return Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: () => setState(() => _position = i), + child: Wrap( + direction: Axis.vertical, + alignment: WrapAlignment.center, + children: [ + Icon( + iconsMap[info[i]], + color: active ? activeColor : Colors.white, + size: 30, + ), + Text(info[i], + style: TextStyle( + color: active ? activeColor : Colors.white, fontSize: 14)), + ], + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..768c2371 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Untere Navigationsleiste", + "info": "Eine untere Navigationsleiste, die normalerweise am unteren Rand des Scaffold-Widgets verwendet wird. Kann Farben und Modi angeben, akzeptiert Klick-Rückrufe und kann mit PageView Seiteneffekte erzielen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomNavigationBar", + "desc": [ + "【currentIndex】 : Aktueller Index 【int】", + "【elevation】 : Schattentiefe 【double】", + "【type】 : Typ*2 【BottomNavigationBarType】", + "【fixedColor】 : Farbe, wenn type fix ist 【Color】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【iconSize】 : Symbolgröße 【double】", + "【selectedLabelStyle】 : Stil des ausgewählten Textes 【TextStyle】", + "【unselectedLabelStyle】 : Stil des nicht ausgewählten Textes 【TextStyle】", + "【showUnselectedLabels】 : Nicht ausgewählte Labels anzeigen 【bool】", + "【showSelectedLabels】 : Ausgewählte Labels anzeigen 【bool】", + "【items】 : Elemente 【List】", + "【onTap】 : Klick-Ereignis 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Kann mit PageView für Seitenwechsel kombiniert werden", + "desc": [ + "Verwenden Sie den Controller beim onTap für den Seitenwechsel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json new file mode 100644 index 00000000..1c7aba5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Bottom Navigation", + "info": "A bottom navigation bar, usually used at the bottom of the Scaffold component, can specify colors and modes, accepts click callbacks, and can achieve page switching effects with PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomNavigationBar", + "desc": [ + "【currentIndex】 : Current index 【int】", + "【elevation】 : Shadow depth 【double】", + "【type】 : Type*2 【BottomNavigationBarType】", + "【fixedColor】 : Color when type is fix 【Color】", + "【backgroundColor】 : Background color 【Color】", + "【iconSize】 : Icon size 【double】", + "【selectedLabelStyle】 : Selected text style 【TextStyle】", + "【unselectedLabelStyle】 : Unselected text style 【TextStyle】", + "【showUnselectedLabels】 : Show unselected labels 【bool】", + "【showSelectedLabels】 : Show selected labels 【bool】", + "【items】 : Items 【List】", + "【onTap】 : Click event 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Page Switching with PageView", + "desc": [ + "Use the controller for page switching during onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..18116112 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Barra de navegación inferior", + "info": "Una barra de navegación inferior, generalmente utilizada en la parte inferior del componente Scaffold, puede especificar colores y modos, acepta devoluciones de llamada de clics y puede lograr efectos de cambio de página con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BottomNavigationBar", + "desc": [ + "【currentIndex】 : Índice actual 【int】", + "【elevation】 : Profundidad de sombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Color cuando el tipo es fix 【Color】", + "【backgroundColor】 : Color de fondo 【Color】", + "【iconSize】 : Tamaño del ícono 【double】", + "【selectedLabelStyle】 : Estilo del texto seleccionado 【TextStyle】", + "【unselectedLabelStyle】 : Estilo del texto no seleccionado 【TextStyle】", + "【showUnselectedLabels】 : Mostrar etiquetas no seleccionadas 【bool】", + "【showSelectedLabels】 : Mostrar etiquetas seleccionadas 【bool】", + "【items】 : Elementos 【List】", + "【onTap】 : Evento de clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Se puede combinar con PageView para cambiar de página", + "desc": [ + "Usar el controlador para cambiar de página durante onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..db97216b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Navigation inférieure", + "info": "Une barre de navigation inférieure, généralement utilisée au bas du composant Scaffold, peut spécifier la couleur et le mode, accepte un rappel de clic et peut réaliser un effet de changement de page avec PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomNavigationBar", + "desc": [ + "【currentIndex】 : Index actuel 【int】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【type】 : Type*2 【BottomNavigationBarType】", + "【fixedColor】 : Couleur lorsque le type est fixe 【Color】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【iconSize】 : Taille de l'icône 【double】", + "【selectedLabelStyle】 : Style du texte sélectionné 【TextStyle】", + "【unselectedLabelStyle】 : Style du texte non sélectionné 【TextStyle】", + "【showUnselectedLabels】 : Afficher les étiquettes non sélectionnées 【bool】", + "【showSelectedLabels】 : Afficher les étiquettes sélectionnées 【bool】", + "【items】 : Éléments 【List】", + "【onTap】 : Événement de clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Peut être combiné avec PageView pour changer de page", + "desc": [ + "Utiliser le contrôleur pour changer de page lors de onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..d7cc293f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Barra di navigazione inferiore", + "info": "Una barra di navigazione inferiore, solitamente utilizzata nella parte inferiore del componente Scaffold, può specificare colore e modalità, accetta callback di clic e può realizzare l'effetto di cambio pagina con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di BottomNavigationBar", + "desc": [ + "【currentIndex】 : Indice corrente 【int】", + "【elevation】 : Profondità dell'ombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Colore quando il tipo è fix 【Color】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【selectedLabelStyle】 : Stile del testo selezionato 【TextStyle】", + "【unselectedLabelStyle】 : Stile del testo non selezionato 【TextStyle】", + "【showUnselectedLabels】 : Mostra etichette non selezionate 【bool】", + "【showSelectedLabels】 : Mostra etichette selezionate 【bool】", + "【items】 : Voci 【List】", + "【onTap】 : Evento di clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Può essere combinato con PageView per il cambio pagina", + "desc": [ + "Utilizza il controller per il cambio pagina durante onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..c9b5e946 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "ボトムナビゲーション", + "info": "ボトムナビゲーションバーは、通常Scaffoldコンポーネントの下部に使用され、色やモードを指定でき、クリックコールバックを受け取り、PageViewと組み合わせてページ切り替え効果を実現できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBarの基本使用", + "desc": [ + "【currentIndex】 : 現在のインデックス 【int】", + "【elevation】 : 影の深さ 【double】", + "【type】 : タイプ*2 【BottomNavigationBarType】", + "【fixedColor】 : typeがfixの場合の色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【iconSize】 : アイコンサイズ 【double】", + "【selectedLabelStyle】 : 選択されたテキストスタイル 【TextStyle】", + "【unselectedLabelStyle】 : 選択されていないテキストスタイル 【TextStyle】", + "【showUnselectedLabels】 : 選択されていないラベルを表示 【bool】", + "【showSelectedLabels】 : 選択されたラベルを表示 【bool】", + "【items】 : アイテム 【List】", + "【onTap】 : クリックイベント 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "PageViewと組み合わせてページ切り替え", + "desc": [ + "onTap時にコントローラーを使用してページ切り替えを行う" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..40574e58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "하단 네비게이션", + "info": "하단 네비게이션 바는 일반적으로 Scaffold 컴포넌트의 하단에 사용되며, 색상과 모드를 지정할 수 있고, 클릭 콜백을 받으며, PageView와 함께 페이지 전환 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBar 기본 사용", + "desc": [ + "【currentIndex】 : 현재 인덱스 【int】", + "【elevation】 : 그림자 깊이 【double】", + "【type】 : 타입*2 【BottomNavigationBarType】", + "【fixedColor】 : type이 fix일 때의 색상 【Color】", + "【backgroundColor】 : 배경색 【Color】", + "【iconSize】 : 아이콘 크기 【double】", + "【selectedLabelStyle】 : 선택된 텍스트 스타일 【TextStyle】", + "【unselectedLabelStyle】 : 선택되지 않은 텍스트 스타일 【TextStyle】", + "【showUnselectedLabels】 : 선택되지 않은 라벨 표시 【bool】", + "【showSelectedLabels】 : 선택된 라벨 표시 【bool】", + "【items】 : 항목 【List】", + "【onTap】 : 클릭 이벤트 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "PageView와 함께 페이지 전환", + "desc": [ + "onTap 시 컨트롤러를 사용하여 페이지 전환" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..5a815723 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Navegação Inferior", + "info": "Uma barra de navegação inferior, normalmente usada na parte inferior de um componente Scaffold, pode especificar cores e modos, aceita callbacks de clique e pode ser usada com PageView para efeitos de mudança de página.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomNavigationBar", + "desc": [ + "【currentIndex】 : Índice atual 【int】", + "【elevation】 : Profundidade da sombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Cor quando o tipo é fixo 【Color】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【iconSize】 : Tamanho do ícone 【double】", + "【selectedLabelStyle】 : Estilo do texto selecionado 【TextStyle】", + "【unselectedLabelStyle】 : Estilo do texto não selecionado 【TextStyle】", + "【showUnselectedLabels】 : Mostrar etiquetas não selecionadas 【bool】", + "【showSelectedLabels】 : Mostrar etiquetas selecionadas 【bool】", + "【items】 : Itens 【List】", + "【onTap】 : Evento de clique 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Pode ser combinado com PageView para mudar de página", + "desc": [ + "Usar o controlador para mudar de página durante o onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..86f96093 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Нижняя навигация", + "info": "Нижняя панель навигации, обычно используется внизу компонента Scaffold, может задавать цвет и режим, принимает обратный вызов при нажатии, может реализовать эффект переключения страниц с PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomNavigationBar", + "desc": [ + "【currentIndex】 : текущий индекс 【int】", + "【elevation】 : глубина тени 【double】", + "【type】 : тип*2 【BottomNavigationBarType】", + "【fixedColor】 : цвет для типа fix 【Color】", + "【backgroundColor】 : цвет фона 【Color】", + "【iconSize】 : размер иконки 【double】", + "【selectedLabelStyle】 : стиль выбранного текста 【TextStyle】", + "【unselectedLabelStyle】 : стиль невыбранного текста 【TextStyle】", + "【showUnselectedLabels】 : показывать невыбранные метки 【bool】", + "【showSelectedLabels】 : показывать выбранные метки 【bool】", + "【items】 : элементы 【List】", + "【onTap】 : событие нажатия 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Можно использовать с PageView для переключения страниц", + "desc": [ + "Использовать контроллер для переключения страниц при onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..2582fb6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "底部导航", + "info": "一个底部导航栏,通常用于Scaffold组件的底部,可指定颜色和模式,接受点击回调,可与PageView实现切页效果。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBar基本使用", + "desc": [ + "【currentIndex】 : 当前索引 【int】", + "【elevation】 : 影深 【double】", + "【type】 : 类型*2 【BottomNavigationBarType】", + "【fixedColor】 : type为fix的颜色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【iconSize】 : 图标大小 【double】", + "【selectedLabelStyle】 : 选中文字样式 【TextStyle】", + "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】", + "【showUnselectedLabels】 : 显示未选中标签 【bool】", + "【showSelectedLabels】 : 显示选中标签 【bool】", + "【items】 : 条目 【List】", + "【onTap】 : 点击事件 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "可结合PageView进行切页", + "desc": [ + "在onTap时进行使用控制器进行切页" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart new file mode 100644 index 00000000..ca5caa22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-23 +/// contact me by email 1981462002@qq.com + +class CustomBottomNavigationBar extends StatefulWidget { + const CustomBottomNavigationBar({Key? key}) : super(key: key); + + @override + _CustomBottomNavigationBarState createState() => + _CustomBottomNavigationBarState(); +} + +class _CustomBottomNavigationBarState extends State { + int _position = 0; + BottomNavigationBarType _type = BottomNavigationBarType.shifting; + final Map iconsMap = { //底栏图标 + "图鉴": Icons.home, "动态": Icons.toys, + "喜欢": Icons.favorite, "手册": Icons.class_, + "我的": Icons.account_circle, + }; + final List _colors = [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.purple, + ]; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + _buildOp(), + _buildBottomNavigationBar(), + ], + ); + } + + bool get isShifting => _type == BottomNavigationBarType.shifting; + + BottomNavigationBar _buildBottomNavigationBar() { + return BottomNavigationBar( + onTap: (position) => setState(() => _position = position), + currentIndex: _position, + elevation: 1, + type: _type, + fixedColor: isShifting ? Colors.white : _colors[_position], + backgroundColor: Colors.white, + iconSize: 25, + selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), + showUnselectedLabels: false, + showSelectedLabels: true, + items: iconsMap.keys + .map((key) => BottomNavigationBarItem( + label:key, + icon: Icon(iconsMap[key]), + backgroundColor: _colors[_position])) + .toList(), + ); + } + + Widget _buildOp() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + _type.toString(), + style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.blue), + ), + Switch( + value: _type == BottomNavigationBarType.shifting, + onChanged: (b) { + setState(() => _type = b + ? BottomNavigationBarType.shifting + : BottomNavigationBarType.fixed); + }), + ], + ); + } +} diff --git a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart similarity index 92% rename from packages/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart rename to modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart index c1b4e46c..e3b0ba15 100644 --- a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 60, -// "name": '可结合PageView进行切页', -// "priority": 2, -// "subtitle": -// "在onTap时进行使用控制器进行切页", -// } + class BottomNavigationBarWithPageView extends StatefulWidget { const BottomNavigationBarWithPageView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json new file mode 100644 index 00000000..05061a64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Karussellansicht", + "info": "Eine Karussell-Komponente, die den Material Design-Richtlinien entspricht. Zeigt eine scrollbare Liste von Elementen an, wobei jedes Element basierend auf dem ausgewählten Layout dynamisch angepasst werden kann.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CarouselView", + "desc": [ + "【itemExtent】 : Erzwungene Größe in der Hauptachse 【double】", + "【shrinkExtent】: Minimale Größe des Elements in der Hauptachse während des Scrollens 【double】", + "【scrollDirection】 : Scrollrichtung 【Axis?】", + "【children】: Liste der Unterkomponenten 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Stilkonfiguration von CarouselView", + "desc": [ + "【padding】 : Innenabstand 【EdgeInsets? 】", + "【backgroundColor】 : Hintergrundfarbe 【Color? 】", + "【elevation】 : Schattentiefe 【double?】", + "【shape】 : Form 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Umgekehrtes Scrollen 【bool】", + "【onTap】 : Klick-Ereignis 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json new file mode 100644 index 00000000..714743fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Carousel View", + "info": "A carousel component that conforms to Material Design specifications. Displays a scrollable list of items, each of which can dynamically resize based on the selected layout.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView Basic Usage", + "desc": [ + "【itemExtent】 : Forced size in the main axis direction 【double】", + "【shrinkExtent】: Minimum size of the item in the main axis direction during scrolling 【double】", + "【scrollDirection】 : Scroll axis direction 【Axis?】", + "【children】: List of child components 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView Style Configuration", + "desc": [ + "【padding】 : Padding 【EdgeInsets? 】", + "【backgroundColor】 : Background color 【Color? 】", + "【elevation】 : Shadow depth 【double?】", + "【shape】 : Shape 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【onTap】 : Click event 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json new file mode 100644 index 00000000..8d303b7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vista de Carrusel", + "info": "Un componente de carrusel que cumple con las especificaciones de Material Design. Muestra una lista de elementos desplazables, donde cada elemento puede ajustar dinámicamente su tamaño según el diseño seleccionado.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CarouselView", + "desc": [ + "【itemExtent】 : Tamaño forzado en la dirección del eje principal 【double】", + "【shrinkExtent】: Tamaño mínimo de los elementos en la dirección del eje principal durante el desplazamiento 【double】", + "【scrollDirection】 : Dirección del desplazamiento 【Axis?】", + "【children】: Lista de componentes hijos 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuración de estilo de CarouselView", + "desc": [ + "【padding】 : Relleno interno 【EdgeInsets? 】", + "【backgroundColor】 : Color de fondo 【Color? 】", + "【elevation】 : Profundidad de la sombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controlador 【CarouselController?】", + "【reverse】 : Desplazamiento inverso 【bool】", + "【onTap】 : Evento de clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json new file mode 100644 index 00000000..f780de40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vue Carrousel", + "info": "Un composant de carrousel conforme aux normes Material Design. Affiche une liste d'éléments défilables, chaque élément pouvant être redimensionné dynamiquement en fonction de la mise en page sélectionnée.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CarouselView", + "desc": [ + "【itemExtent】 : Taille forcée dans la direction de l'axe principal 【double】", + "【shrinkExtent】: Taille minimale des éléments dans la direction de l'axe principal pendant le défilement 【double】", + "【scrollDirection】 : Direction de défilement 【Axis?】", + "【children】: Liste des composants enfants 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuration du style de CarouselView", + "desc": [ + "【padding】 : Marge intérieure 【EdgeInsets? 】", + "【backgroundColor】 : Couleur de fond 【Color? 】", + "【elevation】 : Profondeur de l'ombre 【double?】", + "【shape】 : Forme 【ShapeBorder?】", + "【controller】 : Contrôleur 【CarouselController?】", + "【reverse】 : Défilement inversé 【bool】", + "【onTap】 : Événement de clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json new file mode 100644 index 00000000..554e0326 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vista Carosello", + "info": "Un componente carosello conforme alle specifiche di Material Design. Visualizza un elenco di elementi scorrevoli, ciascuno dei quali può ridimensionarsi dinamicamente in base al layout selezionato.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CarouselView", + "desc": [ + "【itemExtent】 : Dimensione forzata nella direzione principale 【double】", + "【shrinkExtent】: Dimensione minima dell'elemento nella direzione principale durante lo scorrimento 【double】", + "【scrollDirection】 : Direzione di scorrimento 【Axis?】", + "【children】: Lista dei componenti figli 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configurazione dello stile di CarouselView", + "desc": [ + "【padding】 : Spaziatura interna 【EdgeInsets? 】", + "【backgroundColor】 : Colore di sfondo 【Color? 】", + "【elevation】 : Profondità dell'ombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Scorrimento inverso 【bool】", + "【onTap】 : Evento di clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json new file mode 100644 index 00000000..12f3963b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "カルーセルビュー", + "info": "Material Design 仕様に準拠したカルーセルコンポーネント。スクロール可能な項目リストを表示し、各項目は選択されたレイアウトに基づいて動的にサイズを調整できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView 基本の使い方", + "desc": [ + "【itemExtent】 : 主軸方向の強制サイズ 【double】", + "【shrinkExtent】: スクロール中、主軸方向の項目の最小サイズ 【double】", + "【scrollDirection】 : スクロール軸方向 【Axis?】", + "【children】: 子コンポーネントリスト 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView スタイル設定", + "desc": [ + "【padding】 : パディング 【EdgeInsets? 】", + "【backgroundColor】 : 背景色 【Color? 】", + "【elevation】 : 影の深さ 【double?】", + "【shape】 : 形状 【ShapeBorder?】", + "【controller】 : コントローラー 【CarouselController?】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【onTap】 : クリックイベント 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json new file mode 100644 index 00000000..cb49905c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "캐러셀 뷰", + "info": "Material Design 규격에 부합하는 캐러셀 컴포넌트입니다. 스크롤 가능한 항목 목록을 표시하며, 각 항목은 선택된 레이아웃에 따라 동적으로 크기를 조정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView 기본 사용법", + "desc": [ + "【itemExtent】 : 주축 방향 강제 크기 【double】", + "【shrinkExtent】: 스크롤 중, 주축 방향 항목 최소 크기 【double】", + "【scrollDirection】 : 스크롤 방향 【Axis?】", + "【children】: 하위 컴포넌트 목록 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView 스타일 설정", + "desc": [ + "【padding】 : 안쪽 여백 【EdgeInsets? 】", + "【backgroundColor】 : 배경색 【Color? 】", + "【elevation】 : 그림자 깊이 【double?】", + "【shape】 : 모양 【ShapeBorder?】", + "【controller】 : 컨트롤러 【CarouselController?】", + "【reverse】 : 역방향 스크롤 여부 【bool】", + "【onTap】 : 클릭 이벤트 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json new file mode 100644 index 00000000..23c1508e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Visualização de Carrossel", + "info": "Um componente de carrossel que segue as especificações do Material Design. Exibe uma lista de itens roláveis, onde cada item pode ser redimensionado dinamicamente com base no layout selecionado.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CarouselView", + "desc": [ + "【itemExtent】 : Tamanho fixo na direção do eixo principal 【double】", + "【shrinkExtent】: Tamanho mínimo do item na direção do eixo principal durante o deslize 【double】", + "【scrollDirection】 : Direção do deslize 【Axis?】", + "【children】: Lista de componentes filhos 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuração de Estilo do CarouselView", + "desc": [ + "【padding】 : Preenchimento interno 【EdgeInsets? 】", + "【backgroundColor】 : Cor de fundo 【Color? 】", + "【elevation】 : Profundidade da sombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controlador 【CarouselController?】", + "【reverse】 : Deslize reverso 【bool】", + "【onTap】 : Evento de clique 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json new file mode 100644 index 00000000..d42e0100 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Карусель", + "info": "Карусельный компонент, соответствующий спецификациям Material Design. Отображает прокручиваемый список элементов, каждый из которых может динамически изменять размер в зависимости от выбранного макета.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CarouselView", + "desc": [ + "【itemExtent】 : Фиксированный размер по главной оси 【double】", + "【shrinkExtent】: Минимальный размер элемента по главной оси при прокрутке 【double】", + "【scrollDirection】 : Направление прокрутки 【Axis?】", + "【children】: Список дочерних элементов 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Настройка стиля CarouselView", + "desc": [ + "【padding】 : Внутренний отступ 【EdgeInsets? 】", + "【backgroundColor】 : Цвет фона 【Color? 】", + "【elevation】 : Глубина тени 【double?】", + "【shape】 : Форма 【ShapeBorder?】", + "【controller】 : Контроллер 【CarouselController?】", + "【reverse】 : Прокрутка в обратном направлении 【bool】", + "【onTap】 : Событие нажатия 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json new file mode 100644 index 00000000..f75e987c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "轮播视图", + "info": "一个符合 Material Design 规范的轮播组件。显示一个可滚动的项目列表,每条目都可以根据选定的布局动态调整大小。", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView 基础用法", + "desc": [ + "【itemExtent】 : 主轴方向强制尺寸 【double】", + "【shrinkExtent】: 滑动中,主轴方向条目最小尺寸 【double】", + "【scrollDirection】 : 滑动轴向 【Axis?】", + "【children】: 子组件列表 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView 样式配置", + "desc": [ + "【padding】 : 内边距 【EdgeInsets? 】", + "【backgroundColor】 : 背景色 【Color? 】", + "【elevation】 : 阴影深 【double?】", + "【shape】 : 形状 【ShapeBorder?】", + "【controller】 : 控制器 【CarouselController?】", + "【reverse】 : 是否反向滑动 【bool】", + "【onTap】 : 点击事件 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart new file mode 100644 index 00000000..158a3414 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart @@ -0,0 +1,54 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class CarouselNode1 extends StatefulWidget { + const CarouselNode1({super.key}); + + @override + State createState() => _CarouselNode1State(); +} + +class _CarouselNode1State extends State { + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 160), + child: CarouselView( + itemExtent: 260, + shrinkExtent: 160, + children: List.generate(20, (int index) { + return UncontainedLayoutCard(index: index, label: 'Item $index'); + }), + ), + ); + } +} + +class UncontainedLayoutCard extends StatelessWidget { + const UncontainedLayoutCard({ + super.key, + required this.index, + required this.label, + }); + + final int index; + final String label; + + @override + Widget build(BuildContext context) { + return ColoredBox( + color: Colors.primaries[index % Colors.primaries.length].withOpacity(0.5), + child: Center( + child: Text( + label, + style: const TextStyle(color: Colors.white, fontSize: 20), + overflow: TextOverflow.clip, + softWrap: false, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart new file mode 100644 index 00000000..6caabcbf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart @@ -0,0 +1,101 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class CarouselNode2 extends StatefulWidget { + const CarouselNode2({super.key}); + + @override + State createState() => _CarouselNode2State(); +} + +class _WidgetMeta { + final String name; + final String desc; + + _WidgetMeta(this.name, this.desc); +} + +class _CarouselNode2State extends State { + final List<_WidgetMeta> widgets = [ + _WidgetMeta('Container 容器组件', '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...'), + _WidgetMeta('Text 文字组件', '用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。'), + _WidgetMeta('Card 卡片组件', '基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。'), + _WidgetMeta('FlutterLogo Flutter图标', '用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。'), + _WidgetMeta('Banner 角标组件', '用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。'), + _WidgetMeta('Icon 图标组件', '用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但非常实用。'), + _WidgetMeta('ImageIcon 图形图标', '用于将一个图片变为纯色的组件。可指定大小、颜色。'), + _WidgetMeta('FadeInImage 淡入图片', '透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。'), + _WidgetMeta('CircleAvatar 圆形组件', '可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。'), + _WidgetMeta('Visibility 显隐组件', '控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。'), + ]; + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 64), + child: CarouselView( + backgroundColor: const Color(0xfff7f8fa), + itemExtent: 240, + // elevation: 1, + shrinkExtent: 240, + itemSnapping: true, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + children: widgets.map((e) => _WidgetDisplay(widget: e)).toList(), + ), + ); + } +} + +class _WidgetDisplay extends StatelessWidget { + const _WidgetDisplay({ + super.key, + required this.widget, + }); + + final _WidgetMeta widget; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 16, + height: 16, + margin: EdgeInsets.only(right: 6), + alignment: Alignment.center, + decoration: + BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(4)), + child: Text( + '热', + style: TextStyle(fontSize: 8, color: Colors.white, height: 1), + ), + ), + Text( + widget.name, + style: + const TextStyle(color: Colors.black, fontSize: 14, fontWeight: FontWeight.bold), + overflow: TextOverflow.clip, + softWrap: false, + ), + ], + ), + Text( + widget.desc, + style: const TextStyle(color: Colors.grey, fontSize: 12), + overflow: TextOverflow.clip, + softWrap: false, + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json new file mode 100644 index 00000000..e2ca253c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Checkbox", + "info": "Checkbox-Komponente, häufig für Konfigurationswechsel verwendet, kann Farben angeben, empfängt Statusänderungsrückrufe und kann auch einen dreistufigen Zustand angeben.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Checkbox", + "desc": [ + "【value】 : Ob ausgewählt 【double】", + "【checkColor】: Farbe des Häkchens ✔️, wenn ausgewählt 【Color】", + "【activeColor】: Farbe innerhalb des Rahmens, wenn ausgewählt 【Color】", + "【onChanged】: Ereignis bei Zustandsänderung 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Dreistufige Checkbox", + "desc": [ + "【tristate】 : Ob dreistufig 【double】", + " bei onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json new file mode 100644 index 00000000..c2413a9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Checkbox", + "info": "Checkbox component, commonly used for toggling configurations, can specify colors, receive state change callbacks, and can also specify tristate.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Checkbox", + "desc": [ + "【value】 : Whether it is selected 【double】", + "【checkColor】: Color of ✔️ when selected 【Color】", + "【activeColor】: Color inside the box when selected 【Color】", + "【onChanged】: State change event 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tristate of Checkbox", + "desc": [ + "【tristate】 : Whether it is tristate 【double】", + " when onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json new file mode 100644 index 00000000..5b500e89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Casilla de verificación", + "info": "Componente de casilla de verificación, comúnmente utilizado para alternar configuraciones, puede especificar colores, recibir devoluciones de llamada de cambios de estado, y también puede especificar tres estados.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Checkbox", + "desc": [ + "【value】 : Si está seleccionado 【double】", + "【checkColor】: Color de la marca ✔️ cuando está seleccionado 【Color】", + "【activeColor】: Color dentro del cuadro cuando está seleccionado 【Color】", + "【onChanged】: Evento de cambio de estado 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tres estados de Checkbox", + "desc": [ + "【tristate】 : Si tiene tres estados 【double】", + " en onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json new file mode 100644 index 00000000..5f996059 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Case à cocher", + "info": "Composant de case à cocher, souvent utilisé pour basculer les configurations, peut spécifier la couleur, recevoir un rappel de changement d'état, et peut également spécifier un état ternaire.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Checkbox", + "desc": [ + "【value】 : Est-ce sélectionné 【double】", + "【checkColor】: Couleur du ✔️gou lorsque sélectionné 【Color】", + "【activeColor】: Couleur à l'intérieur de la case lorsque sélectionné 【Color】", + "【onChanged】: Événement de changement d'état 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "État ternaire de Checkbox", + "desc": [ + "【tristate】 : Est-ce un état ternaire 【double】", + " lors de onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json new file mode 100644 index 00000000..26f3c698 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Casella di controllo", + "info": "Componente casella di controllo, comunemente utilizzato per l'alternanza delle configurazioni, può specificare il colore, ricevere callback di cambio di stato e può anche specificare tre stati.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base della casella di controllo", + "desc": [ + "【value】 : Se è selezionato 【double】", + "【checkColor】: Colore del segno di spunta quando selezionato 【Color】", + "【activeColor】: Colore all'interno del riquadro quando selezionato 【Color】", + "【onChanged】: Evento di cambio di stato 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tre stati della casella di controllo", + "desc": [ + "【tristate】 : Se è a tre stati 【double】", + " Quando onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json new file mode 100644 index 00000000..87d86739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "チェックボックス", + "info": "チェックボックスコンポーネントは、設定の切り替えによく使用され、色を指定でき、状態変化のコールバックを受け取り、三状態も指定できます。", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "チェックボックスの基本使用法", + "desc": [ + "【value】 : 選択されているかどうか 【double】", + "【checkColor】: 選択時の✔️チェックマークの色 【Color】", + "【activeColor】: 選択時のボックス内の色 【Color】", + "【onChanged】: 状態変更イベント 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "チェックボックスの三状態", + "desc": [ + "【tristate】 : 三状態かどうか 【double】", + " onChanged時," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json new file mode 100644 index 00000000..e6a3927b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "체크박스", + "info": "체크박스 컴포넌트는 설정 전환에 자주 사용되며, 색상을 지정할 수 있고, 상태 변경 콜백을 받을 수 있으며, 삼중 상태를 지정할 수도 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Checkbox 기본 사용법", + "desc": [ + "【value】 : 선택 여부 【double】", + "【checkColor】: 선택 시 ✔️ 체크 색상 【Color】", + "【activeColor】: 선택 시 상자 내부 색상 【Color】", + "【onChanged】: 상태 변경 이벤트 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Checkbox의 삼중 상태", + "desc": [ + "【tristate】 : 삼중 상태 여부 【double】", + " onChanged 시," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json new file mode 100644 index 00000000..4a7be755 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Caixa de verificação", + "info": "Componente de caixa de verificação, frequentemente usado para alternar configurações, pode especificar cores, receber retorno de chamada de alteração de estado e também pode especificar três estados.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Checkbox", + "desc": [ + "【value】 : se está selecionado 【double】", + "【checkColor】: cor do ✔️gou quando selecionado 【Color】", + "【activeColor】: cor dentro da caixa quando selecionado 【Color】", + "【onChanged】: evento de mudança de estado 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Três estados do Checkbox", + "desc": [ + "【tristate】 : se é de três estados 【double】", + " onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json new file mode 100644 index 00000000..f20275f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Флажок", + "info": "Компонент флажка, часто используется для переключения настроек, может быть указан цвет, принимает обратный вызов изменения состояния, также может быть указан трехсостояний.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Checkbox", + "desc": [ + "【value】 : Выбрано ли 【double】", + "【checkColor】: Цвет галочки при выборе 【Color】", + "【activeColor】: Цвет внутри рамки при выборе 【Color】", + "【onChanged】: Событие изменения состояния 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Трехсостояний Checkbox", + "desc": [ + "【tristate】 : Является ли трехсостояний 【double】", + " onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json new file mode 100644 index 00000000..7e0c96b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "复选框", + "info": "复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Checkbox基础用法", + "desc": [ + "【value】 : 是否选中 【double】", + "【checkColor】: 选中时✔️gou颜色 【Color】", + "【activeColor】: 选中时框内颜色 【Color】", + "【onChanged】: 状态改变事件 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Checkbox的三态", + "desc": [ + "【tristate】 : 是否是三态 【double】", + " onChanged时," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart new file mode 100644 index 00000000..70988aea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart @@ -0,0 +1,39 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class CustomCheckbox extends StatefulWidget { + const CustomCheckbox({Key? key}) : super(key: key); + + @override + _CustomCheckboxState createState() => _CustomCheckboxState(); +} + +class _CustomCheckboxState extends State { + bool _checked = false; + final List colors = [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: colors + .map((e) => Checkbox( + value: _checked, + checkColor: Colors.white, + activeColor: e, + onChanged: (bool? value) => + setState(() => _checked = value??false))) + .toList(), + ); + } +} + + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart new file mode 100644 index 00000000..e0d55bd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart @@ -0,0 +1,35 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TristateCheckBok extends StatefulWidget { + const TristateCheckBok({Key? key}) : super(key: key); + + @override + _TristateCheckBokState createState() => _TristateCheckBokState(); +} + +class _TristateCheckBokState extends State { + bool _checked = false; + final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green]; + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: colors + .map((e) => + Checkbox( + value: _checked, + tristate: true, + checkColor: Colors.white, + activeColor: e, + onChanged: (bool? value) { + print(value); + setState(() => _checked = value??false); + })) + .toList(), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json new file mode 100644 index 00000000..1e2eaed9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Rundes Fortschrittsanzeige", + "info": "Runde Fortschrittsanzeige, bei der Eigenschaften wie Farbe, Linienstärke, Fortschritt usw. angegeben werden können. Wenn der Wert null ist, dreht sie sich ununterbrochen.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CircularProgressIndicator", + "desc": [ + "【value】 : Fortschritt 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【valueColor】 : Fortschrittsfarbe 【Animation】", + "【strokeWidth】 : Linienstärke 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json new file mode 100644 index 00000000..69d3e60c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Circular Progress", + "info": "A circular progress display that can specify properties such as color, line width, and progress. It will keep rotating when value is null.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CircularProgressIndicator", + "desc": [ + "【value】 : Progress 【double】", + "【backgroundColor】 : Background Color 【Color】", + "【valueColor】 : Progress Color 【Animation】", + "【strokeWidth】 : Line Width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json new file mode 100644 index 00000000..028316bd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicador de progreso circular", + "info": "Muestra de progreso circular, se pueden especificar propiedades como color, ancho de línea, progreso, etc. Si el valor es nulo, girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CircularProgressIndicator", + "desc": [ + "【value】 : progreso 【double】", + "【backgroundColor】 : color de fondo 【Color】", + "【valueColor】 : color de progreso 【Animation】", + "【strokeWidth】 : ancho de línea 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json new file mode 100644 index 00000000..e2b75ebd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Progrès circulaire", + "info": "Affichage de progression circulaire, permettant de spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, la progression, etc. Lorsque la valeur est null, il tourne en continu.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CircularProgressIndicator", + "desc": [ + "【value】 : Progression 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【valueColor】 : Couleur de progression 【Animation】", + "【strokeWidth】 : Épaisseur de la ligne 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json new file mode 100644 index 00000000..52119102 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicatore di progresso circolare", + "info": "Visualizzazione del progresso circolare, con possibilità di specificare colore, larghezza della linea, progresso, ecc. Ruota continuamente quando il valore è null.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CircularProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【valueColor】 : Colore del progresso 【Animation】", + "【strokeWidth】 : Larghezza della linea 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json new file mode 100644 index 00000000..5da05787 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "円形の進捗", + "info": "円形の進捗表示、色、線幅、進捗などの属性を指定できます。valueがnullの場合、回転し続けます。", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicatorの基本使用", + "desc": [ + "【value】 : 進捗 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 進捗色 【Animation】", + "【strokeWidth】 : 線幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json new file mode 100644 index 00000000..130e986b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "원형 진행률", + "info": "원형 진행률 표시, 색상, 선 두께, 진행률 등 속성을 지정할 수 있습니다. value가 null일 경우 계속 회전합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicator 기본 사용", + "desc": [ + "【value】 : 진행률 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【valueColor】 : 진행률 색상 【Animation】", + "【strokeWidth】 : 선 두께 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json new file mode 100644 index 00000000..9f3c2822 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicador de Progresso Circular", + "info": "Exibição de progresso circular, pode especificar atributos como cor, largura da linha, progresso, etc. Quando o valor é nulo, ele gira continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CircularProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Cor de Fundo 【Color】", + "【valueColor】 : Cor do Progresso 【Animation】", + "【strokeWidth】 : Largura da Linha 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json new file mode 100644 index 00000000..2ce4fce9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Круговой индикатор прогресса", + "info": "Круговой индикатор прогресса, можно указать цвет, ширину линии, прогресс и другие свойства. Если значение value равно null, индикатор будет вращаться бесконечно.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CircularProgressIndicator", + "desc": [ + "【value】 : Прогресс 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【valueColor】 : Цвет прогресса 【Animation】", + "【strokeWidth】 : Ширина линии 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json new file mode 100644 index 00000000..eb7776e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "圆形进度", + "info": "圆形的进度显示,可指定颜色、线宽、进度等属性。value为null时会不停旋转。", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicator基本使用", + "desc": [ + "【value】 : 进度 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 进度颜色 【Animation】", + "【strokeWidth】 : 线宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart new file mode 100644 index 00000000..9a462969 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomCircularProgressIndicator extends StatefulWidget { + const CustomCircularProgressIndicator({Key? key}) : super(key: key); + + @override + _CustomCircularProgressIndicatorState createState() => + _CustomCircularProgressIndicatorState(); +} + +class _CustomCircularProgressIndicatorState + extends State { + + List data = [0.2,0.4,0.6,0.8,null]; + + @override + Widget build(BuildContext context) { + + return Wrap( + spacing: 10, + children:data.map((e)=>SizedBox( + width: 50, + height: 50, + child: CircularProgressIndicator( + value: e, + backgroundColor: Colors.grey.withAlpha(33), + valueColor: const AlwaysStoppedAnimation(Colors.orange), + strokeWidth: 5, + ), + )).toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json new file mode 100644 index 00000000..6830a170 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS-Indikator", + "info": "iOS-stilisiertes Ladeanzeige-Widget, kann Radius und Drehung angeben.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActivityIndicator", + "desc": [ + "【animating】 : Ob Ladeanimation aktiviert ist 【bool】", + "【radius】 : Radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json new file mode 100644 index 00000000..f126511f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS Indicator", + "info": "iOS style loading display component, can specify radius and whether to rotate.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActivityIndicator", + "desc": [ + "【animating】 : Whether the loading animation is active 【bool】", + "【radius】 : Radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json new file mode 100644 index 00000000..4ddefe72 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicador de iOS", + "info": "Componente de visualización de carga con estilo iOS, que permite especificar el radio y si gira.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActivityIndicator", + "desc": [ + "【animating】 : Si la animación está cargando 【bool】", + "【radius】 : Radio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json new file mode 100644 index 00000000..4528f85e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicateur iOS", + "info": "Composant d'affichage de chargement de style iOS, peut spécifier le rayon et s'il tourne.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActivityIndicator", + "desc": [ + "【animating】 : Si l'animation de chargement est active 【bool】", + "【radius】 : Rayon 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json new file mode 100644 index 00000000..510c2e87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicatore iOS", + "info": "Componente di caricamento in stile iOS, può specificare il raggio e se ruotare.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActivityIndicator", + "desc": [ + "【animating】 : Se l'animazione di caricamento è attiva 【bool】", + "【radius】 : Raggio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json new file mode 100644 index 00000000..762661b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOSインジケーター", + "info": "iOSスタイルのローディング表示コンポーネントで、半径と回転の有無を指定できます。", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicatorの基本的な使用", + "desc": [ + "【animating】 : ローディングアニメーションの有無 【bool】", + "【radius】 : 半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json new file mode 100644 index 00000000..2dadbffe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS 인디케이터", + "info": "iOS 스타일의 로딩 표시 컴포넌트, 반지름 및 회전 여부를 지정할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicator 기본 사용", + "desc": [ + "【animating】 : 로딩 애니메이션 여부 【bool】", + "【radius】 : 반지름 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json new file mode 100644 index 00000000..38480d9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicador iOS", + "info": "Componente de exibição de carregamento no estilo iOS, pode especificar o raio e se deve girar.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActivityIndicator", + "desc": [ + "【animating】 : Se a animação de carregamento está ativa 【bool】", + "【radius】 : Raio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json new file mode 100644 index 00000000..5105df86 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Индикатор iOS", + "info": "Компонент отображения загрузки в стиле iOS, можно указать радиус и вращение.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActivityIndicator", + "desc": [ + "【animating】 : Анимация загрузки 【bool】", + "【radius】 : Радиус 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json new file mode 100644 index 00000000..afbc40be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS指示器", + "info": "iOS样式的loading显示组件,可指定半径和是否旋转。", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicator基本使用", + "desc": [ + "【animating】 : 是否loading动画 【bool】", + "【radius】 : 半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart new file mode 100644 index 00000000..29ccfb86 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/cupertino.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoActivityIndicator extends StatelessWidget { + const CustomCupertinoActivityIndicator({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + + return Wrap( + spacing: 20, + children: const [ + CupertinoActivityIndicator( + animating: true, + radius: 25, + ), + CupertinoActivityIndicator( + animating: false, + radius: 25, + ) + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json new file mode 100644 index 00000000..f342ac7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS-App", + "info": "Top-Level-Komponente für iOS-stil-Apps, enthält Eigenschaften wie Routen-Generator, Thema, Sprache, Startseite usw.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoApp", + "desc": [ + "【theme】 : Thema 【ThemeData】", + "【title】 : Taskleisten-Titel 【String】", + "【onGenerateRoute】 : Routen-Generator 【RouteFactory】", + "【home】 : Startseite 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json new file mode 100644 index 00000000..a3a5f423 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS App", + "info": "Top-level component for iOS-style apps, including route generator, theme, language, home page, and other attributes.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoApp", + "desc": [ + "【theme】 : Theme 【ThemeData】", + "【title】 : Taskbar Title 【String】", + "【onGenerateRoute】 : Route Generator 【RouteFactory】", + "【home】 : Home Page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json new file mode 100644 index 00000000..761bbe64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Aplicación iOS", + "info": "Componente de nivel superior para aplicaciones con estilo iOS, que incluye generador de rutas, tema, idioma, página de inicio, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título de la barra de tareas 【String】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【home】 : Página de inicio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json new file mode 100644 index 00000000..85ce4672 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Application iOS", + "info": "Composant de haut niveau pour les applications de style iOS, incluant un générateur de routes, un thème, une langue, une page d'accueil, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoApp", + "desc": [ + "【theme】 : Thème 【ThemeData】", + "【title】 : Titre de la barre des tâches 【String】", + "【onGenerateRoute】 : Générateur de routes 【RouteFactory】", + "【home】 : Page d'accueil 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json new file mode 100644 index 00000000..76516eeb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "App iOS", + "info": "Componente di alto livello per applicazioni in stile iOS, include generatore di rotte, tema, lingua, home page e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Titolo della barra delle applicazioni 【String】", + "【onGenerateRoute】 : Generatore di rotte 【RouteFactory】", + "【home】 : Home page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json new file mode 100644 index 00000000..38fec145 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOSアプリ", + "info": "iOSスタイルのアプリのトップレベルコンポーネントで、ルートジェネレーター、テーマ、言語、ホームなどの属性を含みます。", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoAppの基本使用法", + "desc": [ + "【theme】 : テーマ 【ThemeData】", + "【title】 : タスクバータイトル 【String】", + "【onGenerateRoute】 : ルートジェネレーター 【RouteFactory】", + "【home】 : ホーム 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json new file mode 100644 index 00000000..aaa445e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS 앱", + "info": "iOS 스타일 앱의 최상위 컴포넌트로, 라우트 생성기, 테마, 언어, 홈페이지 등의 속성을 포함합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoApp 기본 사용법", + "desc": [ + "【theme】 : 테마 【ThemeData】", + "【title】 : 작업 표시줄 제목 【String】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【home】 : 홈페이지 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json new file mode 100644 index 00000000..145e285f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Aplicação iOS", + "info": "Componente de topo para aplicações de estilo iOS, incluindo gerador de rotas, tema, idioma, página inicial, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título da barra de tarefas 【String】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【home】 : Página inicial 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json new file mode 100644 index 00000000..96c62ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS приложение", + "info": "Верхнеуровневый компонент для приложений в стиле iOS, включающий генератор маршрутов, темы, язык, домашнюю страницу и другие атрибуты.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoApp", + "desc": [ + "【theme】 : Тема 【ThemeData】", + "【title】 : Заголовок в панели задач 【String】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【home】 : Домашняя страница 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json new file mode 100644 index 00000000..7cff756f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS应用", + "info": "iOS风格应用的顶级组件,包含路由生成器、主题、语言、主页等属性。", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoApp基本用法", + "desc": [ + "【theme】 : 主题 【ThemeData】", + "【title】 : 任务栏标题 【String】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【home】 : 主页 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart new file mode 100644 index 00000000..cf3ffb9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart @@ -0,0 +1,39 @@ +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020-03-17 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoApp extends StatelessWidget { + const CustomCupertinoApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 200, + child: const CupertinoApp( + title: 'Flutter Demo', + theme: CupertinoThemeData( + primaryColor: CupertinoColors.white, + ), + home: CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + leading: Icon( + CupertinoIcons.reply, + color: CupertinoColors.black, + ), + trailing: Icon( + CupertinoIcons.share, + color: CupertinoColors.black, + ), + middle: Text('Flutter Unit'), + ), + backgroundColor: CupertinoColors.systemBackground, + child: Center( + child: Text('Hello, World!'), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json new file mode 100644 index 00000000..b5c3e3e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS-Schaltfläche", + "info": "iOS-stilige Schaltfläche. Kann Farbe, Transparenz beim Klicken, Innenabstand, abgerundete Ecken usw. festlegen. Kann Klickereignisse empfangen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton Klickereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【pressedOpacity】: Transparenz beim Drücken 【double】", + "【child】: Kind-Widget 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【borderRadius】: Radius der abgerundeten Ecken 【BorderRadius】", + "【onPressed】: Klickereignis 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json new file mode 100644 index 00000000..7641c471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS Button", + "info": "A button with iOS style. You can specify color, opacity when pressed, padding, border radius, etc. It can receive click events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【pressedOpacity】: Opacity when pressed 【double】", + "【child】: Child widget 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderRadius】: Border radius 【BorderRadius】", + "【onPressed】: Click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json new file mode 100644 index 00000000..1299f825 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Botón de iOS", + "info": "Botón con estilo iOS. Se puede especificar el color, la opacidad al hacer clic, el relleno interno, el radio de las esquinas, etc. Puede recibir eventos de clic.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de CupertinoButton", + "desc": [ + "【color】: Color 【Color】", + "【pressedOpacity】: Opacidad al presionar 【double】", + "【child】: Componente hijo 【Widget】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【borderRadius】: Radio de las esquinas 【BorderRadius】", + "【onPressed】: Evento de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json new file mode 100644 index 00000000..27faffb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Bouton iOS", + "info": "Bouton de style iOS. Peut spécifier la couleur, l'opacité lors du clic, le remplissage interne, les coins arrondis, etc. Peut recevoir des événements de clic.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic CupertinoButton", + "desc": [ + "【color】: Couleur 【Color】", + "【pressedOpacity】: Opacité lors de la pression 【double】", + "【child】: Composant enfant 【Widget】", + "【padding】: Remplissage interne 【EdgeInsetsGeometry】", + "【borderRadius】: Rayon des coins arrondis 【BorderRadius】", + "【onPressed】: Événement de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json new file mode 100644 index 00000000..dc95032a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Pulsante iOS", + "info": "Pulsante in stile iOS. Puoi specificare colore, opacità al click, padding, bordi arrotondati, ecc. Può ricevere eventi di click.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di click di CupertinoButton", + "desc": [ + "【color】: Colore 【Color】", + "【pressedOpacity】: Opacità quando premuto 【double】", + "【child】: Componente figlio 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderRadius】: Raggio del bordo arrotondato 【BorderRadius】", + "【onPressed】: Evento di click 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json new file mode 100644 index 00000000..567eccc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOSボタン", + "info": "iOSスタイルのボタン。色、クリック時の透明度、パディング、角丸などを指定できます。クリックイベントを受け取ることができます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【pressedOpacity】: 押下時の透明度 【double】", + "【child】: 子コンポーネント 【Widget】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【borderRadius】: 角丸半径 【BorderRadius】", + "【onPressed】: クリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json new file mode 100644 index 00000000..7d48b760 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS 버튼", + "info": "iOS 스타일의 버튼. 색상, 클릭 시 투명도, 내부 여백, 모서리 반경 등을 지정할 수 있습니다. 클릭 이벤트를 수신할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【pressedOpacity】: 눌렀을 때 투명도 【double】", + "【child】: 자식 위젯 【Widget】", + "【padding】: 내부 여백 【EdgeInsetsGeometry】", + "【borderRadius】: 모서리 반경 【BorderRadius】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json new file mode 100644 index 00000000..636a8701 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Botão iOS", + "info": "Botão de estilo iOS. Pode especificar cor, opacidade ao clicar, preenchimento interno, bordas arredondadas, etc. Pode receber eventos de clique.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do CupertinoButton", + "desc": [ + "【color】: Cor 【Color】", + "【pressedOpacity】: Opacidade ao pressionar 【double】", + "【child】: Componente filho 【Widget】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【borderRadius】: Raio da borda arredondada 【BorderRadius】", + "【onPressed】: Evento de clique 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json new file mode 100644 index 00000000..80bdb35f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Кнопка iOS", + "info": "Кнопка в стиле iOS. Можно указать цвет, прозрачность при нажатии, внутренние отступы, радиус скругления и т.д. Может принимать события нажатия.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия CupertinoButton", + "desc": [ + "【color】: Цвет 【Color】", + "【pressedOpacity】: Прозрачность при нажатии 【double】", + "【child】: Дочерний виджет 【Widget】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【borderRadius】: Радиус скругления 【BorderRadius】", + "【onPressed】: Событие нажатия 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json new file mode 100644 index 00000000..97b0cf66 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS按钮", + "info": "iOS风格的按钮。可指定颜色、点击时透明度、内边距、圆角等。可接收点击事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【pressedOpacity】: 按下时透明度 【double】", + "【child】: 子组件 【Widget】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【borderRadius】: 圆角半径 【BorderRadius】", + "【onPressed】: 点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart new file mode 100644 index 00000000..7ddf6689 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart @@ -0,0 +1,32 @@ +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CustomCupertinoButton extends StatelessWidget { + const CustomCupertinoButton({super.key}); + + Map get data => { + CupertinoColors.activeBlue:4.0, + Colors.blue:6.0, + CupertinoColors.activeOrange:8.0, + }; + + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children:data.keys.map((e)=> CupertinoButton( + padding: EdgeInsets.zero, + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + color: e, + pressedOpacity: 0.4, + borderRadius: BorderRadius.all(Radius.circular(data[e]!)), + child: const Text("iOS"), + )).toList() + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json new file mode 100644 index 00000000..f9da14be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Checkbox·macOS-Stil", + "info": "Ein macOS-stilisiertes Checkbox, das drei Zustände unterstützt; bei der Verwendung müssen der Wert und die onChanged-Rückruffunktion bereitgestellt werden.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox Verwendung", + "desc": [ + "【value】 : Ob ausgewählt 【bool?】", + "【onChanged】 : Änderungsrückruf 【ValueChanged?】", + "【checkColor】 : Farbe des Häkchens bei Auswahl 【Color?】", + "【activeColor】 : Hintergrundfarbe bei Auswahl 【Color?】", + "【activeColor】 : Hintergrundfarbe bei Auswahl 【Color?】", + "【inactiveColor】 : Randfarbe/Hintergrundfarbe bei Inaktivität 【Color?】", + "Wenn onChanged null ist, bedeutet dies, dass es nicht verfügbar ist." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Drei Zustände", + "desc": [ + "【tristate】 : Ob der Dreizustand aktiviert ist 【bool】", + "Im Dreizustand ist der Wert null als -" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox Randlinie und Form", + "desc": [ + "【shape】 : Form 【OutlinedBorder?】", + "【side】 : Randlinie 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json new file mode 100644 index 00000000..94551595 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Checkbox·macOS Style", + "info": "A macOS-style checkbox that supports three states; requires providing a value and an onChanged callback function when used.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox Usage", + "desc": [ + "【value】: Whether it is selected 【bool?】", + "【onChanged】: Change callback 【ValueChanged?】", + "【checkColor】: Checkmark color when selected 【Color?】", + "【activeColor】: Background color when selected 【Color?】", + "【activeColor】: Background color when selected 【Color?】", + "【inactiveColor】: Border color when inactive/background color when disabled 【Color?】", + "When onChanged is null, it means it is disabled." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Three States", + "desc": [ + "【tristate】: Whether to enable three states 【bool】", + "In three states, the value is null for -" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox Border and Shape", + "desc": [ + "【shape】: Shape 【OutlinedBorder?】", + "【side】: Border 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json new file mode 100644 index 00000000..453a0995 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Casilla de verificación·Estilo macOS", + "info": "Una casilla de verificación con estilo macOS, compatible con tres estados; se debe proporcionar un valor value y una función de devolución de llamada onChanged al usarla.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de CupertinoCheckbox", + "desc": [ + "【value】 : Si está seleccionado 【bool?】", + "【onChanged】 : Función de devolución de llamada para cambios 【ValueChanged?】", + "【checkColor】 : Color de la marca de verificación cuando está seleccionado 【Color?】", + "【activeColor】 : Color de fondo cuando está seleccionado 【Color?】", + "【activeColor】 : Color de fondo cuando está seleccionado 【Color?】", + "【inactiveColor】 : Color de borde cuando no está activo/Color de fondo cuando no está disponible 【Color?】", + "Cuando onChanged es null, significa que no está disponible." + ] + }, + { + "file": "node2.dart", + "name": "Tres estados de CupertinoCheckbox", + "desc": [ + "【tristate】 : Si está habilitado el estado tristate 【bool】", + "En el estado tristate, el valor null representa -" + ] + }, + { + "file": "node3.dart", + "name": "Borde y forma de CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Borde 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json new file mode 100644 index 00000000..a94227ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Case à cocher·Style macOS", + "info": "Une case à cocher de style macOS, prenant en charge trois états ; nécessite de fournir une valeur value et une fonction de rappel onChanged lors de l'utilisation.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de CupertinoCheckbox", + "desc": [ + "【value】 : Est-ce sélectionné 【bool?】", + "【onChanged】 : Rappel de changement 【ValueChanged?】", + "【checkColor】 : Couleur de la coche √ lorsqu'elle est sélectionnée 【Color?】", + "【activeColor】 : Couleur de fond lorsqu'elle est sélectionnée 【Color?】", + "【activeColor】 : Couleur de fond lorsqu'elle est sélectionnée 【Color?】", + "【inactiveColor】 : Couleur de bordure/arrière-plan non activé 【Color?】", + "Lorsque onChanged est null, cela signifie qu'il est désactivé." + ] + }, + { + "file": "node2.dart", + "name": "Trois états de CupertinoCheckbox", + "desc": [ + "【tristate】 : Activer trois états 【bool】", + "En mode tristate, la valeur null représente -" + ] + }, + { + "file": "node3.dart", + "name": "Bordure et forme de CupertinoCheckbox", + "desc": [ + "【shape】 : Forme 【OutlinedBorder?】", + "【side】 : Bordure 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json new file mode 100644 index 00000000..9999264e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Casella di controllo·Stile macOS", + "info": "Una casella di controllo in stile macOS, supporta tre stati; richiede un valore value e una funzione di callback onChanged.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di CupertinoCheckbox", + "desc": [ + "【value】 : Se selezionato 【bool?】", + "【onChanged】 : Callback di modifica 【ValueChanged?】", + "【checkColor】 : Colore del segno di spunta quando selezionato 【Color?】", + "【activeColor】 : Colore di sfondo quando selezionato 【Color?】", + "【activeColor】 : Colore di sfondo quando selezionato 【Color?】", + "【inactiveColor】 : Colore del bordo/colore di sfondo non attivo 【Color?】", + "Quando onChanged è null, indica che non è utilizzabile." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox a tre stati", + "desc": [ + "【tristate】 : Se abilitare i tre stati 【bool】", + "In modalità tristate, il valore null rappresenta -" + ] + }, + { + "file": "node3.dart", + "name": "Bordo e forma di CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Bordo 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json new file mode 100644 index 00000000..3f66dfdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "チェックボックス・macOSスタイル", + "info": "macOSスタイルのチェックボックスで、三態をサポートしています。使用時にはvalue値とonChangedコールバック関数を提供する必要があります。", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 使用", + "desc": [ + "【value】 : 選択されているかどうか 【bool?】", + "【onChanged】 : 変更コールバック 【ValueChanged?】", + "【checkColor】 : 選択時の√色 【Color?】", + "【activeColor】 : 選択時の背景色 【Color?】", + "【activeColor】 : 選択時の背景色 【Color?】", + "【inactiveColor】 : 非アクティブ時の枠線色/無効な背景色 【Color?】", + "onChangedがnullの場合、無効であることを示します。" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 三態", + "desc": [ + "【tristate】 : 三態を有効にするかどうか 【bool】", + "三態の場合、値がnullの場合は - です" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 枠線と形状", + "desc": [ + "【shape】 : 形状 【OutlinedBorder?】", + "【side】 : 枠線 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json new file mode 100644 index 00000000..8d70a6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "체크박스·macOS 스타일", + "info": "macOS 스타일의 체크박스로, 3가지 상태를 지원합니다. 사용 시 value 값과 onChanged 콜백 함수를 제공해야 합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 사용", + "desc": [ + "【value】 : 선택 여부 【bool?】", + "【onChanged】 : 변경 콜백 【ValueChanged?】", + "【checkColor】 : 선택 시 √ 색상 【Color?】", + "【activeColor】 : 선택 배경 색상 【Color?】", + "【activeColor】 : 선택 배경 색상 【Color?】", + "【inactiveColor】 : 비활성 시 테두리 색상/사용 불가 배경 색상 【Color?】", + "onChanged이 null일 경우, 사용 불가를 나타냅니다." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 3가지 상태", + "desc": [ + "【tristate】 : 3가지 상태 활성화 여부 【bool】", + "3가지 상태일 때, 값이 null이면 -로 표시됩니다." + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 테두리와 모양", + "desc": [ + "【shape】 : 모양 【OutlinedBorder?】", + "【side】 : 테두리 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json new file mode 100644 index 00000000..28c44467 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Caixa de verificação - Estilo macOS", + "info": "Uma caixa de verificação no estilo macOS, suporta três estados; ao usar, é necessário fornecer o valor 'value' e a função de retorno 'onChanged'.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do CupertinoCheckbox", + "desc": [ + "【value】 : Se está selecionado 【bool?】", + "【onChanged】 : Retorno de chamada de mudança 【ValueChanged?】", + "【checkColor】 : Cor do √ quando selecionado 【Color?】", + "【activeColor】 : Cor de fundo quando selecionado 【Color?】", + "【activeColor】 : Cor de fundo quando selecionado 【Color?】", + "【inactiveColor】 : Cor da borda/Cor de fundo inativa 【Color?】", + "Quando onChanged é null, indica que está inativo." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Três Estados", + "desc": [ + "【tristate】 : Se ativa três estados 【bool】", + "Em três estados, o valor null representa -" + ] + }, + { + "file": "node3.dart", + "name": "Borda e Forma do CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Borda 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json new file mode 100644 index 00000000..f8374ba4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Флажок·стиль macOS", + "info": "Флажок в стиле macOS, поддерживающий три состояния; при использовании необходимо предоставить значение value и функцию обратного вызова onChanged.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование CupertinoCheckbox", + "desc": [ + "【value】 : Выбрано ли 【bool?】", + "【onChanged】 : Обратный вызов при изменении 【ValueChanged?】", + "【checkColor】 : Цвет галочки при выборе 【Color?】", + "【activeColor】 : Цвет фона при выборе 【Color?】", + "【activeColor】 : Цвет фона при выборе 【Color?】", + "【inactiveColor】 : Цвет границы/фона при неактивности 【Color?】", + "Когда onChanged равен null, это означает, что элемент недоступен." + ] + }, + { + "file": "node2.dart", + "name": "Три состояния CupertinoCheckbox", + "desc": [ + "【tristate】 : Включены ли три состояния 【bool】", + "В режиме три состояния значение null означает -" + ] + }, + { + "file": "node3.dart", + "name": "Границы и форма CupertinoCheckbox", + "desc": [ + "【shape】 : Форма 【OutlinedBorder?】", + "【side】 : Граница 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json new file mode 100644 index 00000000..205ecbe6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "复选框·macOS风格", + "info": "一个 macOS 风格的复选框,支持三态;使用时需要提供 value 值和 onChanged 回调函数。", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 使用", + "desc": [ + "【value】 : 是否选中 【bool?】", + "【onChanged】 : 变化回调 【ValueChanged?】", + "【checkColor】 : 选中时√颜色 【Color?】", + "【activeColor】 : 选中背景颜色 【Color?】", + "【activeColor】 : 选中背景颜色 【Color?】", + "【inactiveColor】 : 非激活是边线色/不可用背景色 【Color?】", + "onChanged 为 null 时,表示不可用。" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 三态", + "desc": [ + "【tristate】 : 是否启用三态 【bool】", + "三态时,值为 null 为 - " + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 边线与形状", + "desc": [ + "【shape】 : 形状 【OutlinedBorder?】", + "【side】 : 边线 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart new file mode 100644 index 00000000..fedab6fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart @@ -0,0 +1,45 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo1 extends StatefulWidget { + const CupertinoCheckboxDemo1({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo1State(); +} + +class _CupertinoCheckboxDemo1State extends State { + bool? _active = false; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + CupertinoCheckbox( + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + + CupertinoCheckbox( + value: _active, + checkColor: Colors.yellow, + activeColor: Colors.purple, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + value: true, + inactiveColor: Colors.black.withOpacity(0.2), + onChanged: null, + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart new file mode 100644 index 00000000..1f1167a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo2 extends StatefulWidget { + const CupertinoCheckboxDemo2({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo2State(); +} + +class _CupertinoCheckboxDemo2State extends State { + bool? _active = false; + + @override + Widget build(BuildContext context) { + return + CupertinoCheckbox( + value: _active, + tristate: true, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart new file mode 100644 index 00000000..7253583f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart @@ -0,0 +1,48 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo3 extends StatefulWidget { + const CupertinoCheckboxDemo3({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo3State(); +} + +class _CupertinoCheckboxDemo3State extends State { + bool? _active = false; + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + CupertinoCheckbox( + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + side: const BorderSide(color: Colors.black12), + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + shape: const StadiumBorder(), + side: const BorderSide(color: Colors.black12), + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json new file mode 100644 index 00000000..8f7ce548 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iOS-Popup-Menü", + "info": "Ein beeindruckendes iOS-stilisiertes Popup-Menü, das bei langem Drücken animiert erscheint. Wird oft in Verbindung mit CupertinoContextMenuAction verwendet.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoContextMenu", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【actions】 : Aktionen-Komponentensammlung 【List】", + "【previewBuilder】 : Animationskonstruktor 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json new file mode 100644 index 00000000..cd760b19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iOS Pop-up Menu", + "info": "A gorgeous iOS-style button pop-up box. When long-pressed, a menu panel will pop up in an animated form. It is usually used in conjunction with CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoContextMenu", + "desc": [ + "【child】 : Child Component 【Widget】", + "【actions】 : Action Components Set 【List】", + "【previewBuilder】 : Animation Builder 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json new file mode 100644 index 00000000..71410853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menú emergente de iOS", + "info": "Un impresionante botón de estilo iOS que muestra un panel de menú emergente con animación cuando se mantiene presionado, generalmente se usa junto con CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenu", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【actions】 : Conjunto de componentes de acción 【List】", + "【previewBuilder】 : Constructor de animación 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json new file mode 100644 index 00000000..5a4a4e82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu contextuel iOS", + "info": "Un magnifique bouton contextuel de style iOS, qui affiche un panneau de menu animé lors d'un appui long, généralement utilisé avec CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoContextMenu", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【actions】 : Ensemble de composants d'action 【List】", + "【previewBuilder】 : Constructeur d'animation 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json new file mode 100644 index 00000000..e89db3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu a comparsa iOS", + "info": "Un elegante menu a comparsa in stile iOS che appare con un'animazione quando viene premuto a lungo, solitamente utilizzato insieme a CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoContextMenu", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【actions】 : Insieme di componenti di azione 【List】", + "【previewBuilder】 : Costruttore di animazione 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json new file mode 100644 index 00000000..ea29dae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iosポップアップメニュー", + "info": "華やかなiOSスタイルのボタンポップアップです。長押しするとアニメーションでメニューパネルが表示され、通常はCupertinoContextMenuActionと一緒に使用されます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【actions】 : アクションコンポーネント集 【List】", + "【previewBuilder】 : アニメーションビルダー 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json new file mode 100644 index 00000000..34c13947 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios 팝업 메뉴", + "info": "화려한 iOS 스타일 버튼 팝업 상자로, 길게 누르면 애니메이션 형태로 메뉴 패널이 팝업됩니다. 일반적으로 CupertinoContextMenuAction와 함께 사용됩니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenu 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【actions】 : 액션 위젯 집합 【List】", + "【previewBuilder】 : 애니메이션 빌더 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json new file mode 100644 index 00000000..f69a9978 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu pop-up iOS", + "info": "Um botão de estilo iOS elegante que exibe um painel de menu com animação ao ser pressionado por um longo tempo, geralmente usado em conjunto com CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoContextMenu", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【actions】 : Conjunto de componentes de ação 【List】", + "【previewBuilder】 : Construtor de animação 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json new file mode 100644 index 00000000..e12d61c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios всплывающее меню", + "info": "Эффективное всплывающее меню в стиле iOS, которое появляется с анимацией при длительном нажатии, обычно используется вместе с CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoContextMenu", + "desc": [ + "【child】 : дочерний компонент 【Widget】", + "【actions】 : набор компонентов действий 【List】", + "【previewBuilder】 : конструктор анимации 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json new file mode 100644 index 00000000..ead54490 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios弹出菜单", + "info": "一个华丽的iOS风格按钮弹出框,长按时会以动画的形式弹出菜单面板,通常和CupertinoContextMenuAction联用。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenu基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【actions】 : 行为组件集 【List】", + "【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart new file mode 100644 index 00000000..2c1325b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoContextMenu extends StatelessWidget { + const CustomCupertinoContextMenu({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 100, + height: 100, + child: DecoratedBox( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/sabar_bar.webp'), + fit: BoxFit.cover), + borderRadius: BorderRadius.all(Radius.circular(50))), + child: _buildCupertinoContextMenu(context)), + ); + } + + final List info = const ['保存图片', '立刻呼叫', '添加到收藏夹']; + + Widget _buildCupertinoContextMenu(context) => CupertinoContextMenu( + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/sabar_bar.webp'), + fit: BoxFit.cover), + borderRadius: BorderRadius.all(Radius.circular(50))), + ), + actions: info + .map((e) => CupertinoContextMenuAction( + child: Center(child: Text(e)), + onPressed: () => Navigator.pop(context), + )) + .toList()); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json new file mode 100644 index 00000000..5de2763d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iOS-Popup-Menü-Schaltfläche", + "info": "Wird im Allgemeinen nur für die Klick-Schaltfläche in CupertinoContextMenu verwendet. Kann Kind- und Endsymbole angeben und empfängt Klick-Ereignisse.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoContextMenuAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【trailingIcon】 : Ende 【bool】", + "【onPressed】 : Klick-Ereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json new file mode 100644 index 00000000..4f631c36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iOS Popup Menu Button", + "info": "Generally used only for click buttons in CupertinoContextMenu. Can specify child and trailing icons, and receives click events.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoContextMenuAction", + "desc": [ + "【child】 : Child Component 【Widget】", + "【isDefaultAction】 : Whether it is the default action 【bool】", + "【trailingIcon】 : Trailing Icon 【bool】", + "【onPressed】 : Click Event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json new file mode 100644 index 00000000..f2d62182 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Botón de menú emergente de iOS", + "info": "Generalmente se usa solo para el botón de clic en CupertinoContextMenu. Se puede especificar el icono del hijo y el icono de la cola, y recibe el evento de clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【trailingIcon】 : Icono de cola 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json new file mode 100644 index 00000000..61ca09a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Bouton de menu contextuel iOS", + "info": "Généralement utilisé uniquement pour les boutons cliquables dans CupertinoContextMenu. Peut spécifier un enfant et une icône de fin, et reçoit les événements de clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoContextMenuAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce sélectionné par défaut 【bool】", + "【trailingIcon】 : Icône de fin 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json new file mode 100644 index 00000000..e08ede5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Pulsante del menu a comparsa iOS", + "info": "Generalmente utilizzato solo per i pulsanti di clic in CupertinoContextMenu. È possibile specificare l'icona del figlio e della coda, ricevere eventi di clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Se selezionato per default 【bool】", + "【trailingIcon】 : Coda 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json new file mode 100644 index 00000000..5a6c599a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iosポップアップメニューボタン", + "info": "通常、CupertinoContextMenu内のクリックボタンにのみ使用されます。子要素と末尾アイコンを指定でき、クリックイベントを受け取ります。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuActionの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【trailingIcon】 : 末尾アイコン 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json new file mode 100644 index 00000000..9999b523 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios 팝업 메뉴 버튼", + "info": "일반적으로 CupertinoContextMenu 내의 클릭 버튼에만 사용됩니다. 자식 및 꼬리 아이콘을 지정하고 클릭 이벤트를 수신할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuAction 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【trailingIcon】 : 꼬리 아이콘 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json new file mode 100644 index 00000000..89f34b48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Botão de menu pop-up iOS", + "info": "Geralmente usado apenas para botões de clique em CupertinoContextMenu. Pode especificar ícones de criança e cauda, e receber eventos de clique.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Selecionado por padrão 【bool】", + "【trailingIcon】 : Ícone de cauda 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json new file mode 100644 index 00000000..6fc6d61e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios всплывающее меню кнопка", + "info": "Обычно используется только для кнопки нажатия в CupertinoContextMenu. Можно указать дочерний элемент и значок в конце, принимает событие нажатия.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoContextMenuAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано ли по умолчанию 【bool】", + "【trailingIcon】 : Конечный значок 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json new file mode 100644 index 00000000..a510198e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios弹出菜单按钮", + "info": "一般只用于CupertinoContextMenu中的点击按钮。可指定孩子和尾部图标,接收点击事件。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【trailingIcon】 : 尾部 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart new file mode 100644 index 00000000..b2088273 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart @@ -0,0 +1,34 @@ +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +class CustomCupertinoContextMenuAction extends StatelessWidget { + const CustomCupertinoContextMenuAction({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: 200, + margin: const EdgeInsets.all(5), + child: CupertinoContextMenuAction( + trailingIcon: CupertinoIcons.settings, + isDefaultAction: true, + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + child: const Text('张风捷特烈')), + ), + Container( + width: 200, + margin: const EdgeInsets.all(5), + child: CupertinoContextMenuAction( + trailingIcon: CupertinoIcons.home, + isDefaultAction: false, + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + child: const Text('百里·巫缨')), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json new file mode 100644 index 00000000..89d30b76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS-Datumsauswahl", + "info": "Hochwertige Roll-Datumsauswahl, die den Auswahltyp, Datumsbereich usw. angeben kann und Datumsauswahlereignisse empfängt.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Anfangsdatum 【DateTime】", + "【minimumYear】 : Mindestjahr 【int】", + "【maximumYear】 : Höchstjahr 【int】", + "【onDateTimeChanged】 : Klick-Rückruf 【Function(DateTime)】", + "【minuteInterval】 : Minutenintervall 【int】", + "【use24hFormat】 : Ist 24-Stunden-Format 【bool】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【mode】 : Modus*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json new file mode 100644 index 00000000..eea93649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS Date Picker", + "info": "A high-end rolling date picker that allows you to specify the type of selection, date range, etc., and receive date selection events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Initial date 【DateTime】", + "【minimumYear】 : Minimum year 【int】", + "【maximumYear】 : Maximum year 【int】", + "【onDateTimeChanged】 : Click callback 【Function(DateTime)】", + "【minuteInterval】 : Minute interval 【int】", + "【use24hFormat】 : Whether it is 24-hour format 【bool】", + "【backgroundColor】 : Background color 【Color】", + "【mode】 : Mode*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json new file mode 100644 index 00000000..b6cb9f30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Selector de fecha de iOS", + "info": "Selector de fecha de desplazamiento de alta gama, que puede especificar el tipo de selección, el rango de fechas, etc., y recibir eventos de selección de fecha.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Fecha inicial 【DateTime】", + "【minimumYear】 : Año mínimo 【int】", + "【maximumYear】 : Año máximo 【int】", + "【onDateTimeChanged】 : Devolución de llamada al hacer clic 【Function(DateTime)】", + "【minuteInterval】 : Intervalo de minutos 【int】", + "【use24hFormat】 : Si es formato de 24 horas 【bool】", + "【backgroundColor】 : Color de fondo 【Color】", + "【mode】 : Modo*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json new file mode 100644 index 00000000..cfca4dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Sélecteur de date iOS", + "info": "Sélecteur de date élégant à défilement, permettant de spécifier le type de sélection, la plage de dates, etc., et de recevoir des événements de sélection de date.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Date initiale 【DateTime】", + "【minimumYear】 : Année minimale 【int】", + "【maximumYear】 : Année maximale 【int】", + "【onDateTimeChanged】 : Rappel au clic 【Function(DateTime)】", + "【minuteInterval】 : Intervalle des minutes 【int】", + "【use24hFormat】 : Format 24 heures 【bool】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【mode】 : Mode*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json new file mode 100644 index 00000000..02fdf730 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Selettore di data iOS", + "info": "Un selettore di data di alta qualità con scorrimento, che consente di specificare il tipo di selezione, l'intervallo di date, ecc., e riceve eventi di selezione della data.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Data iniziale 【DateTime】", + "【minimumYear】 : Anno minimo 【int】", + "【maximumYear】 : Anno massimo 【int】", + "【onDateTimeChanged】 : Callback al click 【Function(DateTime)】", + "【minuteInterval】 : Intervallo di minuti 【int】", + "【use24hFormat】 : Se è in formato 24 ore 【bool】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【mode】 : Modalità*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json new file mode 100644 index 00000000..6e5aedcf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS日付ピッカー", + "info": "高級感のあるスクロール日付ピッカーで、選択するタイプや日付範囲などを指定でき、日付選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePickerの基本使用", + "desc": [ + "【initialDateTime】 : 初期日付 【DateTime】", + "【minimumYear】 : 最小年 【int】", + "【maximumYear】 : 最大年 【int】", + "【onDateTimeChanged】 : クリックコールバック 【Function(DateTime)】", + "【minuteInterval】 : 分間隔 【int】", + "【use24hFormat】 : 24時間制かどうか 【bool】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : モード*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json new file mode 100644 index 00000000..a0b820e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS 날짜 선택기", + "info": "고급스러운 스크롤 날짜 선택기로, 선택 유형, 날짜 범위 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePicker 기본 사용", + "desc": [ + "【initialDateTime】 : 초기 날짜 【DateTime】", + "【minimumYear】 : 최소 연도 【int】", + "【maximumYear】 : 최대 연도 【int】", + "【onDateTimeChanged】 : 클릭 콜백 【Function(DateTime)】", + "【minuteInterval】 : 분 간격 【int】", + "【use24hFormat】 : 24시간 형식 여부 【bool】", + "【backgroundColor】 : 배경색 【Color】", + "【mode】 : 모드*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json new file mode 100644 index 00000000..761e0003 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Seletor de Data iOS", + "info": "Um seletor de data sofisticado com rolagem, que permite especificar o tipo de seleção, intervalo de datas, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Data inicial 【DateTime】", + "【minimumYear】 : Ano mínimo 【int】", + "【maximumYear】 : Ano máximo 【int】", + "【onDateTimeChanged】 : Callback de clique 【Function(DateTime)】", + "【minuteInterval】 : Intervalo de minutos 【int】", + "【use24hFormat】 : Se é formato de 24 horas 【bool】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【mode】 : Modo*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json new file mode 100644 index 00000000..8dea1b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS-выбор даты", + "info": "Стильный колесный выбор даты, который позволяет указать тип выбора, диапазон дат и т.д., получает событие выбора даты.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Начальная дата 【DateTime】", + "【minimumYear】 : Минимальный год 【int】", + "【maximumYear】 : Максимальный год 【int】", + "【onDateTimeChanged】 : Обратный вызов при нажатии 【Function(DateTime)】", + "【minuteInterval】 : Интервал минут 【int】", + "【use24hFormat】 : Используется ли 24-часовой формат 【bool】", + "【backgroundColor】 : Цвет фона 【Color】", + "【mode】 : Режим*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json new file mode 100644 index 00000000..fee41db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS日期选择器", + "info": "高大上的滑滚日期选择器,可指定选择的类型、日期范围等,接收日期选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePicker基本使用", + "desc": [ + "【initialDateTime】 : 初始日期 【DateTime】", + "【minimumYear】 : 最小年份 【int】", + "【maximumYear】 : 最大年份 【int】", + "【onDateTimeChanged】 : 点击回调 【Function(DateTime)】", + "【minuteInterval】 : 分钟间隔 【int】", + "【use24hFormat】 : 是否是24小时制 【bool】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : 模式*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart new file mode 100644 index 00000000..60cbd0cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart @@ -0,0 +1,67 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoDatePicker extends StatefulWidget { + const CustomCupertinoDatePicker({Key? key}) : super(key: key); + + @override + _CustomCupertinoDatePickerState createState() => + _CustomCupertinoDatePickerState(); +} + +class _CustomCupertinoDatePickerState extends State { + DateTime _date = DateTime.now(); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + '当前日期:${_date.toIso8601String()}', + style: const TextStyle(color: Colors.grey, fontSize: 16), + ), + _buildInfoTitle('CupertinoDatePickerMode.dateAndTime'), + buildPicker(CupertinoDatePickerMode.dateAndTime), + _buildInfoTitle('CupertinoDatePickerMode.date'), + buildPicker(CupertinoDatePickerMode.date), + _buildInfoTitle('CupertinoDatePickerMode.time'), + buildPicker(CupertinoDatePickerMode.time), + ], + ); + } + + Container buildPicker(CupertinoDatePickerMode mode) { + return Container( + margin: const EdgeInsets.all(10), + height: 150, + child: CupertinoDatePicker( + mode: mode, + initialDateTime: DateTime.now(), +// maximumDate: DateTime(2018,8,8), +// minimumDate: DateTime(2030,8,8), + minimumYear: 2018, + maximumYear: 2030, + use24hFormat: false, + minuteInterval: 1, + backgroundColor: CupertinoColors.white, + onDateTimeChanged: (date) { + print(date); + setState(() => _date = date); + }, + ), + ); + } + + Widget _buildInfoTitle(info){ + return Padding( + padding: const EdgeInsets.only(left: 20,top: 20,bottom: 5), + child: Text( + info, + style: const TextStyle(color: Colors.blue, fontSize: 16,fontWeight: FontWeight.bold), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..11528d25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS-Navigation", + "info": "Eine allgemeine Struktur für eine iOS-ähnliche Anwendungsleiste oben, die es ermöglicht, entsprechende Komponenten an bestimmten Stellen zu platzieren. Attribute wie Hintergrundfarbe, Abstände und Rahmen können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoNavigationBar", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【middle】: Mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【padding】: Innenabstand 【EdgeInsetsDirectional】", + "【border】: Rahmen 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json new file mode 100644 index 00000000..67150e6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS Navigation", + "info": "A general structure for an iOS-style app top bar, where corresponding components can be placed in specified areas. Attributes such as background color, spacing, and border can be specified.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoNavigationBar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【padding】: Padding 【EdgeInsetsDirectional】", + "【border】: Border 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..7e03967d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navegación iOS", + "info": "Una estructura común para la barra superior de aplicaciones con estilo iOS, donde se pueden colocar componentes correspondientes en las partes especificadas. Se pueden especificar propiedades como el color de fondo, el espaciado, el borde, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente derecho 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【padding】 : Relleno interno 【EdgeInsetsDirectional】", + "【border】 : Borde 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..18ffb31e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navigation iOS", + "info": "Une structure générique pour une barre supérieure d'application de style iOS, permettant de placer des composants correspondants dans des parties spécifiées. Peut spécifier des propriétés telles que la couleur de fond, l'espacement, la bordure, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoNavigationBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【middle】 : Composant central 【Widget】", + "【trailing】 : Composant de fin 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsDirectional】", + "【border】 : Bordure 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..d99005b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navigazione iOS", + "info": "Una struttura generica per una barra superiore di un'app in stile iOS, che consente di posizionare i componenti corrispondenti nelle aree specificate. È possibile specificare proprietà come il colore di sfondo, la spaziatura, il bordo, ecc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】 : Componente centrale 【Widget】", + "【trailing】 : Componente destro 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsDirectional】", + "【border】 : Bordo 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..c6b20cf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOSナビゲーション", + "info": "iOSスタイルのアプリトップバーの一般的な構造で、指定された部分に適切なコンポーネントを配置できます。背景色、間隔、ボーダーなどの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar基本使用法", + "desc": [ + "【leading】 : 左側のコンポーネント 【Widget】", + "【middle】 : 中央のコンポーネント 【Widget】", + "【trailing】 : 右側のコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : パディング 【EdgeInsetsDirectional】", + "【border】 : ボーダー 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..a51e2768 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS 네비게이션", + "info": "iOS 스타일의 앱 상단 바의 일반적인 구조로, 지정된 부분에 해당하는 컴포넌트를 배치할 수 있습니다. 배경색, 간격, 테두리 등 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】 : 중간 컴포넌트 【Widget】", + "【trailing】 : 오른쪽 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 내부 여백 【EdgeInsetsDirectional】", + "【border】 : 테두리 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..c7ccb911 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navegação iOS", + "info": "Uma estrutura genérica para uma barra superior de aplicativos no estilo iOS, onde é possível colocar componentes correspondentes em áreas especificadas. Pode-se especificar atributos como cor de fundo, espaçamento, borda, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente direito 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Margem interna 【EdgeInsetsDirectional】", + "【border】 : Borda 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..4b957476 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS навигация", + "info": "Универсальная структура для верхней панели приложения в стиле iOS, позволяющая размещать соответствующие компоненты в указанных местах. Можно указать такие свойства, как цвет фона, отступы, границы и т.д.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoNavigationBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】 : Центральный компонент 【Widget】", + "【trailing】 : Правый компонент 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренние отступы 【EdgeInsetsDirectional】", + "【border】 : Граница 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..a4c3cf06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS导航", + "info": "一个iOS风格的应用顶部栏的通用结构,可在指定的部位放置相应的组件。可指定背景色、间距、边线等属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar基本用法", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】 : 中间组件 【Widget】", + "【trailing】 : 尾部组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsDirectional】", + "【border】 : 边线 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart new file mode 100644 index 00000000..d0abec83 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoNavigationBar extends StatelessWidget { + const CustomCupertinoNavigationBar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoNavigationBar( + leading: const Icon( + CupertinoIcons.back, + size: 25, + color: Colors.blue, + ), + middle: const Text("风雪雅舍"), + trailing: Image.asset( + "assets/images/icon_head.webp", + width: 25.0, + height: 25.0, + ), + backgroundColor: const Color(0xfff1f1f1), + padding: const EdgeInsetsDirectional.only(start: 10,end: 20), + border: Border.all(color: Colors.transparent), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json new file mode 100644 index 00000000..99bcfa1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS-Seitengerüst", + "info": "iOS-stilisiertes Seitenlayout-Gerüst, das die Navigationsleiste oben und die Hintergrundfarbe der Seite festlegen kann.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoPageScaffold", + "desc": [ + "【child】 : Inhalt 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【navigationBar】 : Kopf 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json new file mode 100644 index 00000000..13b13ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS Page Scaffold", + "info": "iOS style page layout scaffold structure, can specify the top navigation bar and page background color.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoPageScaffold", + "desc": [ + "【child】 : Content 【Widget】", + "【backgroundColor】 : Background Color 【Color】", + "【navigationBar】 : Header 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json new file mode 100644 index 00000000..9cd2fb31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Estructura de andamio de página iOS", + "info": "Estructura de andamio de diseño de página estilo iOS, puede especificar la barra de navegación superior y el color de fondo de la página.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoPageScaffold", + "desc": [ + "【child】 : contenido 【Widget】", + "【backgroundColor】 : color de fondo 【Color】", + "【navigationBar】 : cabecera 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json new file mode 100644 index 00000000..919cd6c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Structure de base de page iOS", + "info": "Structure de base de mise en page de page de style iOS, permettant de spécifier la barre de navigation supérieure et la couleur de fond de la page.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoPageScaffold", + "desc": [ + "【child】 : contenu 【Widget】", + "【backgroundColor】 : couleur de fond 【Color】", + "【navigationBar】 : en-tête 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json new file mode 100644 index 00000000..41ade473 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Impalcatura della pagina iOS", + "info": "Struttura di impalcatura per layout di pagine in stile iOS, consente di specificare la barra di navigazione superiore e il colore di sfondo della pagina.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoPageScaffold", + "desc": [ + "【child】 : Contenuto 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【navigationBar】 : Testa 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json new file mode 100644 index 00000000..2c9c1ec7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOSページスキャフォールド", + "info": "iOSスタイルのページレイアウトスキャフォールド構造で、上部のナビゲーションバーとページの背景色を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold基本使用法", + "desc": [ + "【child】 : コンテンツ 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【navigationBar】 : ヘッダー 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json new file mode 100644 index 00000000..c20f6372 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS 페이지 스캐폴드", + "info": "iOS 스타일의 페이지 레이아웃 스캐폴드 구조로, 상단의 내비게이션 바와 페이지 배경색을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold 기본 사용법", + "desc": [ + "【child】 : 내용 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【navigationBar】 : 헤더 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json new file mode 100644 index 00000000..bcae3024 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Estrutura de Scaffold de Página iOS", + "info": "Estrutura de scaffold de layout de página no estilo iOS, que pode especificar a barra de navegação superior e a cor de fundo da página.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoPageScaffold", + "desc": [ + "【child】 : Conteúdo 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【navigationBar】 : Cabeçalho 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json new file mode 100644 index 00000000..4efe5996 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS страница каркас", + "info": "iOS-стиль макета страницы каркасной структуры, можно указать верхнюю навигационную панель и цвет фона страницы.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold базовое использование", + "desc": [ + "【child】 : содержимое 【Widget】", + "【backgroundColor】 : цвет фона 【Color】", + "【navigationBar】 : верхняя часть 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json new file mode 100644 index 00000000..1636363b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS页面脚手架", + "info": "iOS风格的页面布局脚手架结构,可指定顶部的导航栏和页面背景色。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold基本用法", + "desc": [ + "【child】 : 内容 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【navigationBar】 : 头部 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart new file mode 100644 index 00000000..d0950a29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoPageScaffold extends StatelessWidget { + const CustomCupertinoPageScaffold({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 300, + child: const CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + leading: Icon(CupertinoIcons.reply), + trailing: Icon(CupertinoIcons.share), + middle: Text('Flutter Unit'), + ), + backgroundColor: CupertinoColors.systemBackground, + child: Center( + child: Text('Hello, World!'), + ), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json new file mode 100644 index 00000000..2cde8206 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS-Auswahl", + "info": "Hochwertiger zylindrischer Schieberegler, äußerst raffiniert, kann viele Konfigurationsattribute angeben und empfängt ausgewählte Ereignisse beim Schieben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker Grundlegende Verwendung", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【offAxisFraction】 : Achsversatzrate 【double】", + "【squeeze】 : Quetschrate 【double】", + "【diameterRatio】 : Verhältnis von Höhe zu Zylinderdurchmesser 【double】", + "【itemExtent】 : Abstand 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【onSelectedItemChanged】 : Ausgewähltes Ereignis 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json new file mode 100644 index 00000000..440bae87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS Picker", + "info": "A high-end cylindrical sliding picker, very sophisticated, with many configurable attributes, and it receives the selected event when sliding.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoPicker", + "desc": [ + "【children】 : List of child components 【List】", + "【offAxisFraction】 : Axis offset rate 【double】", + "【squeeze】 : Squeeze rate 【double】", + "【diameterRatio】 : Ratio of height to cylinder diameter 【double】", + "【itemExtent】 : Spacing 【double】", + "【backgroundColor】 : Background color 【Color】", + "【onSelectedItemChanged】 : Selected event 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json new file mode 100644 index 00000000..24584447 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Selector iOS", + "info": "Selector de deslizamiento cilíndrico de alta gama, muy ingenioso, con muchas propiedades de configuración, recibe eventos de selección al deslizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoPicker", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【offAxisFraction】 : Tasa de desplazamiento del eje 【double】", + "【squeeze】 : Tasa de compresión 【double】", + "【diameterRatio】 : Relación entre la altura y el diámetro del cilindro 【double】", + "【itemExtent】 : Espaciado 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【onSelectedItemChanged】 : Evento de selección 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json new file mode 100644 index 00000000..fb1445e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Sélecteur iOS", + "info": "Un sélecteur cylindrique haut de gamme, très sophistiqué, avec de nombreuses propriétés configurables, recevant des événements de sélection lors du glissement.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoPicker", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【offAxisFraction】 : Taux de décalage de l'axe 【double】", + "【squeeze】 : Taux de compression 【double】", + "【diameterRatio】 : Rapport hauteur/diamètre du cylindre 【double】", + "【itemExtent】 : Espacement 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【onSelectedItemChanged】 : Événement de sélection 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json new file mode 100644 index 00000000..436b0ec2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Selettore iOS", + "info": "Un selettore a scorrimento cilindrico di alta gamma, estremamente sofisticato, con molte proprietà configurabili e in grado di ricevere eventi di selezione durante lo scorrimento.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoPicker", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【offAxisFraction】 : Frazione di offset dell'asse 【double】", + "【squeeze】 : Frazione di compressione 【double】", + "【diameterRatio】 : Rapporto tra altezza e diametro del cilindro 【double】", + "【itemExtent】 : Spaziatura 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【onSelectedItemChanged】 : Evento di selezione 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json new file mode 100644 index 00000000..c348d5fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOSピッカー", + "info": "高級感あふれる円柱スライドピッカーで、精巧で、多くの設定属性を指定でき、スライド時の選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPickerの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【offAxisFraction】 : 軸オフセット率 【double】", + "【squeeze】 : 圧縮率 【double】", + "【diameterRatio】 : 高さと円柱直径の比率 【double】", + "【itemExtent】 : 間隔 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【onSelectedItemChanged】 : 選択イベント 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json new file mode 100644 index 00000000..64c6fc06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS 선택기", + "info": "고급스러운 원통형 슬라이드 선택기로, 정교하며 많은 설정 속성을 지정할 수 있고 슬라이드 시 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker 기본 사용법", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【offAxisFraction】 : 축 오프셋 비율 【double】", + "【squeeze】 : 압축 비율 【double】", + "【diameterRatio】 : 높이와 원통 직경 비율 【double】", + "【itemExtent】 : 간격 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【onSelectedItemChanged】 : 선택 이벤트 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json new file mode 100644 index 00000000..0d17c373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Seletor iOS", + "info": "Um seletor deslizante cilíndrico de alta classe, extremamente sofisticado, que permite especificar muitos atributos de configuração e recebe eventos de seleção ao deslizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoPicker", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【offAxisFraction】 : Taxa de desvio do eixo 【double】", + "【squeeze】 : Taxa de compressão 【double】", + "【diameterRatio】 : Razão entre altura e diâmetro do cilindro 【double】", + "【itemExtent】 : Espaçamento 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【onSelectedItemChanged】 : Evento de seleção 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json new file mode 100644 index 00000000..9cd80dc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS селектор", + "info": "Высококлассный цилиндрический слайдер-селектор, очень изысканный, может быть настроен с множеством свойств, принимает события при выборе во время скольжения.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoPicker", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【offAxisFraction】 : Коэффициент смещения оси 【double】", + "【squeeze】 : Коэффициент сжатия 【double】", + "【diameterRatio】 : Соотношение высоты к диаметру цилиндра 【double】", + "【itemExtent】 : Расстояние между элементами 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【onSelectedItemChanged】 : Событие выбора 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json new file mode 100644 index 00000000..f04bba12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS选择器", + "info": "高大上的柱面滑动选择器,精妙十足,可指定很多配置属性,接收滑动时选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【offAxisFraction】 : 轴偏移率 【double】", + "【squeeze】 : 挤压率 【double】", + "【diameterRatio】 : 高与圆柱直径比率 【double】", + "【itemExtent】 : 间距 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【onSelectedItemChanged】 : 选中事件 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart new file mode 100644 index 00000000..e00bb758 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart @@ -0,0 +1,39 @@ +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoPicker extends StatelessWidget { + const CustomCupertinoPicker({Key? key}) : super(key: key); + + final List names = const[ + 'Java', + 'Kotlin', + 'Dart', + 'Swift', + 'C++', + 'Python', + "JavaScript", + "PHP", + "Go", + "Object-c" + ]; + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 150, + child: CupertinoPicker( + backgroundColor: CupertinoColors.systemGrey.withAlpha(33), + diameterRatio: 1, + offAxisFraction: 0.4, + squeeze: 1.5, + itemExtent: 40, + onSelectedItemChanged: (position) { + print('当前条目 ${names[position]}'); + }, + children: names.map((e) => Center(child: Text(e))).toList()), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json new file mode 100644 index 00000000..2dbe2c6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Radio-Button im macOS-Stil", + "info": "Ein Radio-Button im macOS-Stil, dessen Auswahlstatus durch value und groupValue bestimmt wird; onChanged ist der Callback für Klickereignisse.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von CupertinoRadio", + "desc": [ + "【value】 : Wert des Radio-Buttons 【T】", + "【groupValue】 : Aktueller übereinstimmender Wert 【T】", + "【onChanged】 : Callback bei Änderung 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Farben von CupertinoRadio", + "desc": [ + "【activeColor】 : Hintergrundfarbe im aktiven Zustand 【Color?】", + "【fillColor】 : Füllfarbe 【Color?】", + "【inactiveColor】 : Hintergrundfarbe im inaktiven Zustand 【Color?】", + "【focusColor】 : Fokusfarbe 【Color?】", + "【mouseCursor】 : Mauszeigerstil 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Umschaltbarkeit", + "desc": [ + "【toggleable】 : Ist Umschaltbarkeit unterstützt 【bool】", + "toggleable ist standardmäßig false. Wenn es true ist, wird bei einem Klick auf den aktiven Radio-Button ein null-Wert zurückgegeben, um die Anforderungen für die Auswahl und Nichtauswahl zu unterstützen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json new file mode 100644 index 00000000..118f8635 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Radio Button·macOS Style", + "info": "A macOS-style radio button, where the value and groupValue together determine whether the radio button is selected; the onChanged callback handles click events.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio Usage", + "desc": [ + "【value】: Radio button value 【T】", + "【groupValue】: Current matching value 【T】", + "【onChanged】: Callback when changed 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio Colors", + "desc": [ + "【activeColor】: Active background color 【Color?】", + "【fillColor】: Fill color 【Color?】", + "【inactiveColor】: Inactive background color 【Color?】", + "【focusColor】: Focus color 【Color?】", + "【mouseCursor】: Mouse cursor style 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Toggle Support", + "desc": [ + "【toggleable】: Whether toggle is supported 【bool】", + "toggleable defaults to false. When set to true, clicking an active radio button will call back null data, supporting the need for toggling between selected and unselected states." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json new file mode 100644 index 00000000..fa288631 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Botón de opción estilo macOS", + "info": "Un botón de opción con estilo macOS, donde value y groupValue determinan si este botón de opción está seleccionado; onChanged es la devolución de llamada para el evento de clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de CupertinoRadio", + "desc": [ + "【value】: Valor del botón de opción 【T】", + "【groupValue】: Valor actual coincidente 【T】", + "【onChanged】: Devolución de llamada al cambiar 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Colores de CupertinoRadio", + "desc": [ + "【activeColor】: Color de fondo activo 【Color?】", + "【fillColor】: Relleno 【Color?】", + "【inactiveColor】: Color de fondo inactivo 【Color?】", + "【focusColor】: Color de enfoque 【Color?】", + "【mouseCursor】: Estilo del cursor del ratón 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Soporte de alternancia", + "desc": [ + "【toggleable】: Soporta alternancia 【bool】", + "toggleable es false por defecto, cuando es true, al hacer clic en un botón de opción activo, se devuelve un valor null, lo que permite satisfacer la necesidad de alternar entre seleccionado y no seleccionado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json new file mode 100644 index 00000000..f9705e37 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Bouton radio·style macOS", + "info": "Un bouton radio de style macOS, la valeur et groupValue déterminent ensemble si ce bouton radio est sélectionné; onChanged rappelle l'événement de clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de CupertinoRadio", + "desc": [ + "【value】 : Valeur du bouton radio 【T】", + "【groupValue】 : Valeur de correspondance actuelle 【T】", + "【onChanged】 : Rappel lors du changement 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Couleur de CupertinoRadio", + "desc": [ + "【activeColor】 : Couleur de fond active 【Color?】", + "【fillColor】 : Remplissage 【Color?】", + "【inactiveColor】 : Couleur de fond inactive 【Color?】", + "【focusColor】 : Couleur de focus 【Color?】", + "【mouseCursor】 : Style du curseur de la souris 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Prise en charge du basculement", + "desc": [ + "【toggleable】 : Prise en charge du basculement 【bool】", + "toggleable est par défaut false, lorsqu'il est true, cliquer sur le bouton radio actif rappellera des données null, répondant ainsi aux besoins de basculement entre sélection et non-sélection." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json new file mode 100644 index 00000000..dcccf7ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Pulsante di scelta·Stile macOS", + "info": "Un pulsante di scelta in stile macOS, value e groupValue determinano insieme se questo pulsante di scelta è selezionato; onChanged richiama l'evento di clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilizzo di CupertinoRadio", + "desc": [ + "【value】 : Valore del pulsante di scelta 【T】", + "【groupValue】 : Valore corrente corrispondente 【T】", + "【onChanged】 : Richiama quando cambia 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Colori di CupertinoRadio", + "desc": [ + "【activeColor】 : Colore di sfondo attivo 【Color?】", + "【fillColor】 : Riempimento 【Color?】", + "【inactiveColor】 : Colore di sfondo inattivo 【Color?】", + "【focusColor】 : Colore di messa a fuoco 【Color?】", + "【mouseCursor】 : Stile del puntatore del mouse 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Supporto per il passaggio", + "desc": [ + "【toggleable】 : Supporto per il passaggio 【bool】", + "toggleable è impostato su false per impostazione predefinita, quando è true, cliccando sul pulsante di scelta attivo, richiamerà i dati null, supportando così la necessità di passare tra selezionato e non selezionato." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json new file mode 100644 index 00000000..42f6cf60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "ラジオボタン·macOSスタイル", + "info": "macOSスタイルのラジオボタンで、valueとgroupValueによってこのラジオボタンが選択されているかどうかが決まります;onChangedはクリックイベントのコールバックです。", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 使用", + "desc": [ + "【value】 : ラジオボタンの値 【T】", + "【groupValue】 : 現在のマッチ値 【T】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 色", + "desc": [ + "【activeColor】 : アクティブな背景色 【Color?】", + "【fillColor】 : 塗りつぶし 【Color?】", + "【inactiveColor】 : 非アクティブな背景色 【Color?】", + "【focusColor】 : フォーカス色 【Color?】", + "【mouseCursor】 : マウスポインタのスタイル 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "切り替えサポート", + "desc": [ + "【toggleable】 : 切り替えサポート 【bool】", + "toggleableはデフォルトでfalseで、trueの場合、アクティブなラジオボタンをクリックするとnullデータがコールバックされ、選択と非選択の切り替えニーズをサポートします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json new file mode 100644 index 00000000..ce96904d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "라디오 버튼·macOS 스타일", + "info": "macOS 스타일의 라디오 버튼, value와 groupValue가 함께 이 라디오 버튼이 선택되었는지 여부를 결정합니다; onChanged는 클릭 이벤트를 콜백합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 사용", + "desc": [ + "【value】 : 라디오 버튼 값 【T】", + "【groupValue】 : 현재 매칭 값 【T】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 색상", + "desc": [ + "【activeColor】 : 활성 배경 색상 【Color?】", + "【fillColor】 : 채우기 【Color?】", + "【inactiveColor】 : 비활성 배경 색상 【Color?】", + "【focusColor】 : 포커스 색상 【Color?】", + "【mouseCursor】 : 마우스 커서 스타일 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "토글 지원 여부", + "desc": [ + "【toggleable】 : 토글 지원 여부 【bool】", + "toggleable은 기본적으로 false이며, true일 때 활성화된 라디오 버튼을 클릭하면 null 데이터를 콜백하여 선택 및 비선택 전환 요구를 지원합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json new file mode 100644 index 00000000..1e16f076 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Botão de Rádio·Estilo macOS", + "info": "Um botão de rádio no estilo macOS, onde value e groupValue determinam se o botão de rádio está selecionado; onChanged é o callback para o evento de clique.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do CupertinoRadio", + "desc": [ + "【value】 : Valor do botão de rádio 【T】", + "【groupValue】 : Valor correspondente atual 【T】", + "【onChanged】 : Callback de mudança 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Cores do CupertinoRadio", + "desc": [ + "【activeColor】 : Cor de fundo ativa 【Color?】", + "【fillColor】 : Preenchimento 【Color?】", + "【inactiveColor】 : Cor de fundo inativa 【Color?】", + "【focusColor】 : Cor de foco 【Color?】", + "【mouseCursor】 : Estilo do cursor do mouse 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Suporte a Alternância", + "desc": [ + "【toggleable】 : Suporta alternância 【bool】", + "toggleable é false por padrão, quando true, clicar no botão de rádio ativo retorna dados nulos, suportando a necessidade de alternar entre selecionado e não selecionado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json new file mode 100644 index 00000000..66cab929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Радиокнопка·macOS стиль", + "info": "Радиокнопка в стиле macOS, value и groupValue вместе определяют, выбрана ли эта радиокнопка; onChanged обратный вызов события клика.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование CupertinoRadio", + "desc": [ + "【value】 : Значение радиокнопки 【T】", + "【groupValue】 : Текущее совпадающее значение 【T】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Цвета CupertinoRadio", + "desc": [ + "【activeColor】 : Цвет активного фона 【Color?】", + "【fillColor】 : Заполнение 【Color?】", + "【inactiveColor】 : Цвет неактивного фона 【Color?】", + "【focusColor】 : Цвет фокуса 【Color?】", + "【mouseCursor】 : Стиль указателя мыши 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Поддержка переключения", + "desc": [ + "【toggleable】 : Поддержка переключения 【bool】", + "toggleable по умолчанию false, если true, при нажатии на активную радиокнопку будет возвращаться null, чтобы поддерживать переключение между выбором и отменой выбора." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json new file mode 100644 index 00000000..89fe1e0f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "单选钮·macOS风格", + "info": "一个 macOS 风格的选钮,value 和 groupValue 一起决定该单选按钮是否被选中; onChanged 回调点击事件。", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 使用", + "desc": [ + "【value】 : 选钮值 【T】", + "【groupValue】 : 当前匹配值 【T】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 颜色", + "desc": [ + "【activeColor】 : 激活背景颜色 【Color?】", + "【fillColor】 : 填充 【Color?】", + "【inactiveColor】 : 未激活背景颜色 【Color?】", + "【focusColor】 : 聚焦色 【Color?】", + "【mouseCursor】 : 鼠标指针样式 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "是否支持切换", + "desc": [ + "【toggleable】 : 是否支持切换 【bool】", + "toggleable 默认为 false, 为 true 时,点击激活的选钮,会回调 null 数据,以此支持选中和非选择切换需求。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart new file mode 100644 index 00000000..bfe2b26c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart @@ -0,0 +1,32 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoRadioDemo1 extends StatefulWidget { + const CupertinoRadioDemo1({super.key}); + + @override + State createState() => _CupertinoRadioDemo1State(); +} + +class _CupertinoRadioDemo1State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + value: value, + groupValue: _value, + onChanged: _onChange, + )) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value ?? 0); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart new file mode 100644 index 00000000..d2925e4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart @@ -0,0 +1,36 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoRadioDemo2 extends StatefulWidget { + const CupertinoRadioDemo2({super.key}); + + @override + State createState() => _CupertinoRadioDemo2State(); +} + +class _CupertinoRadioDemo2State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + mouseCursor: SystemMouseCursors.click, + activeColor: Colors.purple, + fillColor: Colors.cyanAccent, + inactiveColor: Colors.cyanAccent.withOpacity(0.05), + focusColor: Colors.yellow.withOpacity(0.2), + value: value, + groupValue: _value, + onChanged: _onChange)) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value ?? 0); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart new file mode 100644 index 00000000..cc01444a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart @@ -0,0 +1,32 @@ +import 'package:flutter/cupertino.dart'; + +class CupertinoRadioDemo3 extends StatefulWidget { + const CupertinoRadioDemo3({super.key}); + + @override + State createState() => _CupertinoRadioDemo3State(); +} + +class _CupertinoRadioDemo3State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int? _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + mouseCursor: SystemMouseCursors.click, + toggleable: true, + value: value, + groupValue: _value, + onChanged: _onChange)) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json new file mode 100644 index 00000000..db0a648a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS-Scrollbalken", + "info": "Ein iOS-stil Scrollbalken, der einen scrollbaren Bereich umschließen muss. Wenn der Bereich scrollbar ist, wird ein Scrollbalken angezeigt, um die Position anzuzeigen.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoScrollbar", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json new file mode 100644 index 00000000..0ed9921f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS Scroll Indicator", + "info": "An iOS-style scroll indicator that needs to wrap a scrollable area. When scrollable, it displays a scroll bar for indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoScrollbar", + "desc": [ + "【child】 : Child widget 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json new file mode 100644 index 00000000..eca87f9d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra de desplazamiento de iOS", + "info": "Barra de desplazamiento al estilo de iOS, necesita envolver un área desplazable. Cuando es desplazable, muestra una barra de desplazamiento para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoScrollbar", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json new file mode 100644 index 00000000..b608b380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barre de défilement iOS", + "info": "Barre de défilement de style iOS, nécessite d'être enveloppée dans une zone défilable. Lorsque la zone est défilable, une barre de défilement est affichée pour l'indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoScrollbar", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json new file mode 100644 index 00000000..27fca542 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra di scorrimento iOS", + "info": "Barra di scorrimento in stile iOS, deve avvolgere un'area scorrevole. Quando è possibile scorrere, viene visualizzata una barra di scorrimento per indicare.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoScrollbar", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json new file mode 100644 index 00000000..792fad38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOSスクロールバー", + "info": "iOSスタイルのスクロールバーで、スクロール可能な領域をラップする必要があります。スクロール可能な場合、スクロールバーが表示されて指示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbarの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json new file mode 100644 index 00000000..9cef34b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS 스크롤바", + "info": "iOS 스타일의 스크롤바로, 스크롤 가능한 영역을 감싸야 하며, 스크롤이 가능할 때 스크롤을 나타내는 바가 표시됩니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbar 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json new file mode 100644 index 00000000..47a54f6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra de rolagem iOS", + "info": "Barra de rolagem no estilo iOS, precisa envolver uma área rolável. Quando a área é rolável, uma barra de rolagem é exibida para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoScrollbar", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json new file mode 100644 index 00000000..0200f9c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Ползунок прокрутки iOS", + "info": "Ползунок прокрутки в стиле iOS, который должен оборачивать прокручиваемую область. Когда прокрутка возможна, отображается ползунок для индикации.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoScrollbar", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json new file mode 100644 index 00000000..861998d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS滑动指示栏", + "info": "iOS风格的滑动指示栏,需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbar基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart new file mode 100644 index 00000000..77436718 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart @@ -0,0 +1,57 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoScrollbar extends StatelessWidget { + const CustomCupertinoScrollbar({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + TextStyle get textStyle => const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: CupertinoScrollbar( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json new file mode 100644 index 00000000..0aee025e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS-Tab-Umschaltung", + "info": "iOS-Stil mehrerer Schaltflächenleiste, ähnlich wie ToggleButtons, kann Attribute wie Innenabstand, ausgewählte Farbe, Randfarbe usw. angeben.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von iOS-Tabs", + "desc": [ + "【children】 : Widget-Map 【Map】", + "【onValueChanged】 : Rückruf bei Wertänderung 【ValueChanged】", + "【groupValue】 : Ausgewählter Wert 【T】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Farbe von CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Nicht ausgewählte Farbe 【Color】", + "【selectedColor】 : Ausgewählte Farbe 【Color】", + "【pressedColor】 : Gedrückte Farbe 【Color】", + "【borderColor】 : Randfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json new file mode 100644 index 00000000..852b8e80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS Multi-Tab Switch", + "info": "iOS-style multi-button bar, similar in behavior to ToggleButtons, with customizable properties such as padding, selected color, border color, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of iOS Tabs", + "desc": [ + "【children】: Component Map 【Map】", + "【onValueChanged】: Value Change Callback 【ValueChanged】", + "【groupValue】: Selected Value 【T】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colors of CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】: Unselected Color 【Color】", + "【selectedColor】: Selected Color 【Color】", + "【pressedColor】: Pressed Color 【Color】", + "【borderColor】: Border Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json new file mode 100644 index 00000000..e0d08d20 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Control de segmentos iOS", + "info": "Barra de múltiples botones al estilo iOS, similar a ToggleButtons, se pueden especificar propiedades como el relleno interno, el color seleccionado, el color del borde, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de pestañas iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de cambio de valor 【ValueChanged】", + "【groupValue】 : Valor seleccionado 【T】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colores de CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Color no seleccionado 【Color】", + "【selectedColor】 : Color seleccionado 【Color】", + "【pressedColor】 : Color al presionar 【Color】", + "【borderColor】 : Color del borde 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json new file mode 100644 index 00000000..da8eda6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Commutateur à onglets iOS", + "info": "Barre à boutons multiples de style iOS, similaire à ToggleButtons, avec des propriétés telles que le padding, la couleur sélectionnée, la couleur de la bordure, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base des onglets iOS", + "desc": [ + "【children】 : Map de composants 【Map】", + "【onValueChanged】 : Callback de changement de valeur 【ValueChanged】", + "【groupValue】 : Valeur sélectionnée 【T】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Couleurs de CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Couleur non sélectionnée 【Color】", + "【selectedColor】 : Couleur sélectionnée 【Color】", + "【pressedColor】 : Couleur pressée 【Color】", + "【borderColor】 : Couleur de la bordure 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json new file mode 100644 index 00000000..409ec6e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Interruttore a segmenti iOS", + "info": "Barra a pulsanti multipli in stile iOS, simile a ToggleButtons, con proprietà come padding, colore selezionato, colore del bordo, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base delle schede iOS", + "desc": [ + "【children】 : Mappa dei componenti 【Map】", + "【onValueChanged】 : Callback per il cambio di valore 【ValueChanged】", + "【groupValue】 : Valore selezionato 【T】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colori di CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Colore non selezionato 【Color】", + "【selectedColor】 : Colore selezionato 【Color】", + "【pressedColor】 : Colore premuto 【Color】", + "【borderColor】 : Colore del bordo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json new file mode 100644 index 00000000..16d59205 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOSタブ切り替え", + "info": "iOSスタイルのマルチボタンバー、ToggleButtonsと同様の動作をします。内側の余白、選択色、枠線色などの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOSタブの基本使用", + "desc": [ + "【children】 : コンポーネントマップ 【Map】", + "【onValueChanged】 : 値変更コールバック 【ValueChanged】", + "【groupValue】 : 選択値 【T】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControlの色", + "desc": [ + "【unselectedColor】 : 未選択色 【Color】", + "【selectedColor】 : 選択色 【Color】", + "【pressedColor】 : 押下色 【Color】", + "【borderColor】 : 枠線色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json new file mode 100644 index 00000000..c3c3a8be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS 다중 탭 전환", + "info": "iOS 스타일의 다중 버튼 바로, ToggleButtons와 유사하게 동작하며 내부 여백, 선택 색상, 테두리 색상 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS 탭 기본 사용", + "desc": [ + "【children】 : 컴포넌트 맵 【Map】", + "【onValueChanged】 : 값 변경 콜백 【ValueChanged】", + "【groupValue】 : 선택된 값 【T】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControl의 색상", + "desc": [ + "【unselectedColor】 : 선택되지 않은 색상 【Color】", + "【selectedColor】 : 선택된 색상 【Color】", + "【pressedColor】 : 눌린 색상 【Color】", + "【borderColor】 : 테두리 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json new file mode 100644 index 00000000..d9a5caca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Alternância de múltiplas abas iOS", + "info": "Barra de múltiplos botões no estilo iOS, semelhante ao ToggleButtons, pode especificar atributos como preenchimento interno, cor selecionada, cor da borda, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de abas iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de mudança de valor 【ValueChanged】", + "【groupValue】 : Valor selecionado 【T】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Cores do CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Cor não selecionada 【Color】", + "【selectedColor】 : Cor selecionada 【Color】", + "【pressedColor】 : Cor pressionada 【Color】", + "【borderColor】 : Cor da borda 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json new file mode 100644 index 00000000..c78e5cab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS многоколоночный переключатель", + "info": "iOS-стиль многокнопочной панели, поведение аналогично ToggleButtons, можно указать такие свойства, как внутренние отступы, цвет выделения, цвет границы и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование вкладок iOS", + "desc": [ + "【children】 : Карта компонентов 【Map】", + "【onValueChanged】 : Обратный вызов изменения значения 【ValueChanged】", + "【groupValue】 : Выбранное значение 【T】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Цвета CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Цвет невыделенного 【Color】", + "【selectedColor】 : Цвет выделенного 【Color】", + "【pressedColor】 : Цвет нажатия 【Color】", + "【borderColor】 : Цвет границы 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json new file mode 100644 index 00000000..ae97e64e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS多栏切换", + "info": "iOS风格的多按钮栏,表现和ToggleButtons类似,可指定内边距、选中色、边线色等属性。", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS页签基本使用", + "desc": [ + "【children】 : 组件Map 【Map】", + "【onValueChanged】 : 值改变回调 【ValueChanged】", + "【groupValue】 : 选中值 【T】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControl的颜色", + "desc": [ + "【unselectedColor】 : 未选中色 【Color】", + "【selectedColor】 : 选中色 【Color】", + "【pressedColor】 : 按下色 【Color】", + "【borderColor】 : 边线色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart new file mode 100644 index 00000000..357ecb5e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020/6/30 +/// contact me by email 1981462002@qq.com + +class CupertinoSegmentedControlDemo extends StatefulWidget { + const CupertinoSegmentedControlDemo({Key? key}) : super(key: key); + + @override + _CupertinoSegmentedControlDemoState createState() => + _CupertinoSegmentedControlDemoState(); +} + +class _CupertinoSegmentedControlDemoState + extends State { + int _value = 1; + + @override + Widget build(BuildContext context) { + return CupertinoSegmentedControl( + groupValue: _value, + onValueChanged: _onValueChanged, + padding: const EdgeInsets.only(top: 20), + children: const { + 1: Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Text("混沌战士"), + ), + 2: Text("青眼白龙"), + 3: Text("黑魔术士"), + }, + ); + } + + void _onValueChanged(int value) { + setState(() { + _value=value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart new file mode 100644 index 00000000..1a5098ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart @@ -0,0 +1,45 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/30 +/// contact me by email 1981462002@qq.com + +class CupertinoSegmentedControlColor extends StatefulWidget { + const CupertinoSegmentedControlColor({Key? key}) : super(key: key); + + @override + _CupertinoSegmentedControlColorState createState() => + _CupertinoSegmentedControlColorState(); +} + +class _CupertinoSegmentedControlColorState + extends State { + int _value = 1; + + @override + Widget build(BuildContext context) { + return CupertinoSegmentedControl( + unselectedColor: Colors.yellow, + selectedColor: Colors.green, + pressedColor: Colors.blue, + borderColor: Colors.red, + groupValue: _value, + onValueChanged: _onValueChanged, + padding: const EdgeInsets.only(top: 20), + children: const { + 1: Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Text("混沌战士"), + ), + 2: Text("青眼白龙"), + 3: Text("黑魔术士"), + }, + ); + } + + void _onValueChanged(int value) { + setState(() { + _value=value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json new file mode 100644 index 00000000..c44512a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS-Schieberegler", + "info": "iOS-stilisiertes Schieberegler-Widget, das zwischen einem festgelegten Minimum und Maximum verschoben werden kann. Ermöglicht die Angabe von Farben und empfängt Rückrufe bei Fortschrittsänderungen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoSlider", + "desc": [ + "【value】 : Wert 【double】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【activeColor】 : Aktive Farbe 【Color】", + "【thumbColor】 : Farbe des Reglers 【Color】", + "【divisions】 : Anzahl der Abschnitte 【int】", + "【onChangeStart】 : Rückruf beim Start des Verschiebens 【Function(double)】", + "【onChangeEnd】 : Rückruf beim Ende des Verschiebens 【Function(double)】", + "【onChanged】 : Rückruf bei Änderung 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json new file mode 100644 index 00000000..d8ca6668 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS Slider", + "info": "An iOS-style slider component that allows dragging to select between a specified maximum and minimum value. You can specify colors and receive callbacks for progress changes.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoSlider", + "desc": [ + "【value】: value 【double】", + "【min】: minimum value 【double】", + "【max】: maximum value 【double】", + "【activeColor】: active color 【Color】", + "【thumbColor】: thumb color 【Color】", + "【divisions】: number of divisions 【int】", + "【onChangeStart】: callback when sliding starts 【Function(double)】", + "【onChangeEnd】: callback when sliding ends 【Function(double)】", + "【onChanged】: callback when value changes 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json new file mode 100644 index 00000000..c14cbf8b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Control deslizante de iOS", + "info": "Componente de control deslizante al estilo de iOS, que permite seleccionar arrastrando entre un valor máximo y mínimo especificados. Se puede especificar el color y recibir una devolución de llamada para los cambios de progreso.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoSlider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : color activo 【Color】", + "【thumbColor】 : color del círculo 【Color】", + "【divisions】 : número de divisiones 【int】", + "【onChangeStart】 : devolución de llamada al comenzar a deslizar 【Function(double)】", + "【onChangeEnd】 : devolución de llamada al finalizar el deslizamiento 【Function(double)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json new file mode 100644 index 00000000..09d1ddd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Curseur iOS", + "info": "Composant curseur de style iOS, permettant de faire glisser et sélectionner entre une valeur minimale et maximale spécifiées. Peut spécifier la couleur et recevoir un rappel de changement de progression.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoSlider", + "desc": [ + "【value】 : valeur 【double】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【activeColor】 : couleur active 【Color】", + "【thumbColor】 : couleur du curseur 【Color】", + "【divisions】 : nombre de divisions 【int】", + "【onChangeStart】 : rappel de début de glissement 【Function(double)】", + "【onChangeEnd】 : rappel de fin de glissement 【Function(double)】", + "【onChanged】 : rappel de changement 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json new file mode 100644 index 00000000..6d3a68f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Cursore iOS", + "info": "Componente cursore in stile iOS, che consente di selezionare trascinando tra un valore massimo e minimo specificato. È possibile specificare il colore e ricevere un callback per le modifiche di avanzamento.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoSlider", + "desc": [ + "【value】 : valore 【double】", + "【min】 : valore minimo 【double】", + "【max】 : valore massimo 【double】", + "【activeColor】 : colore attivo 【Color】", + "【thumbColor】 : colore del cerchio 【Color】", + "【divisions】 : numero di divisioni 【int】", + "【onChangeStart】 : callback di inizio scorrimento 【Function(double)】", + "【onChangeEnd】 : callback di fine scorrimento 【Function(double)】", + "【onChanged】 : callback di modifica 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json new file mode 100644 index 00000000..e0265be8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOSスライダー", + "info": "iOSスタイルのスライダーコンポーネントで、指定された最大値と最小値の間でドラッグして選択できます。色を指定でき、進捗変化のコールバックを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSliderの基本使用", + "desc": [ + "【value】 : 数値 【double】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【activeColor】 : アクティブカラー 【Color】", + "【thumbColor】 : サークルカラー 【Color】", + "【divisions】 : セグメント数 【int】", + "【onChangeStart】 : スライド開始コールバック 【Function(double)】", + "【onChangeEnd】 : スライド終了コールバック 【Function(double)】", + "【onChanged】 : 変更時コールバック 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json new file mode 100644 index 00000000..7ec7d248 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS 슬라이더", + "info": "iOS 스타일의 슬라이더 컴포넌트로, 지정된 최대값과 최소값 사이에서 드래그하여 선택할 수 있습니다. 색상을 지정할 수 있으며, 진행 상황 변화 콜백을 받을 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSlider 기본 사용", + "desc": [ + "【value】 : 값 【double】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【activeColor】 : 활성 색상 【Color】", + "【thumbColor】 : 원형 색상 【Color】", + "【divisions】 : 분할 수 【int】", + "【onChangeStart】 : 슬라이드 시작 콜백 【Function(double)】", + "【onChangeEnd】 : 슬라이드 종료 콜백 【Function(double)】", + "【onChanged】 : 변경 시 콜백 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json new file mode 100644 index 00000000..dc6d97ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Controlo Deslizante iOS", + "info": "Componente de controlo deslizante no estilo iOS, que permite selecionar arrastando entre um valor máximo e mínimo especificados. Pode-se especificar cores e receber callbacks de mudança de progresso.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoSlider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : cor ativa 【Color】", + "【thumbColor】 : cor do círculo 【Color】", + "【divisions】 : número de divisões 【int】", + "【onChangeStart】 : callback de início de deslize 【Function(double)】", + "【onChangeEnd】 : callback de fim de deslize 【Function(double)】", + "【onChanged】 : callback de mudança 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json new file mode 100644 index 00000000..4c351113 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS слайдер", + "info": "Компонент слайдера в стиле iOS, который позволяет выбирать значения путем перетаскивания между указанными минимальным и максимальным значениями. Можно указать цвет и получать обратные вызовы при изменении прогресса.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoSlider", + "desc": [ + "【value】 : значение 【double】", + "【min】 : минимальное значение 【double】", + "【max】 : максимальное значение 【double】", + "【activeColor】 : активный цвет 【Color】", + "【thumbColor】 : цвет круга 【Color】", + "【divisions】 : количество делений 【int】", + "【onChangeStart】 : обратный вызов при начале перетаскивания 【Function(double)】", + "【onChangeEnd】 : обратный вызов при завершении перетаскивания 【Function(double)】", + "【onChanged】 : обратный вызов при изменении 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json new file mode 100644 index 00000000..09a46305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS滑块", + "info": "iOS风格的滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色,接收进度变化回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSlider基本使用", + "desc": [ + "【value】 : 数值 【double】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【activeColor】 : 激活颜色 【Color】", + "【thumbColor】 : 圆形颜色 【Color】", + "【divisions】 : 分段数 【int】", + "【onChangeStart】 : 开始滑动回调 【Function(double)】", + "【onChangeEnd】 : 滑动结束回调 【Function(double)】", + "【onChanged】 : 改变时回调 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart new file mode 100644 index 00000000..b115de46 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart @@ -0,0 +1,39 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoSlider extends StatefulWidget { + const CustomCupertinoSlider({Key? key}) : super(key: key); + + @override + _CustomCupertinoSliderState createState() => _CustomCupertinoSliderState(); +} + +class _CustomCupertinoSliderState extends State { + double _value = 0.0; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('当前值:${_value.toStringAsFixed(1)}'), + CupertinoSlider( + value: _value, + divisions: 180, + min: 0.0, + max: 360.0, + activeColor: Colors.green, + thumbColor: Colors.white, + onChangeStart: (value) => print('开始滑动:$value'), + onChangeEnd: (value) => print('滑动结束:$value'), + onChanged: (value) { + setState(() { + _value = value; + }); + }), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json new file mode 100644 index 00000000..a6e5aa82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS-Schieberegister", + "info": "iOS-stilisiertes Schieberegister, unterstützt Klicken und Schieben zum Wechseln. Ermöglicht die Angabe von Registerfarben, Hintergrundfarben, Rändern und anderen Eigenschaften.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des iOS-Schieberegisters", + "desc": [ + "【children】 : Komponenten-Map 【Map】", + "【onValueChanged】 : Rückruf bei Wertänderung 【ValueChanged】", + "【groupValue】 : Ausgewählter Wert 【T】", + "【thumbColor】 : Ausgewählte Farbe 【Color】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json new file mode 100644 index 00000000..a00cd8a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS Sliding Tabs", + "info": "iOS-style sliding tabs, supporting click and slide to switch. You can specify tab color, background color, margin and other properties.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of iOS Sliding Tabs", + "desc": [ + "【children】: Component Map 【Map】", + "【onValueChanged】: Value Change Callback 【ValueChanged】", + "【groupValue】: Selected Value 【T】", + "【thumbColor】: Selected Color 【Color】", + "【backgroundColor】: Background Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json new file mode 100644 index 00000000..31cb1f68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Pestañas deslizantes de iOS", + "info": "Pestañas deslizantes al estilo de iOS, que admiten el cambio mediante clics y deslizamientos. Se pueden especificar propiedades como el color de la pestaña, el color de fondo, los márgenes, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de pestañas deslizantes de iOS", + "desc": [ + "【children】: Mapa de componentes 【Map】", + "【onValueChanged】: Callback de cambio de valor 【ValueChanged】", + "【groupValue】: Valor seleccionado 【T】", + "【thumbColor】: Color de selección 【Color】", + "【backgroundColor】: Color de fondo 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json new file mode 100644 index 00000000..3948c259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Onglets coulissants iOS", + "info": "Onglets coulissants de style iOS, prenant en charge le changement par clic ou glissement. Vous pouvez spécifier des propriétés telles que la couleur des onglets, la couleur de fond, les marges, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base des onglets coulissants iOS", + "desc": [ + "【children】 : Map des composants 【Map】", + "【onValueChanged】 : Rappel de changement de valeur 【ValueChanged】", + "【groupValue】 : Valeur sélectionnée 【T】", + "【thumbColor】 : Couleur de sélection 【Color】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json new file mode 100644 index 00000000..f1e82bea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Schede scorrevoli iOS", + "info": "Schede scorrevoli in stile iOS, supportano il passaggio tramite clic e scorrimento. È possibile specificare proprietà come il colore delle schede, il colore di sfondo, i margini, ecc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base delle schede scorrevoli iOS", + "desc": [ + "【children】 : Mappa dei componenti 【Map】", + "【onValueChanged】 : Callback per il cambio di valore 【ValueChanged】", + "【groupValue】 : Valore selezionato 【T】", + "【thumbColor】 : Colore selezionato 【Color】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json new file mode 100644 index 00000000..451a966e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOSスライドタブ", + "info": "iOSスタイルのスライドタブで、クリックやスライドでの切り替えをサポートします。タブの色、背景色、余白などの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOSスライドタブの基本使用", + "desc": [ + "【children】 : コンポーネントMap 【Map】", + "【onValueChanged】 : 値変更コールバック 【ValueChanged】", + "【groupValue】 : 選択値 【T】", + "【thumbColor】 : 選択色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json new file mode 100644 index 00000000..48069794 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS 슬라이딩 탭", + "info": "iOS 스타일의 슬라이딩 탭으로, 클릭 및 슬라이드 전환을 지원합니다. 탭 색상, 배경색, 여백 등 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS 슬라이딩 탭 기본 사용", + "desc": [ + "【children】 : 컴포넌트 맵 【Map】", + "【onValueChanged】 : 값 변경 콜백 【ValueChanged】", + "【groupValue】 : 선택된 값 【T】", + "【thumbColor】 : 선택된 색상 【Color】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json new file mode 100644 index 00000000..7f6034f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Separador deslizante iOS", + "info": "Separador deslizante ao estilo iOS, suporta alternância por toque e deslize. Permite especificar propriedades como cor do separador, cor de fundo, margens, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do separador deslizante iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de mudança de valor 【ValueChanged】", + "【groupValue】 : Valor selecionado 【T】", + "【thumbColor】 : Cor de seleção 【Color】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json new file mode 100644 index 00000000..c8696f4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS слайдер вкладок", + "info": "Слайдер вкладок в стиле iOS, поддерживает переключение по клику и скольжению. Можно указать цвет вкладок, цвет фона, отступы и другие свойства.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование iOS слайдера вкладок", + "desc": [ + "【children】 : Карта компонентов 【Map】", + "【onValueChanged】 : Обратный вызов при изменении значения 【ValueChanged】", + "【groupValue】 : Выбранное значение 【T】", + "【thumbColor】 : Цвет выбранного элемента 【Color】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json new file mode 100644 index 00000000..cac065fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS滑动页签", + "info": "iOS风格的滑动页签,支持点击、滑动切换。可指定页签颜色、背景色、边距等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS滑动页签基本使用", + "desc": [ + "【children】 : 组件Map 【Map】", + "【onValueChanged】 : 值改变回调 【ValueChanged】", + "【groupValue】 : 选中值 【T】", + "【thumbColor】 : 选中色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart new file mode 100644 index 00000000..088ae395 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart @@ -0,0 +1,44 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class CupertinoSlidingSegmentedControlDemo extends StatefulWidget { + const CupertinoSlidingSegmentedControlDemo({Key? key}) : super(key: key); + + @override + _CupertinoSlidingSegmentedControlDemoState createState() => + _CupertinoSlidingSegmentedControlDemoState(); +} + +class _CupertinoSlidingSegmentedControlDemoState + extends State { + int _value = 1; + + @override + Widget build(BuildContext context) { + return CupertinoSlidingSegmentedControl( + groupValue: _value, + onValueChanged: _onValueChanged, + thumbColor: Colors.amberAccent, + backgroundColor: Colors.green.withAlpha(99), + padding: const EdgeInsets.all(5), + children: const { + 1: Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Text("混沌战士"), + ), + 2: Text("青眼白龙"), + 3: Text("黑魔导"), + }, + ); + } + + void _onValueChanged(int? value) { + if(value==null) return; + setState(() { + _value=value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json new file mode 100644 index 00000000..56853543 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS-Schalter", + "info": "Ein iOS-stilbasierter Umschalter, der häufig für die Konfigurationsumschaltung verwendet wird, kann Farben angeben und empfängt Rückrufe für Zustandsänderungen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoSwitch", + "desc": [ + "【value】 : Ob ausgewählt 【double】", + "【activeColor】 : Farbe im aktivierten Zustand 【Color】", + "【onChanged】 : Umschalt-Rückruf 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json new file mode 100644 index 00000000..c4226620 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS Switch", + "info": "An iOS-style toggle switch, commonly used for configuration toggles, can specify colors, and receives state change callbacks.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoSwitch", + "desc": [ + "【value】: Whether it is selected 【double】", + "【activeColor】: Active state color 【Color】", + "【onChanged】: Toggle callback 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json new file mode 100644 index 00000000..06036299 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruptor iOS", + "info": "Interruptor de estilo iOS, comúnmente utilizado para cambiar configuraciones, se puede especificar el color y recibe una devolución de llamada para cambios de estado.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoSwitch", + "desc": [ + "【value】 : si está seleccionado 【double】", + "【activeColor】 : color del estado activo 【Color】", + "【onChanged】 : devolución de llamada de cambio 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json new file mode 100644 index 00000000..a3f01795 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Bouton de commutation iOS", + "info": "Bouton de commutation de style iOS, souvent utilisé pour la commutation de configuration, peut spécifier la couleur et recevoir un rappel de changement d'état.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoSwitch", + "desc": [ + "【value】 : Est-ce sélectionné 【double】", + "【activeColor】 : Couleur de l'état actif 【Color】", + "【onChanged】 : Rappel de commutation 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json new file mode 100644 index 00000000..18d6fe7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruttore iOS", + "info": "Interruttore in stile iOS, comunemente utilizzato per il cambio di configurazione, può specificare il colore e riceve un callback per i cambiamenti di stato.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoSwitch", + "desc": [ + "【value】 : Se è selezionato 【double】", + "【activeColor】 : Colore dello stato attivo 【Color】", + "【onChanged】 : Callback di cambio 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json new file mode 100644 index 00000000..7d8343e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOSスイッチ", + "info": "iOSスタイルのトグルスイッチ。設定の切り替えに頻繁に使用され、色を指定でき、状態変化のコールバックを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitchの基本使用", + "desc": [ + "【value】 : 選択されているかどうか 【double】", + "【activeColor】 : アクティブ状態の色 【Color】", + "【onChanged】 : 切り替えコールバック 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json new file mode 100644 index 00000000..de3ac158 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS 스위치", + "info": "iOS 스타일의 토글 스위치로, 설정 전환에 자주 사용되며 색상을 지정할 수 있고 상태 변화 콜백을 받습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitch 기본 사용법", + "desc": [ + "【value】 : 선택 여부 【double】", + "【activeColor】 : 활성 상태 색상 【Color】", + "【onChanged】 : 전환 콜백 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json new file mode 100644 index 00000000..cbc0fa54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruptor iOS", + "info": "Interruptor de estilo iOS, frequentemente usado para alternar configurações, pode especificar cores e receber callbacks de mudança de estado.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoSwitch", + "desc": [ + "【value】 : Se está selecionado 【double】", + "【activeColor】 : Cor do estado ativo 【Color】", + "【onChanged】 : Callback de alternância 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json new file mode 100644 index 00000000..f8f139a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS переключатель", + "info": "Переключатель в стиле iOS, часто используется для переключения настроек, может быть указан цвет, получает обратный вызов при изменении состояния.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoSwitch", + "desc": [ + "【value】 : выбрано ли 【double】", + "【activeColor】 : цвет активного состояния 【Color】", + "【onChanged】 : обратный вызов переключения 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json new file mode 100644 index 00000000..b07fe449 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS切钮", + "info": "iOS风格的切换选钮,常用于配置的切换,可指定颜色,接收状态变化回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitch基本使用", + "desc": [ + "【value】 : 是否选中 【double】", + "【activeColor】 : 激活态颜色 【Color】", + "【onChanged】 : 切换回调 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart new file mode 100644 index 00000000..db405538 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoSwitch extends StatefulWidget { + const CustomCupertinoSwitch({Key? key}) : super(key: key); + + @override + _CustomCupertinoSwitchState createState() => _CustomCupertinoSwitchState(); +} + +class _CustomCupertinoSwitchState extends State { + final List colors = [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + + bool _checked = false; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: colors + .map((e) => CupertinoSwitch( + value: _checked, + activeColor: e, + onChanged: (v) { + setState(() => _checked = v); + })).toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json new file mode 100644 index 00000000..43f67a67 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS-Tab", + "info": "Ein iOS-stilvoller TabBar, der normalerweise für CupertinoTabScaffold verwendet wird. Kann Farben, Symbolgrößen, Ränder usw. angeben. Empfängt Klickereignisse für Elemente.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabBar", + "desc": [ + "【currentIndex】 : Aktueller aktivierter Index 【Widget】", + "【items】 : Elementkomponenten 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【activeColor】 : Aktive Farbe 【Color】", + "【iconSize】 : Symbolgröße 【double】", + "【border】 : Rand 【Border】", + "【onTap】 : Klickereignis 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json new file mode 100644 index 00000000..dd8e2771 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS Tab", + "info": "An iOS-style TabBar, typically used in CupertinoTabScaffold. Can specify color, icon size, border, and other data. Receives item click events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabBar", + "desc": [ + "【currentIndex】 : Current active index 【Widget】", + "【items】 : Item components 【Widget】", + "【backgroundColor】 : Background color 【Color】", + "【inactiveColor】 : Inactive color 【Color】", + "【activeColor】 : Active color 【Color】", + "【iconSize】 : Icon size 【double】", + "【border】 : Border 【Border】", + "【onTap】 : Click event 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json new file mode 100644 index 00000000..bb3d7022 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Pestañas iOS", + "info": "Un TabBar de estilo iOS, generalmente utilizado en CupertinoTabScaffold. Se pueden especificar datos como el color, el tamaño del icono, el borde, etc. Recibe eventos de clic en los elementos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabBar", + "desc": [ + "【currentIndex】 : Índice activo actual 【Widget】", + "【items】 : Componentes de elementos 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【inactiveColor】 : Color inactivo 【Color】", + "【activeColor】 : Color activo 【Color】", + "【iconSize】 : Tamaño del icono 【double】", + "【border】 : Borde 【Border】", + "【onTap】 : Evento de clic 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json new file mode 100644 index 00000000..6ff1d38a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Onglets iOS", + "info": "Une barre d'onglets de style iOS, généralement utilisée dans CupertinoTabScaffold. Peut spécifier des données telles que la couleur, la taille des icônes, les bordures, etc. Reçoit les événements de clic sur les éléments.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabBar", + "desc": [ + "【currentIndex】 : Index actif actuel 【Widget】", + "【items】 : Composants des éléments 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【inactiveColor】 : Couleur inactive 【Color】", + "【activeColor】 : Couleur active 【Color】", + "【iconSize】 : Taille de l'icône 【double】", + "【border】 : Bordure 【Border】", + "【onTap】 : Événement de clic 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json new file mode 100644 index 00000000..a84652e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Schede iOS", + "info": "Una TabBar in stile iOS, solitamente utilizzata in CupertinoTabScaffold. È possibile specificare colore, dimensione delle icone, bordi, ecc. Riceve gli eventi di click sugli item.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoTabBar", + "desc": [ + "【currentIndex】 : Indice attualmente attivo 【Widget】", + "【items】 : Componenti degli elementi 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【inactiveColor】 : Colore inattivo 【Color】", + "【activeColor】 : Colore attivo 【Color】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【border】 : Bordo 【Border】", + "【onTap】 : Evento di click 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json new file mode 100644 index 00000000..1a014345 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOSタブ", + "info": "iOSスタイルのTabBarで、通常CupertinoTabScaffoldで使用されます。色、アイコンサイズ、ボーダーなどのデータを指定できます。アイテムのクリックイベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBarの基本使い方", + "desc": [ + "【currentIndex】 : 現在のアクティブインデックス 【Widget】", + "【items】 : アイテムコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【inactiveColor】 : 非アクティブ色 【Color】", + "【activeColor】 : アクティブ色 【Color】", + "【iconSize】 : アイコンサイズ 【double】", + "【border】 : ボーダー 【Border】", + "【onTap】 : クリックイベント 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json new file mode 100644 index 00000000..d97ac75a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS 탭", + "info": "iOS 스타일의 TabBar로, 일반적으로 CupertinoTabScaffold에서 사용됩니다. 색상, 아이콘 크기, 테두리 등을 지정할 수 있습니다. 아이템의 클릭 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBar 기본 사용법", + "desc": [ + "【currentIndex】 : 현재 활성화된 인덱스 【Widget】", + "【items】 : 항목 위젯 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【activeColor】 : 활성화 색상 【Color】", + "【iconSize】 : 아이콘 크기 【double】", + "【border】 : 테두리 【Border】", + "【onTap】 : 클릭 이벤트 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json new file mode 100644 index 00000000..9b9feb28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Separador de Páginas iOS", + "info": "Um TabBar de estilo iOS, geralmente usado em CupertinoTabScaffold. Pode especificar dados como cor, tamanho do ícone, borda, etc. Recebe eventos de clique nos itens.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoTabBar", + "desc": [ + "【currentIndex】 : Índice ativo atual 【Widget】", + "【items】 : Componentes dos itens 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【inactiveColor】 : Cor inativa 【Color】", + "【activeColor】 : Cor ativa 【Color】", + "【iconSize】 : Tamanho do ícone 【double】", + "【border】 : Borda 【Border】", + "【onTap】 : Evento de clique 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json new file mode 100644 index 00000000..3f1d1832 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS вкладки", + "info": "TabBar в стиле iOS, обычно используется в CupertinoTabScaffold. Можно указать цвет, размер иконок, границы и другие данные. Получает события кликов по элементам.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabBar", + "desc": [ + "【currentIndex】 : текущий активный индекс 【Widget】", + "【items】 : компоненты элементов 【Widget】", + "【backgroundColor】 : цвет фона 【Color】", + "【inactiveColor】 : цвет неактивного элемента 【Color】", + "【activeColor】 : цвет активного элемента 【Color】", + "【iconSize】 : размер иконки 【double】", + "【border】 : граница 【Border】", + "【onTap】 : событие клика 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json new file mode 100644 index 00000000..323d78bd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS页签", + "info": "一个iOS风格的TabBar,通常用于CupertinoTabScaffold。可指定颜色、图标大小、边线等数据。接收item的点击事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBar基本用法", + "desc": [ + "【currentIndex】 : 当前激活索引 【Widget】", + "【items】 : 条目组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【inactiveColor】 : 非激活色 【Color】", + "【activeColor】 : 激活色 【Color】", + "【iconSize】 : 图标大小 【double】", + "【border】 : 边线 【Border】", + "【onTap】 : 点击事件 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart new file mode 100644 index 00000000..523ee617 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart @@ -0,0 +1,63 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoTabBar extends StatefulWidget { + const CustomCupertinoTabBar({Key? key}) : super(key: key); + + @override + _CustomCupertinoTabBarState createState() => _CustomCupertinoTabBarState(); +} + +class _CustomCupertinoTabBarState extends State { + int _position = 0; + final Map iconsMap = { + //底栏图标 + "图鉴": Icons.home, "动态": Icons.toys, + "喜欢": Icons.favorite, "手册": Icons.class_, + "我的": Icons.account_circle, + }; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildContent(context), + _buildTabBar(), + ], + ); + } + + Widget _buildTabBar() { + return CupertinoTabBar( + currentIndex: _position, + onTap: (value) => setState(() => _position = value), + items: iconsMap.keys + .map((e) => BottomNavigationBarItem( + icon: Icon( + iconsMap[e], + ), + label: e, + )) + .toList(), + activeColor: Colors.blue, + inactiveColor: const Color(0xff333333), + backgroundColor: const Color(0xfff1f1f1), + iconSize: 25.0, + ); + } + + Widget _buildContent(BuildContext context) { + return Container( + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + height: 150, + color: const Color(0xffE7F3FC), + child: Text( + iconsMap.keys.toList()[_position], + style: const TextStyle(color: Colors.blue, fontSize: 24), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json new file mode 100644 index 00000000..b8719704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS-Tab-Scaffold", + "info": "iOS-stilisiertes Seitenlayout-Scaffold, das eine Navigationsleiste am unteren Rand und eine Hauptinhaltseite festlegen kann.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Tab-Leiste 【CupertinoTabBar】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【controller】 : Controller 【CupertinoTabController】", + "【tabBuilder】 : Seitenkonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json new file mode 100644 index 00000000..1ab677a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS Tab Scaffold", + "info": "iOS style page layout scaffold structure, which can specify the bottom navigation bar and the main content page.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabScaffold", + "desc": [ + "【tabBar】: Tab bar 【CupertinoTabBar】", + "【backgroundColor】: Background color 【Color】", + "【controller】: Controller 【CupertinoTabController】", + "【tabBuilder】: Page builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json new file mode 100644 index 00000000..2b2cfcd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Andamio de pestañas iOS", + "info": "Estructura de andamio de diseño de página al estilo iOS, que permite especificar la barra de navegación inferior y la página de contenido principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra de pestañas 【CupertinoTabBar】", + "【backgroundColor】 : Color de fondo 【Color】", + "【controller】 : Controlador 【CupertinoTabController】", + "【tabBuilder】 : Constructor de página 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json new file mode 100644 index 00000000..f0c9844e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Échafaudage d'onglets iOS", + "info": "Structure d'échafaudage de mise en page de style iOS, permettant de spécifier la barre de navigation en bas et la page de contenu principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barre d'onglets 【CupertinoTabBar】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【controller】 : Contrôleur 【CupertinoTabController】", + "【tabBuilder】 : Constructeur de page 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json new file mode 100644 index 00000000..66dcdb49 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Impalcatura a schede iOS", + "info": "Struttura di impalcatura per layout di pagine in stile iOS, con barra di navigazione inferiore e pagina principale specificabili.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra delle schede 【CupertinoTabBar】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【controller】 : Controllore 【CupertinoTabController】", + "【tabBuilder】 : Costruttore di pagine 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json new file mode 100644 index 00000000..5dc3ca23 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOSタブスキャフォールド", + "info": "iOSスタイルのページレイアウトスキャフォールド構造で、最下部のナビゲーションバーとメインコンテンツページを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold基本使用法", + "desc": [ + "【tabBar】 : タブバー 【CupertinoTabBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : コントローラー 【CupertinoTabController】", + "【tabBuilder】 : ページビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json new file mode 100644 index 00000000..fc87a350 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS 탭 스캐폴드", + "info": "iOS 스타일의 페이지 레이아웃 스캐폴드 구조, 최하단의 네비게이션 전환 바와 주 내용 페이지를 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold 기본 사용법", + "desc": [ + "【tabBar】 : 탭 바 【CupertinoTabBar】", + "【backgroundColor】 : 배경색 【Color】", + "【controller】 : 컨트롤러 【CupertinoTabController】", + "【tabBuilder】 : 페이지 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json new file mode 100644 index 00000000..e0895619 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Estrutura de Scaffold de Abas iOS", + "info": "Estrutura de scaffold de layout de página no estilo iOS, que permite especificar a barra de navegação no fundo e a página de conteúdo principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra de Abas 【CupertinoTabBar】", + "【backgroundColor】 : Cor de Fundo 【Color】", + "【controller】 : Controlador 【CupertinoTabController】", + "【tabBuilder】 : Construtor de Páginas 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json new file mode 100644 index 00000000..448d9d93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS каркас вкладок", + "info": "iOS-стиль каркаса макета страницы, который позволяет указать нижнюю панель навигации и основную страницу контента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Панель вкладок 【CupertinoTabBar】", + "【backgroundColor】 : Цвет фона 【Color】", + "【controller】 : Контроллер 【CupertinoTabController】", + "【tabBuilder】 : Конструктор страницы 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json new file mode 100644 index 00000000..3f8ee2ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS页签脚手架", + "info": "iOS风格的页面布局脚手架结构,可指定最底部的导航切换栏可主体内容页。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold基本用法", + "desc": [ + "【tabBar】 : 页签条 【CupertinoTabBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : 控制器 【CupertinoTabController】", + "【tabBuilder】 : 页面构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart new file mode 100644 index 00000000..8092538f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoTabScaffold extends StatefulWidget { + const CustomCupertinoTabScaffold({Key? key}) : super(key: key); + + @override + _CustomCupertinoTabScaffoldState createState() => + _CustomCupertinoTabScaffoldState(); +} + +class _CustomCupertinoTabScaffoldState + extends State { + int _position = 0; + final Map iconsMap = { + //底栏图标 + "图鉴": Icons.home, "动态": Icons.toys, + "喜欢": Icons.favorite, "手册": Icons.class_, + "我的": Icons.account_circle, + }; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 300, + child: CupertinoTabScaffold( + backgroundColor: Colors.grey.withAlpha(11), + tabBar: _buildTabBar(), + tabBuilder: (_, index) => _buildContent(index)), + ); + } + + CupertinoTabBar _buildTabBar() => CupertinoTabBar( + currentIndex: _position, + onTap: (value) => setState(() => _position = value), + items: iconsMap.keys + .map((e) => BottomNavigationBarItem( + icon: Icon( + iconsMap[e], + ), + label: e, + )) + .toList(), + activeColor: Colors.blue, + inactiveColor: const Color(0xff333333), + backgroundColor: const Color(0xfff1f1f1), + iconSize: 25.0, + ); + + _buildContent(int index) => Container( + alignment: Alignment.center, + child: Text(iconsMap.keys.toList()[index]), + ); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json new file mode 100644 index 00000000..d3da3a86 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino-Seite", + "info": "Kann wie MaterialApp einen Navigationsstapel verwalten. Routen werden über routes und onGenerateRoute erstellt, und die Navigation kann über navigatorObservers überwacht werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabView", + "desc": [ + "【builder】: Hauptseitenkonstruktor 【WidgetBuilder】", + "【navigatorObservers】: Routenbeobachter 【List】", + "【routes】: Routenzuordnung 【Map】", + "【onGenerateRoute】: Routenfabrik 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json new file mode 100644 index 00000000..821498eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino Page", + "info": "Can maintain a routing stack like MaterialApp. Build routes through routes and onGenerateRoute, and listen to routes through navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabView", + "desc": [ + "【builder】 : Homepage builder 【WidgetBuilder】", + "【navigatorObservers】 : Route observers 【List】", + "【routes】 : Route mapping 【Map】", + "【onGenerateRoute】 : Route factory 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json new file mode 100644 index 00000000..21f797ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Página de Cupertino", + "info": "Puede mantener una pila de rutas como MaterialApp. Construye rutas a través de routes y onGenerateRoute, y puede escuchar rutas a través de navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabView", + "desc": [ + "【builder】 : Constructor de la página principal 【WidgetBuilder】", + "【navigatorObservers】 : Observador de rutas 【List】", + "【routes】 : Mapeo de rutas 【Map】", + "【onGenerateRoute】 : Fábrica de rutas 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json new file mode 100644 index 00000000..e6c22686 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Page Cupertino", + "info": "Peut maintenir une pile de routes comme MaterialApp. Construit les routes via routes et onGenerateRoute, et peut écouter les routes via navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabView", + "desc": [ + "【builder】 : Constructeur de la page d'accueil 【WidgetBuilder】", + "【navigatorObservers】 : Observateur de routes 【List】", + "【routes】 : Mappage des routes 【Map】", + "【onGenerateRoute】 : Usine de routes 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json new file mode 100644 index 00000000..33b5f232 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Pagina Cupertino", + "info": "Può mantenere uno stack di routing come MaterialApp. Costruisce il routing tramite routes e onGenerateRoute, e può monitorare il routing tramite navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTabView", + "desc": [ + "【builder】: Costruttore della pagina principale 【WidgetBuilder】", + "【navigatorObservers】: Osservatore di routing 【List】", + "【routes】: Mappatura del routing 【Map】", + "【onGenerateRoute】: Fabbrica di routing 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json new file mode 100644 index 00000000..c47c93fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertinoページ", + "info": "MaterialAppのようにルートスタックを維持できます。routes、onGenerateRouteを使用してルートを構築し、navigatorObserversでルートを監視できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabViewの基本使用", + "desc": [ + "【builder】 : ホームページビルダー 【WidgetBuilder】", + "【navigatorObservers】 : ルート監視者 【List】", + "【routes】 : ルートマッピング 【Map】", + "【onGenerateRoute】 : ルートファクトリ 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json new file mode 100644 index 00000000..fd8f866a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino 페이지", + "info": "MaterialApp과 같이 라우팅 스택을 유지할 수 있습니다. routes, onGenerateRoute를 통해 라우팅을 구성하고, navigatorObservers를 통해 라우팅을 모니터링할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabView 기본 사용법", + "desc": [ + "【builder】 : 홈페이지 빌더 【WidgetBuilder】", + "【navigatorObservers】 : 라우팅 리스너 【List】", + "【routes】 : 라우팅 매핑 【Map】", + "【onGenerateRoute】 : 라우팅 팩토리 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json new file mode 100644 index 00000000..84eab5e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Página Cupertino", + "info": "Pode manter uma pilha de rotas como o MaterialApp. Constrói rotas através de routes e onGenerateRoute, e pode monitorar rotas com navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTabView", + "desc": [ + "【builder】 : Construtor da página inicial 【WidgetBuilder】", + "【navigatorObservers】 : Observador de rotas 【List】", + "【routes】 : Mapeamento de rotas 【Map】", + "【onGenerateRoute】 : Fábrica de rotas 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json new file mode 100644 index 00000000..868182b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino страница", + "info": "Может поддерживать стек маршрутов, как MaterialApp. Маршруты строятся через routes и onGenerateRoute, можно отслеживать маршруты через navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabView", + "desc": [ + "【builder】 : Конструктор главной страницы 【WidgetBuilder】", + "【navigatorObservers】 : Наблюдатель маршрутов 【List】", + "【routes】 : Карта маршрутов 【Map】", + "【onGenerateRoute】 : Фабрика маршрутов 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json new file mode 100644 index 00000000..927e90f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino页面", + "info": "可以像 MaterialApp 一样维护一个路由栈。通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabView基本使用", + "desc": [ + "【builder】 : 主页构造器 【WidgetBuilder】", + "【navigatorObservers】 : 路由监听器 【List】", + "【routes】 : 路由映射 【Map】", + "【onGenerateRoute】 : 路由工厂 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart new file mode 100644 index 00000000..511a70d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart @@ -0,0 +1,103 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class CupertinoTabViewDemo extends StatelessWidget { + const CupertinoTabViewDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(10), + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const CupertinoTabViewPage()), + ); + }, + child: const Text("进入 CupertinoTabView 测试页"), + ), + ); + } +} + + +class CupertinoTabViewPage extends StatelessWidget { + const CupertinoTabViewPage({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CupertinoTabView( + routes: { + '/': (context) => _HomePage(), + '/test_detail': (context) => const DetailPage(), + }, + ), + ); + } +} + +class DetailPage extends StatelessWidget { + const DetailPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: const CupertinoNavigationBar( + middle: Text('我是详情页'), + ), + child: Center( + child: Container( + width: 200, + height: 200, + color: Colors.blue, + ), + ), + ); + } +} + +class _HomePage extends StatelessWidget { + + final String info = "CupertinoTabView 可以像 MaterialApp 一样维护一个路由栈。" + "通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。" + "在这个路由栈中可以进行指定名称跳转,如下通过 /test_detail 跳到详情页。"; + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: const CupertinoNavigationBar( + middle: Text('我是主页'), + ), + child: Center(child: Column( + + children: [ + const Spacer(), + Material(child: Padding( + padding: const EdgeInsets.only(left:18.0,right: 18,bottom: 20), + child: Text(info), + )), + CupertinoButton( + padding: const EdgeInsets.only(left: 10,right: 10), + color: Colors.blue, + onPressed: () { + Navigator.pushNamed( + context, "/test_detail" + ); + }, + child: const Text("进入详情页"), + ), + const Spacer(), + ], + )), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json new file mode 100644 index 00000000..4a8ec787 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS-Stil Eingabefeld", + "info": "Cupertino-stilisiertes Eingabefeld, ähnliche Eigenschaften wie TextField, kann Controller, Textstil, Dekorationslinien, Zeilenbegrenzung, Cursor-Stil usw. angeben. Empfängt Ereignisse wie Eingabeänderungen und Eingabeabschluss.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTextField", + "desc": [ + "【placeholder】 : Hinweistext 【String】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【minLines】 : Mindestanzahl von Zeilen 【int】", + "【maxLines】 : Maximale Anzahl von Zeilen 【int】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【onChanged】 : Änderungsüberwachung 【ValueChanged】", + "【onTap】: Klicküberwachung 【GestureTapCallback】", + "【onSubmitted】: Übermittlungsüberwachung 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Häufig verwendete Stileigenschaften von CupertinoTextField", + "desc": [ + "【style】 : Eingabetextstil 【TextStyle】", + "【prefix】: Präfix-Komponente 【Widget】", + "【prefixMode】: Präfix-Modus 【OverlayVisibilityMode】", + "【suffix】: Suffix-Komponente 【Widget】", + "【suffixMode】: Suffix-Modus 【OverlayVisibilityMode】", + "【cursorColor】: Cursor-Farbe 【Color】", + "【cursorWidth】: Cursor-Breite 【double】", + "【cursorRadius】: Cursor-Radius 【Radius】", + "【readOnly】: Nur lesen 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json new file mode 100644 index 00000000..68079c3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS Style Input Box", + "info": "Cupertino style input box, properties are similar to TextField, can specify controller, text style, decoration line, line limit, cursor style, etc. Receives input change, input completion and other events.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTextField", + "desc": [ + "【placeholder】 : Hint text 【String】", + "【showCursor】 : Whether to show cursor 【bool】", + "【minLines】 : Minimum number of lines 【int】", + "【maxLines】 : Maximum number of lines 【int】", + "【padding】 : Padding 【EdgeInsetsGeometry】", + "【onChanged】 : Change listener 【ValueChanged】", + "【onTap】: Tap listener 【GestureTapCallback】", + "【onSubmitted】: Submit listener 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Common Style Properties of CupertinoTextField", + "desc": [ + "【style】 : Input text style 【TextStyle】", + "【prefix】: Prefix component 【Widget】", + "【prefixMode】: Prefix mode 【OverlayVisibilityMode】", + "【suffix】: Suffix component 【Widget】", + "【suffixMode】: Suffix mode 【OverlayVisibilityMode】", + "【cursorColor】: Cursor color 【Color】", + "【cursorWidth】: Cursor width 【double】", + "【cursorRadius】: Cursor radius 【Radius】", + "【readOnly】: Whether read-only 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json new file mode 100644 index 00000000..5e587a02 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo de texto estilo iOS", + "info": "Campo de texto de estilo Cupertino, con propiedades similares a TextField, se puede especificar controlador, estilo de texto, línea de decoración, límite de líneas, estilo de cursor, etc. Recibe eventos de cambio de entrada, finalización de entrada, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTextField", + "desc": [ + "【placeholder】 : Texto de sugerencia 【String】", + "【showCursor】 : Mostrar cursor 【bool】", + "【minLines】 : Número mínimo de líneas 【int】", + "【maxLines】 : Número máximo de líneas 【int】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【onChanged】 : Escucha de cambios 【ValueChanged】", + "【onTap】: Escucha de clics 【GestureTapCallback】", + "【onSubmitted】: Escucha de envío 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propiedades de estilo comunes de CupertinoTextField", + "desc": [ + "【style】 : Estilo del texto de entrada 【TextStyle】", + "【prefix】: Componente de prefijo 【Widget】", + "【prefixMode】: Modo de prefijo 【OverlayVisibilityMode】", + "【suffix】: Componente de sufijo 【Widget】", + "【suffixMode】: Modo de sufijo 【OverlayVisibilityMode】", + "【cursorColor】: Color del cursor 【Color】", + "【cursorWidth】: Ancho del cursor 【double】", + "【cursorRadius】: Radio del cursor 【Radius】", + "【readOnly】: Solo lectura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json new file mode 100644 index 00000000..69274be1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Champ de saisie de style iOS", + "info": "Champ de saisie de style Cupertino, les propriétés sont similaires à TextField, peut spécifier un contrôleur, le style du texte, la décoration, la limite de lignes, le style du curseur, etc. Reçoit des événements tels que les changements d'entrée, la fin de la saisie, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTextField", + "desc": [ + "【placeholder】 : Texte d'indication 【String】", + "【showCursor】 : Afficher le curseur 【bool】", + "【minLines】 : Nombre minimum de lignes 【int】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【onChanged】 : Écouteur de changement 【ValueChanged】", + "【onTap】: Écouteur de clic 【GestureTapCallback】", + "【onSubmitted】: Écouteur de soumission 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propriétés de style courantes de CupertinoTextField", + "desc": [ + "【style】 : Style du texte saisi 【TextStyle】", + "【prefix】: Composant de préfixe 【Widget】", + "【prefixMode】: Mode de préfixe 【OverlayVisibilityMode】", + "【suffix】: Composant de suffixe 【Widget】", + "【suffixMode】: Mode de suffixe 【OverlayVisibilityMode】", + "【cursorColor】: Couleur du curseur 【Color】", + "【cursorWidth】: Largeur du curseur 【double】", + "【cursorRadius】: Rayon du curseur 【Radius】", + "【readOnly】: Lecture seule 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json new file mode 100644 index 00000000..b6ea2672 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo di testo in stile iOS", + "info": "Campo di testo in stile Cupertino, le proprietà sono simili a TextField, è possibile specificare il controller, lo stile del testo, la decorazione, il limite di righe, lo stile del cursore, ecc. Riceve eventi come cambiamenti di input, completamento dell'input, ecc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTextField", + "desc": [ + "【placeholder】 : Testo suggerito 【String】", + "【showCursor】 : Mostra il cursore 【bool】", + "【minLines】 : Numero minimo di righe 【int】", + "【maxLines】 : Numero massimo di righe 【int】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【onChanged】 : Ascolta i cambiamenti 【ValueChanged】", + "【onTap】: Ascolta i clic 【GestureTapCallback】", + "【onSubmitted】: Ascolta l'invio 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Proprietà di stile comuni di CupertinoTextField", + "desc": [ + "【style】 : Stile del testo di input 【TextStyle】", + "【prefix】: Componente prefisso 【Widget】", + "【prefixMode】: Modalità prefisso 【OverlayVisibilityMode】", + "【suffix】: Componente suffisso 【Widget】", + "【suffixMode】: Modalità suffisso 【OverlayVisibilityMode】", + "【cursorColor】: Colore del cursore 【Color】", + "【cursorWidth】: Larghezza del cursore 【double】", + "【cursorRadius】: Raggio del cursore 【Radius】", + "【readOnly】: Solo lettura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json new file mode 100644 index 00000000..f465bfe9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOSスタイルの入力ボックス", + "info": "Cupertinoスタイルの入力ボックス。プロパティはTextFieldと類似しており、コントローラー、テキストスタイル、デコレーションライン、行数制限、カーソルスタイルなどを指定できます。入力変更や入力完了などのイベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextFieldの基本使用", + "desc": [ + "【placeholder】 : ヒントテキスト 【String】", + "【showCursor】 : カーソルを表示するかどうか 【bool】", + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【onChanged】 : 変更リスナー 【ValueChanged】", + "【onTap】: クリックリスナー 【GestureTapCallback】", + "【onSubmitted】: 送信リスナー 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextFieldの一般的なスタイルプロパティ", + "desc": [ + "【style】 : 入力テキストスタイル 【TextStyle】", + "【prefix】: プレフィックスコンポーネント 【Widget】", + "【prefixMode】: プレフィックスモード 【OverlayVisibilityMode】", + "【suffix】: サフィックスコンポーネント 【Widget】", + "【suffixMode】: サフィックスモード 【OverlayVisibilityMode】", + "【cursorColor】: カーソルカラー 【Color】", + "【cursorWidth】: カーソル幅 【double】", + "【cursorRadius】: カーソルの角丸 【Radius】", + "【readOnly】: 読み取り専用かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json new file mode 100644 index 00000000..0b2a5e1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS 스타일 입력 필드", + "info": "Cupertino 스타일의 입력 필드, 속성은 TextField와 유사하며, 컨트롤러, 텍스트 스타일, 장식선, 줄 수 제한, 커서 스타일 등을 지정할 수 있습니다. 입력 변화, 입력 완료 등의 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextField 기본 사용", + "desc": [ + "【placeholder】 : 힌트 텍스트 【String】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【minLines】 : 최소 줄 수 【int】", + "【maxLines】 : 최대 줄 수 【int】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【onChanged】 : 변경 감지 【ValueChanged】", + "【onTap】: 클릭 감지 【GestureTapCallback】", + "【onSubmitted】: 제출 감지 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextField 일반 스타일 속성", + "desc": [ + "【style】 : 입력 텍스트 스타일 【TextStyle】", + "【prefix】: 접두사 컴포넌트 【Widget】", + "【prefixMode】: 접두사 모드 【OverlayVisibilityMode】", + "【suffix】: 접미사 컴포넌트 【Widget】", + "【suffixMode】: 접미사 모드 【OverlayVisibilityMode】", + "【cursorColor】: 커서 색상 【Color】", + "【cursorWidth】: 커서 너비 【double】", + "【cursorRadius】: 커서 모서리 반경 【Radius】", + "【readOnly】: 읽기 전용 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json new file mode 100644 index 00000000..aea2caf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo de entrada estilo iOS", + "info": "Campo de entrada no estilo Cupertino, com propriedades semelhantes ao TextField, pode especificar controlador, estilo de texto, decoração de linha, limite de linhas, estilo do cursor, etc. Recebe eventos de mudança de entrada, conclusão de entrada, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTextField", + "desc": [ + "【placeholder】 : Texto de dica 【String】", + "【showCursor】 : Mostrar cursor 【bool】", + "【minLines】 : Número mínimo de linhas 【int】", + "【maxLines】 : Número máximo de linhas 【int】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【onChanged】 : Monitoramento de mudanças 【ValueChanged】", + "【onTap】: Monitoramento de clique 【GestureTapCallback】", + "【onSubmitted】: Monitoramento de submissão 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propriedades de estilo comuns do CupertinoTextField", + "desc": [ + "【style】 : Estilo do texto de entrada 【TextStyle】", + "【prefix】: Componente de prefixo 【Widget】", + "【prefixMode】: Modo de prefixo 【OverlayVisibilityMode】", + "【suffix】: Componente de sufixo 【Widget】", + "【suffixMode】: Modo de sufixo 【OverlayVisibilityMode】", + "【cursorColor】: Cor do cursor 【Color】", + "【cursorWidth】: Largura do cursor 【double】", + "【cursorRadius】: Raio do cursor 【Radius】", + "【readOnly】: Somente leitura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json new file mode 100644 index 00000000..4e593762 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Текстовое поле в стиле iOS", + "info": "Текстовое поле в стиле Cupertino, свойства аналогичны TextField, можно указать контроллер, стиль текста, декоративные линии, ограничение на количество строк, стиль курсора и т.д. Получает события изменения ввода, завершения ввода и другие.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTextField", + "desc": [ + "【placeholder】 : Подсказка 【String】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【minLines】 : Минимальное количество строк 【int】", + "【maxLines】 : Максимальное количество строк 【int】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【onChanged】 : Слушатель изменений 【ValueChanged】", + "【onTap】: Слушатель нажатия 【GestureTapCallback】", + "【onSubmitted】: Слушатель отправки 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Общие стилевые свойства CupertinoTextField", + "desc": [ + "【style】 : Стиль текста ввода 【TextStyle】", + "【prefix】: Префиксный компонент 【Widget】", + "【prefixMode】: Режим префикса 【OverlayVisibilityMode】", + "【suffix】: Суффиксный компонент 【Widget】", + "【suffixMode】: Режим суффикса 【OverlayVisibilityMode】", + "【cursorColor】: Цвет курсора 【Color】", + "【cursorWidth】: Ширина курсора 【double】", + "【cursorRadius】: Радиус закругления курсора 【Radius】", + "【readOnly】: Только для чтения 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json new file mode 100644 index 00000000..a7141373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS风格输入框", + "info": "Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextField基础使用", + "desc": [ + "【placeholder】 : 提示文字 【String】", + "【showCursor】 : 是否显示游标 【bool】", + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【onChanged】 : 变化监听 【ValueChanged】", + "【onTap】: 点击监听 【GestureTapCallback】", + "【onSubmitted】: 提交监听 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextField常用样式属性", + "desc": [ + "【style】 : 输入文字样式 【TextStyle】", + "【prefix】: 前缀组件 【Widget】", + "【prefixMode】: 前缀模式 【OverlayVisibilityMode】", + "【suffix】: 后缀组件 【Widget】", + "【suffixMode】: 后缀模式 【OverlayVisibilityMode】", + "【cursorColor】: 游标颜色 【Color】", + "【cursorWidth】: 游标宽度 【double】", + "【cursorRadius】: 游标圆角 【Radius】", + "【readOnly】: 是否只读 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart new file mode 100644 index 00000000..085ec04e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart @@ -0,0 +1,57 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class CupertinoTextFieldDemo extends StatefulWidget { + const CupertinoTextFieldDemo({Key? key}) : super(key: key); + + @override + _CupertinoTextFieldDemoState createState() => _CupertinoTextFieldDemoState(); +} + +class _CupertinoTextFieldDemoState extends State { + String _value = ''; + Color _color =Colors.black; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text('输入了:$_value',style: TextStyle(color: _color),), + CupertinoTextField( + placeholder: 'Input Name', + showCursor: true, + minLines: 1, + maxLines: 4, + padding: const EdgeInsets.all(8), + onChanged: _onChanged, + onTap: _onTap, + onSubmitted: _onSubmitted, + ), + ], + ); + } + + void _onChanged(String value) { + setState(() { + _value = value; + }); + } + + void _onTap() { + print('----_onTap----'); + setState(() { + _color=Colors.blue; + }); + } + + void _onSubmitted(String value) { + print('----_onSubmitted:$value}----'); + setState(() { + _color=Colors.black; + }); + } + +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart new file mode 100644 index 00000000..d1fb7c1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart @@ -0,0 +1,26 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class CupertinoTextFieldStyle extends StatelessWidget { + const CupertinoTextFieldStyle({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + return const CupertinoTextField( + style: TextStyle(color: Colors.blue), + prefix: Icon(CupertinoIcons.add), + prefixMode: OverlayVisibilityMode.notEditing, + suffix: Icon(CupertinoIcons.clear), + suffixMode: OverlayVisibilityMode.editing, + cursorColor: Colors.purple, + cursorWidth: 4, + cursorRadius: Radius.circular(2), + readOnly: false, + placeholder: '输入用户名', + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json new file mode 100644 index 00000000..c475d3a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS-Zeitauswahl", + "info": "Hochwertiger Zeitauswahl-Schieberegler, der den ausgewählten Typ, die Anfangszeit, die Hintergrundfarbe usw. angeben kann und Zeitauswahlereignisse empfängt.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Anfangszeit 【Duration】", + "【minuteInterval】 : Minutenintervall 【double】", + "【secondInterval】 : Sekundenintervall 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【mode】 : Modus*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json new file mode 100644 index 00000000..820b4f2f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS Time Picker", + "info": "A high-end rolling time picker that allows you to specify the type of selection, initial time, background color, etc., and receives time selection events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】: Initial time 【Duration】", + "【minuteInterval】: Minute interval 【double】", + "【secondInterval】: Second interval 【double】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【backgroundColor】: Background color 【Color】", + "【mode】: Mode*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json new file mode 100644 index 00000000..7c6a97ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Selector de tiempo de iOS", + "info": "Selector de tiempo de desplazamiento de alta gama, que puede especificar el tipo de selección, la hora inicial, el color de fondo, etc., y recibe eventos de selección de tiempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Hora inicial 【Duration】", + "【minuteInterval】 : Intervalo de minutos 【double】", + "【secondInterval】 : Intervalo de segundos 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【backgroundColor】 : Color de fondo 【Color】", + "【mode】 : Modo*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json new file mode 100644 index 00000000..368b6894 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Sélecteur de temps iOS", + "info": "Sélecteur de temps haut de gamme avec défilement, permet de spécifier le type de sélection, l'heure initiale, la couleur de fond, etc., et reçoit les événements de sélection de temps.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Durée initiale 【Duration】", + "【minuteInterval】 : Intervalle de minutes 【double】", + "【secondInterval】 : Intervalle de secondes 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【mode】 : Mode*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json new file mode 100644 index 00000000..51739025 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Selettore di tempo iOS", + "info": "Un selettore di tempo di scorrimento di alta gamma, che consente di specificare il tipo di selezione, l'ora iniziale, il colore di sfondo, ecc., e riceve l'evento di selezione del tempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Ora iniziale 【Duration】", + "【minuteInterval】 : Intervallo di minuti 【double】", + "【secondInterval】 : Intervallo di secondi 【double】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【mode】 : Modalità*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json new file mode 100644 index 00000000..9ff54547 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOSタイムピッカー", + "info": "高級感のあるスクロールタイムピッカーで、選択するタイプ、初期時間、背景色などを指定でき、時間選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPickerの基本使用", + "desc": [ + "【initialTimerDuration】 : 初期時間 【Duration】", + "【minuteInterval】 : 分間隔数 【double】", + "【secondInterval】 : 秒間隔数 【double】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : モード*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json new file mode 100644 index 00000000..391b966d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS 시간 선택기", + "info": "고급스러운 스크롤 시간 선택기로, 선택 유형, 초기 시간, 배경색 등을 지정할 수 있으며, 시간 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPicker 기본 사용법", + "desc": [ + "【initialTimerDuration】 : 초기 시간 【Duration】", + "【minuteInterval】 : 분 간격 수 【double】", + "【secondInterval】 : 초 간격 수 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【backgroundColor】 : 배경색 【Color】", + "【mode】 : 모드*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json new file mode 100644 index 00000000..cb65335f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Seletor de Tempo iOS", + "info": "Um seletor de tempo sofisticado com rolagem, que permite especificar o tipo de seleção, hora inicial, cor de fundo, etc., e recebe eventos de seleção de tempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Hora inicial 【Duration】", + "【minuteInterval】 : Intervalo de minutos 【double】", + "【secondInterval】 : Intervalo de segundos 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【mode】 : Modo*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json new file mode 100644 index 00000000..9c784f5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS-таймер выбора времени", + "info": "Стильный скроллинг-таймер выбора времени, позволяющий указать тип выбора, начальное время, цвет фона и т.д., а также получать события выбора времени.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Начальное время 【Duration】", + "【minuteInterval】 : Интервал минут 【double】", + "【secondInterval】 : Интервал секунд 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【backgroundColor】 : Цвет фона 【Color】", + "【mode】 : Режим*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json new file mode 100644 index 00000000..68f83bca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS时间选择器", + "info": "高大上的滑滚时间选择器,可指定选择的类型、初始时间、背景色等,接收时间选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPicker基本使用", + "desc": [ + "【initialTimerDuration】 : 初始时间 【Duration】", + "【minuteInterval】 : 分钟间隔数 【double】", + "【secondInterval】 : 秒间隔数 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : 模式*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart new file mode 100644 index 00000000..7c159ab8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoTimerPicker extends StatefulWidget { + const CustomCupertinoTimerPicker({Key? key}) : super(key: key); + + @override + _CustomCupertinoTimerPickerState createState() => + _CustomCupertinoTimerPickerState(); +} + +class _CustomCupertinoTimerPickerState + extends State { + Duration _date = const Duration(seconds: 30); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + '当前时间:${_date.toString()}', + style: const TextStyle(color: Colors.grey, fontSize: 16), + ), + _buildInfoTitle('CupertinoTimerPickerMode.hms'), + buildPicker(CupertinoTimerPickerMode.hms), + _buildInfoTitle('CupertinoTimerPickerMode.hm'), + buildPicker(CupertinoTimerPickerMode.hm), + _buildInfoTitle('CupertinoTimerPickerMode.ms'), + buildPicker(CupertinoTimerPickerMode.ms), + ], + ); + } + + Widget _buildInfoTitle(info) { + return Padding( + padding: const EdgeInsets.only(left: 20, top: 20, bottom: 5), + child: Text( + info, + style: const TextStyle( + color: Colors.blue, fontSize: 16, fontWeight: FontWeight.bold), + ), + ); + } + + Widget buildPicker(CupertinoTimerPickerMode mode) { + return Container( + margin: const EdgeInsets.all(10), + height: 150, + child: CupertinoTimerPicker( + mode: mode, + initialTimerDuration: const Duration(seconds: 30), + onTimerDurationChanged: (date) { + print(date); + setState(() => _date = date); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json new file mode 100644 index 00000000..316f6047 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Datumsbereich", + "info": "Material-stil Datumsbereichsauswahl, unterstützt Kalenderauswahl und Eingabeauswahl.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog grundlegende Verwendung", + "desc": [ + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【initialDateRange】 : Anfangsbereich 【DateTimeRange?】", + "【saveText】 : Speichern Text 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog anpassen", + "desc": [ + "Ändern Sie den Quellcode von DateRangePickerDialog, sodass Monatseinträge numerische Hintergründe anzeigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json new file mode 100644 index 00000000..0107b9c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Date Range", + "info": "Material style date range picker, supports calendar selection and input selection.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DateRangePickerDialog", + "desc": [ + "【firstDate】 : Earliest date 【DateTime】", + "【lastDate】 : Latest date 【DateTime】", + "【initialDateRange】 : Initial range 【DateTimeRange?】", + "【saveText】 : Save text 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Customize DateRangePickerDialog", + "desc": [ + "Modify the source code of DateRangePickerDialog to display a numerical background for month entries." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json new file mode 100644 index 00000000..fb92b40b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Selector de rango de fechas", + "info": "Selector de rango de fechas al estilo Material, compatible con selección de calendario y selección de entrada.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DateRangePickerDialog", + "desc": [ + "【firstDate】 : Fecha más temprana 【DateTime】", + "【lastDate】 : Fecha más tardía 【DateTime】", + "【initialDateRange】 : Rango inicial 【DateTimeRange?】", + "【saveText】 : Texto de guardar 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modificación de DateRangePickerDialog", + "desc": [ + "Modifica el código fuente de DateRangePickerDialog para que los elementos del mes muestren un fondo numérico." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json new file mode 100644 index 00000000..0ef41265 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Plage de dates", + "info": "Sélecteur de plage de dates de style Material, prenant en charge la sélection par calendrier et par saisie.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DateRangePickerDialog", + "desc": [ + "【firstDate】 : Date la plus ancienne 【DateTime】", + "【lastDate】 : Date la plus récente 【DateTime】", + "【initialDateRange】 : Plage initiale 【DateTimeRange?】", + "【saveText】 : Texte de sauvegarde 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Personnalisation de DateRangePickerDialog", + "desc": [ + "Modifiez le code source de DateRangePickerDialog pour afficher un arrière-plan numérique sur les entrées de mois." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json new file mode 100644 index 00000000..3aa6595d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Intervallo di date", + "info": "Selettore di intervalli di date in stile Material, supporta la selezione tramite calendario e input.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DateRangePickerDialog", + "desc": [ + "【firstDate】 : Data più antica 【DateTime】", + "【lastDate】 : Data più recente 【DateTime】", + "【initialDateRange】 : Intervallo iniziale 【DateTimeRange?】", + "【saveText】 : Testo di salvataggio 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modifica di DateRangePickerDialog", + "desc": [ + "Modifica il codice sorgente di DateRangePickerDialog per mostrare uno sfondo numerico per le voci dei mesi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json new file mode 100644 index 00000000..caf3a1d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "日付範囲", + "info": "Materialスタイルの日付範囲ピッカーで、カレンダー選択と入力選択をサポートしています。", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 基本使用", + "desc": [ + "【firstDate】 : 最も早い日付 【DateTime】", + "【lastDate】 : 最も遅い日付 【DateTime】", + "【initialDateRange】 : 初期範囲 【DateTimeRange?】", + "【saveText】 : 保存テキスト 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog のカスタマイズ", + "desc": [ + "DateRangePickerDialog のソースコードを変更して、月の項目に数値の背景を表示するようにします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json new file mode 100644 index 00000000..0a6e2d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "날짜 범위", + "info": "Material 스타일의 날짜 범위 선택기로, 캘린더 선택 및 입력 선택을 지원합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 기본 사용", + "desc": [ + "【firstDate】 : 가장 이른 날짜 【DateTime】", + "【lastDate】 : 가장 늦은 날짜 【DateTime】", + "【initialDateRange】 : 초기 범위 【DateTimeRange?】", + "【saveText】 : 저장 텍스트 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog 커스터마이징", + "desc": [ + "DateRangePickerDialog 소스 코드를 수정하여 월 항목에 숫자 배경을 표시합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json new file mode 100644 index 00000000..370c61c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Intervalo de Datas", + "info": "Seletor de intervalo de datas no estilo Material, suporta seleção de calendário e seleção de entrada.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DateRangePickerDialog", + "desc": [ + "【firstDate】 : Data mais antiga 【DateTime】", + "【lastDate】 : Data mais recente 【DateTime】", + "【initialDateRange】 : Intervalo inicial 【DateTimeRange?】", + "【saveText】 : Texto de salvamento 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modificar o DateRangePickerDialog", + "desc": [ + "Modifique o código-fonte do DateRangePickerDialog para exibir o fundo numérico nos itens do mês." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json new file mode 100644 index 00000000..81ddd382 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Диапазон дат", + "info": "Селектор диапазона дат в стиле Material, поддерживает выбор через календарь и ввод.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DateRangePickerDialog", + "desc": [ + "【firstDate】 : Самая ранняя дата 【DateTime】", + "【lastDate】 : Самая поздняя дата 【DateTime】", + "【initialDateRange】 : Начальный диапазон 【DateTimeRange?】", + "【saveText】 : Текст сохранения 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Модификация DateRangePickerDialog", + "desc": [ + "Изменение исходного кода DateRangePickerDialog для отображения числового фона для элементов месяца." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json new file mode 100644 index 00000000..369c54cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "日期范围", + "info": "Material 风格的日期范围选择器,支持日历选择和输入选择。", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 基本使用", + "desc": [ + "【firstDate】 : 最早日期 【DateTime】", + "【lastDate】 : 最晚日期 【DateTime】", + "【initialDateRange】 : 初始范围 【DateTimeRange?】", + "【saveText】 : 保存文字 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "魔改 DateRangePickerDialog", + "desc": [ + "修改 DateRangePickerDialog 源码,使得月份条目显示数值背景。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart new file mode 100644 index 00000000..7ebc070e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart @@ -0,0 +1,68 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class DateRangePickerDialogDemo extends StatefulWidget { + const DateRangePickerDialogDemo({Key? key}) : super(key: key); + + @override + _DateRangePickerDialogDemoState createState() => + _DateRangePickerDialogDemoState(); +} + +class _DateRangePickerDialogDemoState + extends State { + String _dateRange = ''; + + // 需要 intl 包 + final DateFormat format = DateFormat('yyyy-MM-dd'); + + @override + Widget build(BuildContext context) { + String info = _dateRange.isEmpty ? '选择日期范围' : _dateRange; + + return Center( + child: Wrap( + alignment: WrapAlignment.center, + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + ElevatedButton( + onPressed: _show, + child: const Text('选择'), + ), + Text( + info, + style: const TextStyle(color: Colors.grey), + ) + ], + ), + ); + } + + void _show() async { + DateTime firstDate = DateTime(2021, 1, 1); + DateTime lastDate = DateTime.now(); + DateTime start = lastDate.add(const Duration(days: -8)); + DateTime end = lastDate.add(const Duration(days: -2)); + DateTimeRange? range = await showDateRangePicker( + context: context, + firstDate: firstDate, + lastDate: lastDate, + initialDateRange: DateTimeRange( + start: start, + end: end, + ), + saveText: "确定", + ); + if (range != null) { + setState(() { + _dateRange = + "${format.format(range.start)} ~ ${format.format(range.end)}"; + }); + } + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart new file mode 100644 index 00000000..ddd5be20 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart @@ -0,0 +1,69 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'toly_date_picker.dart' as toly; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class DiyDateRangePickerDialogDemo extends StatefulWidget { + const DiyDateRangePickerDialogDemo({Key? key}) : super(key: key); + + @override + _DiyDateRangePickerDialogDemoState createState() => + _DiyDateRangePickerDialogDemoState(); +} + +class _DiyDateRangePickerDialogDemoState + extends State { + String _dateRange = ''; + + // 需要 intl 包 + final DateFormat format = DateFormat('yyyy-MM-dd'); + + @override + Widget build(BuildContext context) { + String info = _dateRange.isEmpty ? '选择日期范围' : _dateRange; + + return Center( + child: Wrap( + alignment: WrapAlignment.center, + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + ElevatedButton( + onPressed: _show, + child: const Text('选择'), + ), + Text( + info, + style: const TextStyle(color: Colors.grey), + ) + ], + ), + ); + } + + void _show() async { + DateTime firstDate = DateTime(2021, 1, 1); + DateTime lastDate = DateTime.now(); + DateTime start = lastDate.add(const Duration(days: -8)); + DateTime end = lastDate.add(const Duration(days: -2)); + DateTimeRange? range = await toly.showDateRangePicker( + context: context, + firstDate: firstDate, + lastDate: lastDate, + initialDateRange: DateTimeRange( + start: start, + end: end, + ), + saveText: "确定", + ); + if (range != null) { + setState(() { + _dateRange = + "${format.format(range.start)} ~ ${format.format(range.end)}"; + }); + } + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart new file mode 100644 index 00000000..0ca4acc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart @@ -0,0 +1,2910 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math' as math; + +import 'package:flutter/gestures.dart' show DragStartBehavior; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +const Size _calendarPortraitDialogSize = Size(330.0, 518.0); +const Size _calendarLandscapeDialogSize = Size(496.0, 346.0); +const Size _inputPortraitDialogSize = Size(330.0, 270.0); +const Size _inputLandscapeDialogSize = Size(496, 160.0); +const Size _inputRangeLandscapeDialogSize = Size(496, 164.0); +const Duration _dialogSizeAnimationDuration = Duration(milliseconds: 200); +const double _inputFormPortraitHeight = 98.0; +const double _inputFormLandscapeHeight = 108.0; + +/// Shows a dialog containing a Material Design date picker. +/// +/// The returned [Future] resolves to the date selected by the user when the +/// user confirms the dialog. If the user cancels the dialog, null is returned. +/// +/// When the date picker is first displayed, it will show the month of +/// [initialDate], with [initialDate] selected. +/// +/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest +/// allowable date. [initialDate] must either fall between these dates, +/// or be equal to one of them. For each of these [DateTime] parameters, only +/// their dates are considered. Their time fields are ignored. They must all +/// be non-null. +/// +/// The [currentDate] represents the current day (i.e. today). This +/// date will be highlighted in the day grid. If null, the date of +/// `DateTime.now()` will be used. +/// +/// An optional [initialEntryMode] argument can be used to display the date +/// picker in the [DatePickerEntryMode.calendar] (a calendar month grid) +/// or [DatePickerEntryMode.input] (a text input field) mode. +/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. +/// +/// An optional [selectableDayPredicate] function can be passed in to only allow +/// certain days for selection. If provided, only the days that +/// [selectableDayPredicate] returns true for will be selectable. For example, +/// this can be used to only allow weekdays for selection. If provided, it must +/// return true for [initialDate]. +/// +/// The following optional string parameters allow you to override the default +/// text used for various parts of the dialog: +/// +/// * [helpText], label displayed at the top of the dialog. +/// * [cancelText], label on the cancel button. +/// * [confirmText], label on the ok button. +/// * [errorFormatText], message used when the input text isn't in a proper date format. +/// * [errorInvalidText], message used when the input text isn't a selectable date. +/// * [fieldHintText], text used to prompt the user when no text has been entered in the field. +/// * [fieldLabelText], label for the date text input field. +/// +/// An optional [locale] argument can be used to set the locale for the date +/// picker. It defaults to the ambient locale provided by [Localizations]. +/// +/// An optional [textDirection] argument can be used to set the text direction +/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It +/// defaults to the ambient text direction provided by [Directionality]. If both +/// [locale] and [textDirection] are non-null, [textDirection] overrides the +/// direction chosen for the [locale]. +/// +/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to +/// [showDialog], the documentation for which discusses how it is used. [context] +/// and [useRootNavigator] must be non-null. +/// +/// The [builder] parameter can be used to wrap the dialog widget +/// to add inherited widgets like [Theme]. +/// +/// An optional [initialDatePickerMode] argument can be used to have the +/// calendar date picker initially appear in the [DatePickerMode.year] or +/// [DatePickerMode.day] mode. It defaults to [DatePickerMode.day], and +/// must be non-null. +/// +/// {@macro flutter.widgets.RawDialogRoute} +/// +/// ### State Restoration +/// +/// Using this method will not enable state restoration for the date picker. +/// In order to enable state restoration for a date picker, use +/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with +/// [DatePickerDialog]. +/// +/// For more information about state restoration, see [RestorationManager]. +/// +/// {@macro flutter.widgets.RestorationManager} +/// +/// {@tool dartpad} +/// This sample demonstrates how to create a restorable Material date picker. +/// This is accomplished by enabling state restoration by specifying +/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to +/// push [DatePickerDialog] when the button is tapped. +/// +/// ** See code in examples/api/lib/material/date_picker/show_date_picker.0.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [showDateRangePicker], which shows a Material Design date range picker +/// used to select a range of dates. +/// * [CalendarDatePicker], which provides the calendar grid used by the date picker dialog. +/// * [InputDatePickerFormField], which provides a text input field for entering dates. +/// * [DisplayFeatureSubScreen], which documents the specifics of how +/// [DisplayFeature]s can split the screen into sub-screens. +/// * [showTimePicker], which shows a dialog that contains a Material Design time picker. +/// +Future showDatePicker({ + required BuildContext context, + required DateTime initialDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, + SelectableDayPredicate? selectableDayPredicate, + String? helpText, + String? cancelText, + String? confirmText, + Locale? locale, + bool useRootNavigator = true, + RouteSettings? routeSettings, + TextDirection? textDirection, + TransitionBuilder? builder, + DatePickerMode initialDatePickerMode = DatePickerMode.day, + String? errorFormatText, + String? errorInvalidText, + String? fieldHintText, + String? fieldLabelText, + TextInputType? keyboardType, + Offset? anchorPoint, +}) async { + assert(context != null); + assert(initialDate != null); + assert(firstDate != null); + assert(lastDate != null); + initialDate = DateUtils.dateOnly(initialDate); + firstDate = DateUtils.dateOnly(firstDate); + lastDate = DateUtils.dateOnly(lastDate); + assert( + !lastDate.isBefore(firstDate), + 'lastDate $lastDate must be on or after firstDate $firstDate.', + ); + assert( + !initialDate.isBefore(firstDate), + 'initialDate $initialDate must be on or after firstDate $firstDate.', + ); + assert( + !initialDate.isAfter(lastDate), + 'initialDate $initialDate must be on or before lastDate $lastDate.', + ); + assert( + selectableDayPredicate == null || selectableDayPredicate(initialDate), + 'Provided initialDate $initialDate must satisfy provided selectableDayPredicate.', + ); + assert(initialEntryMode != null); + assert(useRootNavigator != null); + assert(initialDatePickerMode != null); + assert(debugCheckHasMaterialLocalizations(context)); + + Widget dialog = DatePickerDialog( + initialDate: initialDate, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + initialEntryMode: initialEntryMode, + selectableDayPredicate: selectableDayPredicate, + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + initialCalendarMode: initialDatePickerMode, + errorFormatText: errorFormatText, + errorInvalidText: errorInvalidText, + fieldHintText: fieldHintText, + fieldLabelText: fieldLabelText, + keyboardType: keyboardType, + ); + + if (textDirection != null) { + dialog = Directionality( + textDirection: textDirection, + child: dialog, + ); + } + + if (locale != null) { + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + } + + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + routeSettings: routeSettings, + builder: (BuildContext context) { + return builder == null ? dialog : builder(context, dialog); + }, + anchorPoint: anchorPoint, + ); +} + +/// A Material-style date picker dialog. +/// +/// It is used internally by [showDatePicker] or can be directly pushed +/// onto the [Navigator] stack to enable state restoration. See +/// [showDatePicker] for a state restoration app example. +/// +/// See also: +/// +/// * [showDatePicker], which is a way to display the date picker. +class DatePickerDialog extends StatefulWidget { + /// A Material-style date picker dialog. + DatePickerDialog({ + super.key, + required DateTime initialDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + this.initialEntryMode = DatePickerEntryMode.calendar, + this.selectableDayPredicate, + this.cancelText, + this.confirmText, + this.helpText, + this.initialCalendarMode = DatePickerMode.day, + this.errorFormatText, + this.errorInvalidText, + this.fieldHintText, + this.fieldLabelText, + this.keyboardType, + this.restorationId, + }) : assert(initialDate != null), + assert(firstDate != null), + assert(lastDate != null), + initialDate = DateUtils.dateOnly(initialDate), + firstDate = DateUtils.dateOnly(firstDate), + lastDate = DateUtils.dateOnly(lastDate), + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()), + assert(initialEntryMode != null), + assert(initialCalendarMode != null) { + assert( + !this.lastDate.isBefore(this.firstDate), + 'lastDate ${this.lastDate} must be on or after firstDate ${this.firstDate}.', + ); + assert( + !this.initialDate.isBefore(this.firstDate), + 'initialDate ${this.initialDate} must be on or after firstDate ${this.firstDate}.', + ); + assert( + !this.initialDate.isAfter(this.lastDate), + 'initialDate ${this.initialDate} must be on or before lastDate ${this.lastDate}.', + ); + assert( + selectableDayPredicate == null || selectableDayPredicate!(this.initialDate), + 'Provided initialDate ${this.initialDate} must satisfy provided selectableDayPredicate', + ); + } + + /// The initially selected [DateTime] that the picker should display. + final DateTime initialDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// The [DateTime] representing today. It will be highlighted in the day grid. + final DateTime currentDate; + + /// The initial mode of date entry method for the date picker dialog. + /// + /// See [DatePickerEntryMode] for more details on the different data entry + /// modes available. + final DatePickerEntryMode initialEntryMode; + + /// Function to provide full control over which [DateTime] can be selected. + final SelectableDayPredicate? selectableDayPredicate; + + /// The text that is displayed on the cancel button. + final String? cancelText; + + /// The text that is displayed on the confirm button. + final String? confirmText; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String? helpText; + + /// The initial display of the calendar picker. + final DatePickerMode initialCalendarMode; + + /// The error text displayed if the entered date is not in the correct format. + final String? errorFormatText; + + /// The error text displayed if the date is not valid. + /// + /// A date is not valid if it is earlier than [firstDate], later than + /// [lastDate], or doesn't pass the [selectableDayPredicate]. + final String? errorInvalidText; + + /// The hint text displayed in the [TextField]. + /// + /// If this is null, it will default to the date format string. For example, + /// 'mm/dd/yyyy' for en_US. + final String? fieldHintText; + + /// The label text displayed in the [TextField]. + /// + /// If this is null, it will default to the words representing the date format + /// string. For example, 'Month, Day, Year' for en_US. + final String? fieldLabelText; + + /// The keyboard type of the [TextField]. + /// + /// If this is null, it will default to [TextInputType.datetime] + final TextInputType? keyboardType; + + /// Restoration ID to save and restore the state of the [DatePickerDialog]. + /// + /// If it is non-null, the date picker will persist and restore the + /// date selected on the dialog. + /// + /// The state of this widget is persisted in a [RestorationBucket] claimed + /// from the surrounding [RestorationScope] using the provided restoration ID. + /// + /// See also: + /// + /// * [RestorationManager], which explains how state restoration works in + /// Flutter. + final String? restorationId; + + @override + State createState() => _DatePickerDialogState(); +} + +class _DatePickerDialogState extends State with RestorationMixin { + late final RestorableDateTime _selectedDate = RestorableDateTime(widget.initialDate); + late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); + final _RestorableAutovalidateMode _autovalidateMode = _RestorableAutovalidateMode(AutovalidateMode.disabled); + + @override + String? get restorationId => widget.restorationId; + + @override + void restoreState(RestorationBucket? oldBucket, bool initialRestore) { + registerForRestoration(_selectedDate, 'selected_date'); + registerForRestoration(_autovalidateMode, 'autovalidateMode'); + registerForRestoration(_entryMode, 'calendar_entry_mode'); + } + + final GlobalKey _calendarPickerKey = GlobalKey(); + final GlobalKey _formKey = GlobalKey(); + + void _handleOk() { + if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { + final FormState form = _formKey.currentState!; + if (!form.validate()) { + setState(() => _autovalidateMode.value = AutovalidateMode.always); + return; + } + form.save(); + } + Navigator.pop(context, _selectedDate.value); + } + + void _handleCancel() { + Navigator.pop(context); + } + + void _handleEntryModeToggle() { + setState(() { + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + _autovalidateMode.value = AutovalidateMode.disabled; + _entryMode.value = DatePickerEntryMode.input; + break; + case DatePickerEntryMode.input: + _formKey.currentState!.save(); + _entryMode.value = DatePickerEntryMode.calendar; + break; + case DatePickerEntryMode.calendarOnly: + case DatePickerEntryMode.inputOnly: + assert(false, 'Can not change entry mode from _entryMode'); + break; + } + }); + } + + void _handleDateChanged(DateTime date) { + setState(() { + _selectedDate.value = date; + }); + } + + Size _dialogSize(BuildContext context) { + final Orientation orientation = MediaQuery.of(context).orientation; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + case DatePickerEntryMode.calendarOnly: + switch (orientation) { + case Orientation.portrait: + return _calendarPortraitDialogSize; + case Orientation.landscape: + return _calendarLandscapeDialogSize; + } + case DatePickerEntryMode.input: + case DatePickerEntryMode.inputOnly: + switch (orientation) { + case Orientation.portrait: + return _inputPortraitDialogSize; + case Orientation.landscape: + return _inputLandscapeDialogSize; + } + } + } + + static const Map _formShortcutMap = { + // Pressing enter on the field will move focus to the next field or control. + SingleActivator(LogicalKeyboardKey.enter): NextFocusIntent(), + }; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + // Constrain the textScaleFactor to the largest supported value to prevent + // layout issues. + final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.3); + + final String dateText = localizations.formatMediumDate(_selectedDate.value); + final Color onPrimarySurface = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final TextStyle? dateStyle = orientation == Orientation.landscape + ? textTheme.bodyMedium?.copyWith(color: onPrimarySurface) + : textTheme.bodySmall?.copyWith(color: onPrimarySurface); + + final Widget actions = Container( + alignment: AlignmentDirectional.centerEnd, + constraints: const BoxConstraints(minHeight: 52.0), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: OverflowBar( + spacing: 8, + children: [ + TextButton( + onPressed: _handleCancel, + child: Text(widget.cancelText ?? localizations.cancelButtonLabel), + ), + TextButton( + onPressed: _handleOk, + child: Text(widget.confirmText ?? localizations.okButtonLabel), + ), + ], + ), + ); + + CalendarDatePicker calendarDatePicker() { + return CalendarDatePicker( + key: _calendarPickerKey, + initialDate: _selectedDate.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + currentDate: widget.currentDate, + onDateChanged: _handleDateChanged, + selectableDayPredicate: widget.selectableDayPredicate, + initialCalendarMode: widget.initialCalendarMode, + ); + } + + Form inputDatePicker() { + return Form( + key: _formKey, + autovalidateMode: _autovalidateMode.value, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: orientation == Orientation.portrait ? _inputFormPortraitHeight : _inputFormLandscapeHeight, + child: Shortcuts( + shortcuts: _formShortcutMap, + child: Column( + children: [ + const Spacer(), + InputDatePickerFormField( + initialDate: _selectedDate.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + onDateSubmitted: _handleDateChanged, + onDateSaved: _handleDateChanged, + selectableDayPredicate: widget.selectableDayPredicate, + errorFormatText: widget.errorFormatText, + errorInvalidText: widget.errorInvalidText, + fieldHintText: widget.fieldHintText, + fieldLabelText: widget.fieldLabelText, + keyboardType: widget.keyboardType, + autofocus: true, + ), + const Spacer(), + ], + ), + ), + ), + ); + } + + final Widget picker; + final Widget? entryModeButton; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + picker = calendarDatePicker(); + entryModeButton = IconButton( + icon: const Icon(Icons.edit), + color: onPrimarySurface, + tooltip: localizations.inputDateModeButtonLabel, + onPressed: _handleEntryModeToggle, + ); + break; + + case DatePickerEntryMode.calendarOnly: + picker = calendarDatePicker(); + entryModeButton = null; + break; + + case DatePickerEntryMode.input: + picker = inputDatePicker(); + entryModeButton = IconButton( + icon: const Icon(Icons.calendar_today), + color: onPrimarySurface, + tooltip: localizations.calendarModeButtonLabel, + onPressed: _handleEntryModeToggle, + ); + break; + + case DatePickerEntryMode.inputOnly: + picker = inputDatePicker(); + entryModeButton = null; + break; + } + + final Widget header = _DatePickerHeader( + helpText: widget.helpText ?? localizations.datePickerHelpText, + titleText: dateText, + titleStyle: dateStyle, + orientation: orientation, + isShort: orientation == Orientation.landscape, + entryModeButton: entryModeButton, + ); + + final Size dialogSize = _dialogSize(context) * textScaleFactor; + return Dialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0), + clipBehavior: Clip.antiAlias, + child: AnimatedContainer( + width: dialogSize.width, + height: dialogSize.height, + duration: _dialogSizeAnimationDuration, + curve: Curves.easeIn, + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaleFactor: textScaleFactor, + ), + child: Builder(builder: (BuildContext context) { + switch (orientation) { + case Orientation.portrait: + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Expanded(child: picker), + actions, + ], + ); + case Orientation.landscape: + return Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Flexible( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded(child: picker), + actions, + ], + ), + ), + ], + ); + } + }), + ), + ), + ); + } +} + +// A restorable [DatePickerEntryMode] value. +// +// This serializes each entry as a unique `int` value. +class _RestorableDatePickerEntryMode extends RestorableValue { + _RestorableDatePickerEntryMode( + DatePickerEntryMode defaultValue, + ) : _defaultValue = defaultValue; + + final DatePickerEntryMode _defaultValue; + + @override + DatePickerEntryMode createDefaultValue() => _defaultValue; + + @override + void didUpdateValue(DatePickerEntryMode? oldValue) { + assert(debugIsSerializableForRestoration(value.index)); + notifyListeners(); + } + + @override + DatePickerEntryMode fromPrimitives(Object? data) => DatePickerEntryMode.values[data! as int]; + + @override + Object? toPrimitives() => value.index; +} + +// A restorable [AutovalidateMode] value. +// +// This serializes each entry as a unique `int` value. +class _RestorableAutovalidateMode extends RestorableValue { + _RestorableAutovalidateMode( + AutovalidateMode defaultValue, + ) : _defaultValue = defaultValue; + + final AutovalidateMode _defaultValue; + + @override + AutovalidateMode createDefaultValue() => _defaultValue; + + @override + void didUpdateValue(AutovalidateMode? oldValue) { + assert(debugIsSerializableForRestoration(value.index)); + notifyListeners(); + } + + @override + AutovalidateMode fromPrimitives(Object? data) => AutovalidateMode.values[data! as int]; + + @override + Object? toPrimitives() => value.index; +} + +/// Re-usable widget that displays the selected date (in large font) and the +/// help text above it. +/// +/// These types include: +/// +/// * Single Date picker with calendar mode. +/// * Single Date picker with text input mode. +/// * Date Range picker with text input mode. +/// +/// [helpText], [orientation], [icon], [onIconPressed] are required and must be +/// non-null. +class _DatePickerHeader extends StatelessWidget { + + /// Creates a header for use in a date picker dialog. + const _DatePickerHeader({ + required this.helpText, + required this.titleText, + this.titleSemanticsLabel, + required this.titleStyle, + required this.orientation, + this.isShort = false, + this.entryModeButton, + }) : assert(helpText != null), + assert(orientation != null), + assert(isShort != null); + + static const double _datePickerHeaderLandscapeWidth = 152.0; + static const double _datePickerHeaderPortraitHeight = 120.0; + static const double _headerPaddingLandscape = 16.0; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String helpText; + + /// The text that is displayed at the center of the header. + final String titleText; + + /// The semantic label associated with the [titleText]. + final String? titleSemanticsLabel; + + /// The [TextStyle] that the title text is displayed with. + final TextStyle? titleStyle; + + /// The orientation is used to decide how to layout its children. + final Orientation orientation; + + /// Indicates the header is being displayed in a shorter/narrower context. + /// + /// This will be used to tighten up the space between the help text and date + /// text if `true`. Additionally, it will use a smaller typography style if + /// `true`. + /// + /// This is necessary for displaying the manual input mode in + /// landscape orientation, in order to account for the keyboard height. + final bool isShort; + + final Widget? entryModeButton; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final TextTheme textTheme = theme.textTheme; + + // The header should use the primary color in light themes and surface color in dark + final bool isDark = colorScheme.brightness == Brightness.dark; + final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; + final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; + + final TextStyle? helpStyle = textTheme.bodyMedium?.copyWith( + color: onPrimarySurfaceColor, + ); + + final Text help = Text( + helpText, + style: helpStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + final Text title = Text( + titleText, + semanticsLabel: titleSemanticsLabel ?? titleText, + style: titleStyle, + maxLines: orientation == Orientation.portrait ? 1 : 2, + overflow: TextOverflow.ellipsis, + ); + + switch (orientation) { + case Orientation.portrait: + return SizedBox( + height: _datePickerHeaderPortraitHeight, + child: Material( + color: primarySurfaceColor, + child: Padding( + padding: const EdgeInsetsDirectional.only( + start: 24, + end: 12, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 16), + help, + const Flexible(child: SizedBox(height: 38)), + Row( + children: [ + Expanded(child: title), + if (entryModeButton != null) + entryModeButton!, + ], + ), + ], + ), + ), + ), + ); + case Orientation.landscape: + return SizedBox( + width: _datePickerHeaderLandscapeWidth, + child: Material( + color: primarySurfaceColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: _headerPaddingLandscape, + ), + child: help, + ), + SizedBox(height: isShort ? 16 : 56), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: _headerPaddingLandscape, + ), + child: title, + ), + ), + if (entryModeButton != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: entryModeButton, + ), + ], + ), + ), + ); + } + } +} + +/// Shows a full screen modal dialog containing a Material Design date range +/// picker. +/// +/// The returned [Future] resolves to the [DateTimeRange] selected by the user +/// when the user saves their selection. If the user cancels the dialog, null is +/// returned. +/// +/// If [initialDateRange] is non-null, then it will be used as the initially +/// selected date range. If it is provided, `initialDateRange.start` must be +/// before or on `initialDateRange.end`. +/// +/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest +/// allowable date. Both must be non-null. +/// +/// If an initial date range is provided, `initialDateRange.start` +/// and `initialDateRange.end` must both fall between or on [firstDate] and +/// [lastDate]. For all of these [DateTime] values, only their dates are +/// considered. Their time fields are ignored. +/// +/// The [currentDate] represents the current day (i.e. today). This +/// date will be highlighted in the day grid. If null, the date of +/// `DateTime.now()` will be used. +/// +/// An optional [initialEntryMode] argument can be used to display the date +/// picker in the [DatePickerEntryMode.calendar] (a scrollable calendar month +/// grid) or [DatePickerEntryMode.input] (two text input fields) mode. +/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. +/// +/// The following optional string parameters allow you to override the default +/// text used for various parts of the dialog: +/// +/// * [helpText], the label displayed at the top of the dialog. +/// * [cancelText], the label on the cancel button for the text input mode. +/// * [confirmText],the label on the ok button for the text input mode. +/// * [saveText], the label on the save button for the fullscreen calendar +/// mode. +/// * [errorFormatText], the message used when an input text isn't in a proper +/// date format. +/// * [errorInvalidText], the message used when an input text isn't a +/// selectable date. +/// * [errorInvalidRangeText], the message used when the date range is +/// invalid (e.g. start date is after end date). +/// * [fieldStartHintText], the text used to prompt the user when no text has +/// been entered in the start field. +/// * [fieldEndHintText], the text used to prompt the user when no text has +/// been entered in the end field. +/// * [fieldStartLabelText], the label for the start date text input field. +/// * [fieldEndLabelText], the label for the end date text input field. +/// +/// An optional [locale] argument can be used to set the locale for the date +/// picker. It defaults to the ambient locale provided by [Localizations]. +/// +/// An optional [textDirection] argument can be used to set the text direction +/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It +/// defaults to the ambient text direction provided by [Directionality]. If both +/// [locale] and [textDirection] are non-null, [textDirection] overrides the +/// direction chosen for the [locale]. +/// +/// The [context], [useRootNavigator] and [routeSettings] arguments are passed +/// to [showDialog], the documentation for which discusses how it is used. +/// [context] and [useRootNavigator] must be non-null. +/// +/// The [builder] parameter can be used to wrap the dialog widget +/// to add inherited widgets like [Theme]. +/// +/// {@macro flutter.widgets.RawDialogRoute} +/// +/// ### State Restoration +/// +/// Using this method will not enable state restoration for the date range picker. +/// In order to enable state restoration for a date range picker, use +/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with +/// [DateRangePickerDialog]. +/// +/// For more information about state restoration, see [RestorationManager]. +/// +/// {@macro flutter.widgets.RestorationManager} +/// +/// {@tool sample} +/// This sample demonstrates how to create a restorable Material date range picker. +/// This is accomplished by enabling state restoration by specifying +/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to +/// push [DateRangePickerDialog] when the button is tapped. +/// +/// ** See code in examples/api/lib/material/date_picker/show_date_range_picker.0.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [showDatePicker], which shows a Material Design date picker used to +/// select a single date. +/// * [DateTimeRange], which is used to describe a date range. +/// * [DisplayFeatureSubScreen], which documents the specifics of how +/// [DisplayFeature]s can split the screen into sub-screens. +Future showDateRangePicker({ + required BuildContext context, + DateTimeRange? initialDateRange, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, + String? helpText, + String? cancelText, + String? confirmText, + String? saveText, + String? errorFormatText, + String? errorInvalidText, + String? errorInvalidRangeText, + String? fieldStartHintText, + String? fieldEndHintText, + String? fieldStartLabelText, + String? fieldEndLabelText, + Locale? locale, + bool useRootNavigator = true, + RouteSettings? routeSettings, + TextDirection? textDirection, + TransitionBuilder? builder, + Offset? anchorPoint, +}) async { + assert(context != null); + assert( + initialDateRange == null || (initialDateRange.start != null && initialDateRange.end != null), + 'initialDateRange must be null or have non-null start and end dates.', + ); + assert( + initialDateRange == null || !initialDateRange.start.isAfter(initialDateRange.end), + "initialDateRange's start date must not be after it's end date.", + ); + initialDateRange = initialDateRange == null ? null : DateUtils.datesOnly(initialDateRange); + assert(firstDate != null); + firstDate = DateUtils.dateOnly(firstDate); + assert(lastDate != null); + lastDate = DateUtils.dateOnly(lastDate); + assert( + !lastDate.isBefore(firstDate), + 'lastDate $lastDate must be on or after firstDate $firstDate.', + ); + assert( + initialDateRange == null || !initialDateRange.start.isBefore(firstDate), + "initialDateRange's start date must be on or after firstDate $firstDate.", + ); + assert( + initialDateRange == null || !initialDateRange.end.isBefore(firstDate), + "initialDateRange's end date must be on or after firstDate $firstDate.", + ); + assert( + initialDateRange == null || !initialDateRange.start.isAfter(lastDate), + "initialDateRange's start date must be on or before lastDate $lastDate.", + ); + assert( + initialDateRange == null || !initialDateRange.end.isAfter(lastDate), + "initialDateRange's end date must be on or before lastDate $lastDate.", + ); + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()); + assert(initialEntryMode != null); + assert(useRootNavigator != null); + assert(debugCheckHasMaterialLocalizations(context)); + + Widget dialog = DateRangePickerDialog( + initialDateRange: initialDateRange, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + initialEntryMode: initialEntryMode, + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + saveText: saveText, + errorFormatText: errorFormatText, + errorInvalidText: errorInvalidText, + errorInvalidRangeText: errorInvalidRangeText, + fieldStartHintText: fieldStartHintText, + fieldEndHintText: fieldEndHintText, + fieldStartLabelText: fieldStartLabelText, + fieldEndLabelText: fieldEndLabelText, + ); + + if (textDirection != null) { + dialog = Directionality( + textDirection: textDirection, + child: dialog, + ); + } + + if (locale != null) { + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + } + + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + routeSettings: routeSettings, + useSafeArea: false, + builder: (BuildContext context) { + return builder == null ? dialog : builder(context, dialog); + }, + anchorPoint: anchorPoint, + ); +} + +/// Returns a locale-appropriate string to describe the start of a date range. +/// +/// If `startDate` is null, then it defaults to 'Start Date', otherwise if it +/// is in the same year as the `endDate` then it will use the short month +/// day format (i.e. 'Jan 21'). Otherwise it will return the short date format +/// (i.e. 'Jan 21, 2020'). +String _formatRangeStartDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate) { + return startDate == null + ? localizations.dateRangeStartLabel + : (endDate == null || startDate.year == endDate.year) + ? localizations.formatShortMonthDay(startDate) + : localizations.formatShortDate(startDate); +} + +/// Returns an locale-appropriate string to describe the end of a date range. +/// +/// If `endDate` is null, then it defaults to 'End Date', otherwise if it +/// is in the same year as the `startDate` and the `currentDate` then it will +/// just use the short month day format (i.e. 'Jan 21'), otherwise it will +/// include the year (i.e. 'Jan 21, 2020'). +String _formatRangeEndDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate, DateTime currentDate) { + return endDate == null + ? localizations.dateRangeEndLabel + : (startDate != null && startDate.year == endDate.year && startDate.year == currentDate.year) + ? localizations.formatShortMonthDay(endDate) + : localizations.formatShortDate(endDate); +} + +/// A Material-style date range picker dialog. +/// +/// It is used internally by [showDateRangePicker] or can be directly pushed +/// onto the [Navigator] stack to enable state restoration. See +/// [showDateRangePicker] for a state restoration app example. +/// +/// See also: +/// +/// * [showDateRangePicker], which is a way to display the date picker. +class DateRangePickerDialog extends StatefulWidget { + /// A Material-style date range picker dialog. + const DateRangePickerDialog({ + super.key, + this.initialDateRange, + required this.firstDate, + required this.lastDate, + this.currentDate, + this.initialEntryMode = DatePickerEntryMode.calendar, + this.helpText, + this.cancelText, + this.confirmText, + this.saveText, + this.errorInvalidRangeText, + this.errorFormatText, + this.errorInvalidText, + this.fieldStartHintText, + this.fieldEndHintText, + this.fieldStartLabelText, + this.fieldEndLabelText, + this.restorationId, + }); + + /// The date range that the date range picker starts with when it opens. + /// + /// If an initial date range is provided, `initialDateRange.start` + /// and `initialDateRange.end` must both fall between or on [firstDate] and + /// [lastDate]. For all of these [DateTime] values, only their dates are + /// considered. Their time fields are ignored. + /// + /// If [initialDateRange] is non-null, then it will be used as the initially + /// selected date range. If it is provided, `initialDateRange.start` must be + /// before or on `initialDateRange.end`. + final DateTimeRange? initialDateRange; + + /// The earliest allowable date on the date range. + final DateTime firstDate; + + /// The latest allowable date on the date range. + final DateTime lastDate; + + /// The [currentDate] represents the current day (i.e. today). + /// + /// This date will be highlighted in the day grid. + /// + /// If `null`, the date of `DateTime.now()` will be used. + final DateTime? currentDate; + + /// The initial date range picker entry mode. + /// + /// The date range has two main modes: [DatePickerEntryMode.calendar] (a + /// scrollable calendar month grid) or [DatePickerEntryMode.input] (two text + /// input fields) mode. + /// + /// It defaults to [DatePickerEntryMode.calendar] and must be non-null. + final DatePickerEntryMode initialEntryMode; + + /// The label on the cancel button for the text input mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.cancelButtonLabel] is used. + final String? cancelText; + + /// The label on the "OK" button for the text input mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.okButtonLabel] is used. + final String? confirmText; + + /// The label on the save button for the fullscreen calendar mode. + /// + /// If null, the localized value of + /// [MaterialLocalizations.saveButtonLabel] is used. + final String? saveText; + + /// The label displayed at the top of the dialog. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateRangePickerHelpText] is used. + final String? helpText; + + /// The message used when the date range is invalid (e.g. start date is after + /// end date). + /// + /// If null, the localized value of + /// [MaterialLocalizations.invalidDateRangeLabel] is used. + final String? errorInvalidRangeText; + + /// The message used when an input text isn't in a proper date format. + /// + /// If null, the localized value of + /// [MaterialLocalizations.invalidDateFormatLabel] is used. + final String? errorFormatText; + + /// The message used when an input text isn't a selectable date. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateOutOfRangeLabel] is used. + final String? errorInvalidText; + + /// The text used to prompt the user when no text has been entered in the + /// start field. + /// + /// If null, the localized value of + /// [MaterialLocalizations.dateHelpText] is used. + final String? fieldStartHintText; + + /// The text used to prompt the user when no text has been entered in the + /// end field. + /// + /// If null, the localized value of [MaterialLocalizations.dateHelpText] is + /// used. + final String? fieldEndHintText; + + /// The label for the start date text input field. + /// + /// If null, the localized value of [MaterialLocalizations.dateRangeStartLabel] + /// is used. + final String? fieldStartLabelText; + + /// The label for the end date text input field. + /// + /// If null, the localized value of [MaterialLocalizations.dateRangeEndLabel] + /// is used. + final String? fieldEndLabelText; + + /// Restoration ID to save and restore the state of the [DateRangePickerDialog]. + /// + /// If it is non-null, the date range picker will persist and restore the + /// date range selected on the dialog. + /// + /// The state of this widget is persisted in a [RestorationBucket] claimed + /// from the surrounding [RestorationScope] using the provided restoration ID. + /// + /// See also: + /// + /// * [RestorationManager], which explains how state restoration works in + /// Flutter. + final String? restorationId; + + @override + State createState() => _DateRangePickerDialogState(); +} + +class _DateRangePickerDialogState extends State with RestorationMixin { + late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); + late final RestorableDateTimeN _selectedStart = RestorableDateTimeN(widget.initialDateRange?.start); + late final RestorableDateTimeN _selectedEnd = RestorableDateTimeN(widget.initialDateRange?.end); + final RestorableBool _autoValidate = RestorableBool(false); + final GlobalKey _calendarPickerKey = GlobalKey(); + final GlobalKey<_InputDateRangePickerState> _inputPickerKey = GlobalKey<_InputDateRangePickerState>(); + + @override + String? get restorationId => widget.restorationId; + + @override + void restoreState(RestorationBucket? oldBucket, bool initialRestore) { + registerForRestoration(_entryMode, 'entry_mode'); + registerForRestoration(_selectedStart, 'selected_start'); + registerForRestoration(_selectedEnd, 'selected_end'); + registerForRestoration(_autoValidate, 'autovalidate'); + } + + void _handleOk() { + if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { + final _InputDateRangePickerState picker = _inputPickerKey.currentState!; + if (!picker.validate()) { + setState(() { + _autoValidate.value = true; + }); + return; + } + } + final DateTimeRange? selectedRange = _hasSelectedDateRange + ? DateTimeRange(start: _selectedStart.value!, end: _selectedEnd.value!) + : null; + + Navigator.pop(context, selectedRange); + } + + void _handleCancel() { + Navigator.pop(context); + } + + void _handleEntryModeToggle() { + setState(() { + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + _autoValidate.value = false; + _entryMode.value = DatePickerEntryMode.input; + break; + + case DatePickerEntryMode.input: + // Validate the range dates + if (_selectedStart.value != null && + (_selectedStart.value!.isBefore(widget.firstDate) || _selectedStart.value!.isAfter(widget.lastDate))) { + _selectedStart.value = null; + // With no valid start date, having an end date makes no sense for the UI. + _selectedEnd.value = null; + } + if (_selectedEnd.value != null && + (_selectedEnd.value!.isBefore(widget.firstDate) || _selectedEnd.value!.isAfter(widget.lastDate))) { + _selectedEnd.value = null; + } + // If invalid range (start after end), then just use the start date + if (_selectedStart.value != null && _selectedEnd.value != null && _selectedStart.value!.isAfter(_selectedEnd.value!)) { + _selectedEnd.value = null; + } + _entryMode.value = DatePickerEntryMode.calendar; + break; + + case DatePickerEntryMode.calendarOnly: + case DatePickerEntryMode.inputOnly: + assert(false, 'Can not change entry mode from $_entryMode'); + break; + } + }); + } + + void _handleStartDateChanged(DateTime? date) { + setState(() => _selectedStart.value = date); + } + + void _handleEndDateChanged(DateTime? date) { + setState(() => _selectedEnd.value = date); + } + + bool get _hasSelectedDateRange => _selectedStart.value != null && _selectedEnd.value != null; + + @override + Widget build(BuildContext context) { + final MediaQueryData mediaQuery = MediaQuery.of(context); + final Orientation orientation = mediaQuery.orientation; + final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final ColorScheme colors = Theme.of(context).colorScheme; + final Color onPrimarySurface = colors.brightness == Brightness.light + ? colors.onPrimary + : colors.onSurface; + + final Widget contents; + final Size size; + ShapeBorder? shape; + final double elevation; + final EdgeInsets insetPadding; + final bool showEntryModeButton = + _entryMode.value == DatePickerEntryMode.calendar || + _entryMode.value == DatePickerEntryMode.input; + switch (_entryMode.value) { + case DatePickerEntryMode.calendar: + case DatePickerEntryMode.calendarOnly: + contents = _CalendarRangePickerDialog( + key: _calendarPickerKey, + selectedStartDate: _selectedStart.value, + selectedEndDate: _selectedEnd.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + currentDate: widget.currentDate, + onStartDateChanged: _handleStartDateChanged, + onEndDateChanged: _handleEndDateChanged, + onConfirm: _hasSelectedDateRange ? _handleOk : null, + onCancel: _handleCancel, + entryModeButton: showEntryModeButton + ? IconButton( + icon: const Icon(Icons.edit), + padding: EdgeInsets.zero, + color: onPrimarySurface, + tooltip: localizations.inputDateModeButtonLabel, + onPressed: _handleEntryModeToggle, + ) + : null, + confirmText: widget.saveText ?? localizations.saveButtonLabel, + helpText: widget.helpText ?? localizations.dateRangePickerHelpText, + ); + size = mediaQuery.size; + insetPadding = EdgeInsets.zero; + shape = const RoundedRectangleBorder(); + elevation = 0; + break; + + case DatePickerEntryMode.input: + case DatePickerEntryMode.inputOnly: + contents = _InputDateRangePickerDialog( + selectedStartDate: _selectedStart.value, + selectedEndDate: _selectedEnd.value, + currentDate: widget.currentDate, + picker: Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: orientation == Orientation.portrait + ? _inputFormPortraitHeight + : _inputFormLandscapeHeight, + child: Column( + children: [ + const Spacer(), + _InputDateRangePicker( + key: _inputPickerKey, + initialStartDate: _selectedStart.value, + initialEndDate: _selectedEnd.value, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + onStartDateChanged: _handleStartDateChanged, + onEndDateChanged: _handleEndDateChanged, + autofocus: true, + autovalidate: _autoValidate.value, + helpText: widget.helpText, + errorInvalidRangeText: widget.errorInvalidRangeText, + errorFormatText: widget.errorFormatText, + errorInvalidText: widget.errorInvalidText, + fieldStartHintText: widget.fieldStartHintText, + fieldEndHintText: widget.fieldEndHintText, + fieldStartLabelText: widget.fieldStartLabelText, + fieldEndLabelText: widget.fieldEndLabelText, + ), + const Spacer(), + ], + ), + ), + onConfirm: _handleOk, + onCancel: _handleCancel, + entryModeButton: showEntryModeButton + ? IconButton( + icon: const Icon(Icons.calendar_today), + padding: EdgeInsets.zero, + color: onPrimarySurface, + tooltip: localizations.calendarModeButtonLabel, + onPressed: _handleEntryModeToggle, + ) + : null, + confirmText: widget.confirmText ?? localizations.okButtonLabel, + cancelText: widget.cancelText ?? localizations.cancelButtonLabel, + helpText: widget.helpText ?? localizations.dateRangePickerHelpText, + ); + final DialogThemeData dialogTheme = Theme.of(context).dialogTheme; + size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; + insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); + shape = dialogTheme.shape; + elevation = dialogTheme.elevation ?? 24; + break; + } + + return Dialog( + insetPadding: insetPadding, + shape: shape, + elevation: elevation, + clipBehavior: Clip.antiAlias, + child: AnimatedContainer( + width: size.width, + height: size.height, + duration: _dialogSizeAnimationDuration, + curve: Curves.easeIn, + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaleFactor: textScaleFactor, + ), + child: Builder(builder: (BuildContext context) { + return contents; + }), + ), + ), + ); + } +} + +class _CalendarRangePickerDialog extends StatelessWidget { + const _CalendarRangePickerDialog({ + super.key, + required this.selectedStartDate, + required this.selectedEndDate, + required this.firstDate, + required this.lastDate, + required this.currentDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + required this.onConfirm, + required this.onCancel, + required this.confirmText, + required this.helpText, + this.entryModeButton, + }); + + final DateTime? selectedStartDate; + final DateTime? selectedEndDate; + final DateTime firstDate; + final DateTime lastDate; + final DateTime? currentDate; + final ValueChanged onStartDateChanged; + final ValueChanged onEndDateChanged; + final VoidCallback? onConfirm; + final VoidCallback? onCancel; + final String confirmText; + final String helpText; + final Widget? entryModeButton; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + final Color headerForeground = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final Color headerDisabledForeground = headerForeground.withOpacity(0.38); + final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); + final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); + final TextStyle? headlineStyle = textTheme.headlineSmall; + final TextStyle? startDateStyle = headlineStyle?.apply( + color: selectedStartDate != null ? headerForeground : headerDisabledForeground, + ); + final TextStyle? endDateStyle = headlineStyle?.apply( + color: selectedEndDate != null ? headerForeground : headerDisabledForeground, + ); + final TextStyle saveButtonStyle = textTheme.titleMedium!.apply( + color: onConfirm != null ? headerForeground : headerDisabledForeground, + ); + + return SafeArea( + top: false, + left: false, + right: false, + child: Scaffold( + appBar: AppBar( + leading: CloseButton( + onPressed: onCancel, + ), + actions: [ + if (orientation == Orientation.landscape && entryModeButton != null) + entryModeButton!, + TextButton( + onPressed: onConfirm, + child: Text(confirmText, style: saveButtonStyle), + ), + const SizedBox(width: 8), + ], + bottom: PreferredSize( + preferredSize: const Size(double.infinity, 64), + child: Row(children: [ + SizedBox(width: MediaQuery.of(context).size.width < 360 ? 42 : 72), + Expanded( + child: Semantics( + label: '$helpText $startDateText to $endDateText', + excludeSemantics: true, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + helpText, + style: textTheme.bodyMedium!.apply( + color: headerForeground, + ), + ), + const SizedBox(height: 8), + Row( + children: [ + Text( + startDateText, + style: startDateStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text(' – ', style: startDateStyle, + ), + Flexible( + child: Text( + endDateText, + style: endDateStyle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 16), + ], + ), + ), + ), + if (orientation == Orientation.portrait && entryModeButton != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: entryModeButton, + ), + ]), + ), + ), + body: _CalendarDateRangePicker( + initialStartDate: selectedStartDate, + initialEndDate: selectedEndDate, + firstDate: firstDate, + lastDate: lastDate, + currentDate: currentDate, + onStartDateChanged: onStartDateChanged, + onEndDateChanged: onEndDateChanged, + ), + ), + ); + } +} + +const Duration _monthScrollDuration = Duration(milliseconds: 200); + +const double _monthItemHeaderHeight = 58.0; +const double _monthItemFooterHeight = 12.0; +const double _monthItemRowHeight = 42.0; +const double _monthItemSpaceBetweenRows = 8.0; +const double _horizontalPadding = 8.0; +const double _maxCalendarWidthLandscape = 384.0; +const double _maxCalendarWidthPortrait = 480.0; + +/// Displays a scrollable calendar grid that allows a user to select a range +/// of dates. +class _CalendarDateRangePicker extends StatefulWidget { + /// Creates a scrollable calendar grid for picking date ranges. + _CalendarDateRangePicker({ + DateTime? initialStartDate, + DateTime? initialEndDate, + required DateTime firstDate, + required DateTime lastDate, + DateTime? currentDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + }) : initialStartDate = initialStartDate != null ? DateUtils.dateOnly(initialStartDate) : null, + initialEndDate = initialEndDate != null ? DateUtils.dateOnly(initialEndDate) : null, + assert(firstDate != null), + assert(lastDate != null), + firstDate = DateUtils.dateOnly(firstDate), + lastDate = DateUtils.dateOnly(lastDate), + currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()) { + assert( + this.initialStartDate == null || this.initialEndDate == null || !this.initialStartDate!.isAfter(initialEndDate!), + 'initialStartDate must be on or before initialEndDate.', + ); + assert( + !this.lastDate.isBefore(this.firstDate), + 'firstDate must be on or before lastDate.', + ); + } + + /// The [DateTime] that represents the start of the initial date range selection. + final DateTime? initialStartDate; + + /// The [DateTime] that represents the end of the initial date range selection. + final DateTime? initialEndDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// The [DateTime] representing today. It will be highlighted in the day grid. + final DateTime currentDate; + + /// Called when the user changes the start date of the selected range. + final ValueChanged? onStartDateChanged; + + /// Called when the user changes the end date of the selected range. + final ValueChanged? onEndDateChanged; + + @override + _CalendarDateRangePickerState createState() => _CalendarDateRangePickerState(); +} + +class _CalendarDateRangePickerState extends State<_CalendarDateRangePicker> { + final GlobalKey _scrollViewKey = GlobalKey(); + DateTime? _startDate; + DateTime? _endDate; + int _initialMonthIndex = 0; + late ScrollController _controller; + late bool _showWeekBottomDivider; + + @override + void initState() { + super.initState(); + _controller = ScrollController(); + _controller.addListener(_scrollListener); + + _startDate = widget.initialStartDate; + _endDate = widget.initialEndDate; + + // Calculate the index for the initially displayed month. This is needed to + // divide the list of months into two `SliverList`s. + final DateTime initialDate = widget.initialStartDate ?? widget.currentDate; + if (!initialDate.isBefore(widget.firstDate) && + !initialDate.isAfter(widget.lastDate)) { + _initialMonthIndex = DateUtils.monthDelta(widget.firstDate, initialDate); + } + + _showWeekBottomDivider = _initialMonthIndex != 0; + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void _scrollListener() { + if (_controller.offset <= _controller.position.minScrollExtent) { + setState(() { + _showWeekBottomDivider = false; + }); + } else if (!_showWeekBottomDivider) { + setState(() { + _showWeekBottomDivider = true; + }); + } + } + + int get _numberOfMonths => DateUtils.monthDelta(widget.firstDate, widget.lastDate) + 1; + + void _vibrate() { + switch (Theme.of(context).platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + HapticFeedback.vibrate(); + break; + case TargetPlatform.iOS: + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + break; + } + } + + // This updates the selected date range using this logic: + // + // * From the unselected state, selecting one date creates the start date. + // * If the next selection is before the start date, reset date range and + // set the start date to that selection. + // * If the next selection is on or after the start date, set the end date + // to that selection. + // * After both start and end dates are selected, any subsequent selection + // resets the date range and sets start date to that selection. + void _updateSelection(DateTime date) { + _vibrate(); + setState(() { + if (_startDate != null && _endDate == null && !date.isBefore(_startDate!)) { + _endDate = date; + widget.onEndDateChanged?.call(_endDate); + } else { + _startDate = date; + widget.onStartDateChanged?.call(_startDate!); + if (_endDate != null) { + _endDate = null; + widget.onEndDateChanged?.call(_endDate); + } + } + }); + } + + Widget _buildMonthItem(BuildContext context, int index, bool beforeInitialMonth) { + final int monthIndex = beforeInitialMonth + ? _initialMonthIndex - index - 1 + : _initialMonthIndex + index; + final DateTime month = DateUtils.addMonthsToMonthDate(widget.firstDate, monthIndex); + return Stack( + alignment: Alignment.center, + children: [ + Text("${month.month}",style: TextStyle(fontSize: 200,color: Colors.grey.withOpacity(0.1)),), + _MonthItem( + selectedDateStart: _startDate, + selectedDateEnd: _endDate, + currentDate: widget.currentDate, + firstDate: widget.firstDate, + lastDate: widget.lastDate, + displayedMonth: month, + onChanged: _updateSelection, + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + const Key sliverAfterKey = Key('sliverAfterKey'); + + return Column( + children: [ + const _DayHeaders(), + if (_showWeekBottomDivider) const Divider(height: 0), + Expanded( + child: _CalendarKeyboardNavigator( + firstDate: widget.firstDate, + lastDate: widget.lastDate, + initialFocusedDay: _startDate ?? widget.initialStartDate ?? widget.currentDate, + // In order to prevent performance issues when displaying the + // correct initial month, 2 `SliverList`s are used to split the + // months. The first item in the second SliverList is the initial + // month to be displayed. + child: CustomScrollView( + key: _scrollViewKey, + controller: _controller, + center: sliverAfterKey, + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) => _buildMonthItem(context, index, true), + childCount: _initialMonthIndex, + ), + ), + SliverList( + key: sliverAfterKey, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) => _buildMonthItem(context, index, false), + childCount: _numberOfMonths - _initialMonthIndex, + ), + ), + ], + ), + ), + ), + ], + ); + } +} + +class _CalendarKeyboardNavigator extends StatefulWidget { + const _CalendarKeyboardNavigator({ + required this.child, + required this.firstDate, + required this.lastDate, + required this.initialFocusedDay, + }); + + final Widget child; + final DateTime firstDate; + final DateTime lastDate; + final DateTime initialFocusedDay; + + @override + _CalendarKeyboardNavigatorState createState() => _CalendarKeyboardNavigatorState(); +} + +class _CalendarKeyboardNavigatorState extends State<_CalendarKeyboardNavigator> { + + final Map _shortcutMap = const { + SingleActivator(LogicalKeyboardKey.arrowLeft): DirectionalFocusIntent(TraversalDirection.left), + SingleActivator(LogicalKeyboardKey.arrowRight): DirectionalFocusIntent(TraversalDirection.right), + SingleActivator(LogicalKeyboardKey.arrowDown): DirectionalFocusIntent(TraversalDirection.down), + SingleActivator(LogicalKeyboardKey.arrowUp): DirectionalFocusIntent(TraversalDirection.up), + }; + late Map> _actionMap; + late FocusNode _dayGridFocus; + TraversalDirection? _dayTraversalDirection; + DateTime? _focusedDay; + + @override + void initState() { + super.initState(); + + _actionMap = >{ + NextFocusIntent: CallbackAction(onInvoke: _handleGridNextFocus), + PreviousFocusIntent: CallbackAction(onInvoke: _handleGridPreviousFocus), + DirectionalFocusIntent: CallbackAction(onInvoke: _handleDirectionFocus), + }; + _dayGridFocus = FocusNode(debugLabel: 'Day Grid'); + } + + @override + void dispose() { + _dayGridFocus.dispose(); + super.dispose(); + } + + void _handleGridFocusChange(bool focused) { + setState(() { + if (focused) { + _focusedDay ??= widget.initialFocusedDay; + } + }); + } + + /// Move focus to the next element after the day grid. + void _handleGridNextFocus(NextFocusIntent intent) { + _dayGridFocus.requestFocus(); + _dayGridFocus.nextFocus(); + } + + /// Move focus to the previous element before the day grid. + void _handleGridPreviousFocus(PreviousFocusIntent intent) { + _dayGridFocus.requestFocus(); + _dayGridFocus.previousFocus(); + } + + /// Move the internal focus date in the direction of the given intent. + /// + /// This will attempt to move the focused day to the next selectable day in + /// the given direction. If the new date is not in the current month, then + /// the page view will be scrolled to show the new date's month. + /// + /// For horizontal directions, it will move forward or backward a day (depending + /// on the current [TextDirection]). For vertical directions it will move up and + /// down a week at a time. + void _handleDirectionFocus(DirectionalFocusIntent intent) { + assert(_focusedDay != null); + setState(() { + final DateTime? nextDate = _nextDateInDirection(_focusedDay!, intent.direction); + if (nextDate != null) { + _focusedDay = nextDate; + _dayTraversalDirection = intent.direction; + } + }); + } + + static const Map _directionOffset = { + TraversalDirection.up: -DateTime.daysPerWeek, + TraversalDirection.right: 1, + TraversalDirection.down: DateTime.daysPerWeek, + TraversalDirection.left: -1, + }; + + int _dayDirectionOffset(TraversalDirection traversalDirection, TextDirection textDirection) { + // Swap left and right if the text direction if RTL + if (textDirection == TextDirection.rtl) { + if (traversalDirection == TraversalDirection.left) { + traversalDirection = TraversalDirection.right; + } else if (traversalDirection == TraversalDirection.right) { + traversalDirection = TraversalDirection.left; + } + } + return _directionOffset[traversalDirection]!; + } + + DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { + final TextDirection textDirection = Directionality.of(context); + final DateTime nextDate = DateUtils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); + if (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { + return nextDate; + } + return null; + } + + @override + Widget build(BuildContext context) { + return FocusableActionDetector( + shortcuts: _shortcutMap, + actions: _actionMap, + focusNode: _dayGridFocus, + onFocusChange: _handleGridFocusChange, + child: _FocusedDate( + date: _dayGridFocus.hasFocus ? _focusedDay : null, + scrollDirection: _dayGridFocus.hasFocus ? _dayTraversalDirection : null, + child: widget.child, + ), + ); + } +} + +/// InheritedWidget indicating what the current focused date is for its children. +/// +/// This is used by the [_MonthPicker] to let its children [_DayPicker]s know +/// what the currently focused date (if any) should be. +class _FocusedDate extends InheritedWidget { + const _FocusedDate({ + required super.child, + this.date, + this.scrollDirection, + }); + + final DateTime? date; + final TraversalDirection? scrollDirection; + + @override + bool updateShouldNotify(_FocusedDate oldWidget) { + return !DateUtils.isSameDay(date, oldWidget.date) || scrollDirection != oldWidget.scrollDirection; + } + + static _FocusedDate? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType<_FocusedDate>(); + } +} + + +class _DayHeaders extends StatelessWidget { + const _DayHeaders(); + + /// Builds widgets showing abbreviated days of week. The first widget in the + /// returned list corresponds to the first day of week for the current locale. + /// + /// Examples: + /// + /// ``` + /// ┌ Sunday is the first day of week in the US (en_US) + /// | + /// S M T W T F S <-- the returned list contains these widgets + /// _ _ _ _ _ 1 2 + /// 3 4 5 6 7 8 9 + /// + /// ┌ But it's Monday in the UK (en_GB) + /// | + /// M T W T F S S <-- the returned list contains these widgets + /// _ _ _ _ 1 2 3 + /// 4 5 6 7 8 9 10 + /// ``` + List _getDayHeaders(TextStyle headerStyle, MaterialLocalizations localizations) { + final List result = []; + for (int i = localizations.firstDayOfWeekIndex; true; i = (i + 1) % 7) { + final String weekday = localizations.narrowWeekdays[i]; + result.add(ExcludeSemantics( + child: Center(child: Text(weekday, style: headerStyle)), + )); + if (i == (localizations.firstDayOfWeekIndex - 1) % 7) { + break; + } + } + return result; + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + final ColorScheme colorScheme = themeData.colorScheme; + final TextStyle textStyle = themeData.textTheme.bodyMedium!.apply(color: colorScheme.onSurface); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final List labels = _getDayHeaders(textStyle, localizations); + + // Add leading and trailing containers for edges of the custom grid layout. + labels.insert(0, Container()); + labels.add(Container()); + + return Container( + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).orientation == Orientation.landscape + ? _maxCalendarWidthLandscape + : _maxCalendarWidthPortrait, + maxHeight: _monthItemRowHeight, + ), + child: GridView.custom( + shrinkWrap: true, + gridDelegate: _monthItemGridDelegate, + childrenDelegate: SliverChildListDelegate( + labels, + addRepaintBoundaries: false, + ), + ), + ); + } +} + +class _MonthItemGridDelegate extends SliverGridDelegate { + const _MonthItemGridDelegate(); + + @override + SliverGridLayout getLayout(SliverConstraints constraints) { + final double tileWidth = (constraints.crossAxisExtent - 2 * _horizontalPadding) / DateTime.daysPerWeek; + return _MonthSliverGridLayout( + crossAxisCount: DateTime.daysPerWeek + 2, + dayChildWidth: tileWidth, + edgeChildWidth: _horizontalPadding, + reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection), + ); + } + + @override + bool shouldRelayout(_MonthItemGridDelegate oldDelegate) => false; +} + +const _MonthItemGridDelegate _monthItemGridDelegate = _MonthItemGridDelegate(); + +class _MonthSliverGridLayout extends SliverGridLayout { + /// Creates a layout that uses equally sized and spaced tiles for each day of + /// the week and an additional edge tile for padding at the start and end of + /// each row. + /// + /// This is necessary to facilitate the painting of the range highlight + /// correctly. + const _MonthSliverGridLayout({ + required this.crossAxisCount, + required this.dayChildWidth, + required this.edgeChildWidth, + required this.reverseCrossAxis, + }) : assert(crossAxisCount != null && crossAxisCount > 0), + assert(dayChildWidth != null && dayChildWidth >= 0), + assert(edgeChildWidth != null && edgeChildWidth >= 0), + assert(reverseCrossAxis != null); + + /// The number of children in the cross axis. + final int crossAxisCount; + + /// The width in logical pixels of the day child widgets. + final double dayChildWidth; + + /// The width in logical pixels of the edge child widgets. + final double edgeChildWidth; + + /// Whether the children should be placed in the opposite order of increasing + /// coordinates in the cross axis. + /// + /// For example, if the cross axis is horizontal, the children are placed from + /// left to right when [reverseCrossAxis] is false and from right to left when + /// [reverseCrossAxis] is true. + /// + /// Typically set to the return value of [axisDirectionIsReversed] applied to + /// the [SliverConstraints.crossAxisDirection]. + final bool reverseCrossAxis; + + /// The number of logical pixels from the leading edge of one row to the + /// leading edge of the next row. + double get _rowHeight { + return _monthItemRowHeight + _monthItemSpaceBetweenRows; + } + + /// The height in logical pixels of the children widgets. + double get _childHeight { + return _monthItemRowHeight; + } + + @override + int getMinChildIndexForScrollOffset(double scrollOffset) { + return crossAxisCount * (scrollOffset ~/ _rowHeight); + } + + @override + int getMaxChildIndexForScrollOffset(double scrollOffset) { + final int mainAxisCount = (scrollOffset / _rowHeight).ceil(); + return math.max(0, crossAxisCount * mainAxisCount - 1); + } + + double _getCrossAxisOffset(double crossAxisStart, bool isPadding) { + if (reverseCrossAxis) { + return + ((crossAxisCount - 2) * dayChildWidth + 2 * edgeChildWidth) - + crossAxisStart - + (isPadding ? edgeChildWidth : dayChildWidth); + } + return crossAxisStart; + } + + @override + SliverGridGeometry getGeometryForChildIndex(int index) { + final int adjustedIndex = index % crossAxisCount; + final bool isEdge = adjustedIndex == 0 || adjustedIndex == crossAxisCount - 1; + final double crossAxisStart = math.max(0, (adjustedIndex - 1) * dayChildWidth + edgeChildWidth); + + return SliverGridGeometry( + scrollOffset: (index ~/ crossAxisCount) * _rowHeight, + crossAxisOffset: _getCrossAxisOffset(crossAxisStart, isEdge), + mainAxisExtent: _childHeight, + crossAxisExtent: isEdge ? edgeChildWidth : dayChildWidth, + ); + } + + @override + double computeMaxScrollOffset(int childCount) { + assert(childCount >= 0); + final int mainAxisCount = ((childCount - 1) ~/ crossAxisCount) + 1; + final double mainAxisSpacing = _rowHeight - _childHeight; + return _rowHeight * mainAxisCount - mainAxisSpacing; + } +} + +/// Displays the days of a given month and allows choosing a date range. +/// +/// The days are arranged in a rectangular grid with one column for each day of +/// the week. +class _MonthItem extends StatefulWidget { + /// Creates a month item. + _MonthItem({ + required this.selectedDateStart, + required this.selectedDateEnd, + required this.currentDate, + required this.onChanged, + required this.firstDate, + required this.lastDate, + required this.displayedMonth, + this.dragStartBehavior = DragStartBehavior.start, + }) : assert(firstDate != null), + assert(lastDate != null), + assert(!firstDate.isAfter(lastDate)), + assert(selectedDateStart == null || !selectedDateStart.isBefore(firstDate)), + assert(selectedDateEnd == null || !selectedDateEnd.isBefore(firstDate)), + assert(selectedDateStart == null || !selectedDateStart.isAfter(lastDate)), + assert(selectedDateEnd == null || !selectedDateEnd.isAfter(lastDate)), + assert(selectedDateStart == null || selectedDateEnd == null || !selectedDateStart.isAfter(selectedDateEnd)), + assert(currentDate != null), + assert(onChanged != null), + assert(displayedMonth != null), + assert(dragStartBehavior != null); + + /// The currently selected start date. + /// + /// This date is highlighted in the picker. + final DateTime? selectedDateStart; + + /// The currently selected end date. + /// + /// This date is highlighted in the picker. + final DateTime? selectedDateEnd; + + /// The current date at the time the picker is displayed. + final DateTime currentDate; + + /// Called when the user picks a day. + final ValueChanged onChanged; + + /// The earliest date the user is permitted to pick. + final DateTime firstDate; + + /// The latest date the user is permitted to pick. + final DateTime lastDate; + + /// The month whose days are displayed by this picker. + final DateTime displayedMonth; + + /// Determines the way that drag start behavior is handled. + /// + /// If set to [DragStartBehavior.start], the drag gesture used to scroll a + /// date picker wheel will begin at the position where the drag gesture won + /// the arena. If set to [DragStartBehavior.down] it will begin at the position + /// where a down event is first detected. + /// + /// In general, setting this to [DragStartBehavior.start] will make drag + /// animation smoother and setting it to [DragStartBehavior.down] will make + /// drag behavior feel slightly more reactive. + /// + /// By default, the drag start behavior is [DragStartBehavior.start]. + /// + /// See also: + /// + /// * [DragGestureRecognizer.dragStartBehavior], which gives an example for + /// the different behaviors. + final DragStartBehavior dragStartBehavior; + + @override + _MonthItemState createState() => _MonthItemState(); +} + +class _MonthItemState extends State<_MonthItem> { + /// List of [FocusNode]s, one for each day of the month. + late List _dayFocusNodes; + + @override + void initState() { + super.initState(); + final int daysInMonth = DateUtils.getDaysInMonth(widget.displayedMonth.year, widget.displayedMonth.month); + _dayFocusNodes = List.generate( + daysInMonth, + (int index) => FocusNode(skipTraversal: true, debugLabel: 'Day ${index + 1}'), + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Check to see if the focused date is in this month, if so focus it. + final DateTime? focusedDate = _FocusedDate.of(context)?.date; + if (focusedDate != null && DateUtils.isSameMonth(widget.displayedMonth, focusedDate)) { + _dayFocusNodes[focusedDate.day - 1].requestFocus(); + } + } + + @override + void dispose() { + for (final FocusNode node in _dayFocusNodes) { + node.dispose(); + } + super.dispose(); + } + + Color _highlightColor(BuildContext context) { + return Theme.of(context).colorScheme.primary.withOpacity(0.12); + } + + void _dayFocusChanged(bool focused) { + if (focused) { + final TraversalDirection? focusDirection = _FocusedDate.of(context)?.scrollDirection; + if (focusDirection != null) { + ScrollPositionAlignmentPolicy policy = ScrollPositionAlignmentPolicy.explicit; + switch (focusDirection) { + case TraversalDirection.up: + case TraversalDirection.left: + policy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; + break; + case TraversalDirection.right: + case TraversalDirection.down: + policy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; + break; + } + Scrollable.ensureVisible(primaryFocus!.context!, + duration: _monthScrollDuration, + alignmentPolicy: policy, + ); + } + } + } + + Widget _buildDayItem(BuildContext context, DateTime dayToBuild, int firstDayOffset, int daysInMonth) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final TextTheme textTheme = theme.textTheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final TextDirection textDirection = Directionality.of(context); + final Color highlightColor = _highlightColor(context); + final int day = dayToBuild.day; + + final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); + + BoxDecoration? decoration; + TextStyle? itemStyle = textTheme.bodyMedium; + + final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; + final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); + final bool isSelectedDayEnd = widget.selectedDateEnd != null && dayToBuild.isAtSameMomentAs(widget.selectedDateEnd!); + final bool isInRange = isRangeSelected && + dayToBuild.isAfter(widget.selectedDateStart!) && + dayToBuild.isBefore(widget.selectedDateEnd!); + + _HighlightPainter? highlightPainter; + + if (isSelectedDayStart || isSelectedDayEnd) { + // The selected start and end dates gets a circle background + // highlight, and a contrasting text color. + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.onPrimary); + decoration = BoxDecoration( + color: colorScheme.primary, + shape: BoxShape.circle, + ); + + if (isRangeSelected && widget.selectedDateStart != widget.selectedDateEnd) { + final _HighlightPainterStyle style = isSelectedDayStart + ? _HighlightPainterStyle.highlightTrailing + : _HighlightPainterStyle.highlightLeading; + highlightPainter = _HighlightPainter( + color: highlightColor, + style: style, + textDirection: textDirection, + ); + } + } else if (isInRange) { + // The days within the range get a light background highlight. + highlightPainter = _HighlightPainter( + color: highlightColor, + style: _HighlightPainterStyle.highlightAll, + textDirection: textDirection, + ); + } else if (isDisabled) { + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.onSurface.withOpacity(0.38)); + } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { + // The current day gets a different text color and a circle stroke + // border. + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.primary); + decoration = BoxDecoration( + border: Border.all(color: colorScheme.primary), + shape: BoxShape.circle, + ); + } + + // We want the day of month to be spoken first irrespective of the + // locale-specific preferences or TextDirection. This is because + // an accessibility user is more likely to be interested in the + // day of month before the rest of the date, as they are looking + // for the day of month. To do that we prepend day of month to the + // formatted full date. + String semanticLabel = '${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}'; + if (isSelectedDayStart) { + semanticLabel = localizations.dateRangeStartDateSemanticLabel(semanticLabel); + } else if (isSelectedDayEnd) { + semanticLabel = localizations.dateRangeEndDateSemanticLabel(semanticLabel); + } + + Widget dayWidget = Container( + decoration: decoration, + child: Center( + child: Semantics( + label: semanticLabel, + selected: isSelectedDayStart || isSelectedDayEnd, + child: ExcludeSemantics( + child: Text(localizations.formatDecimal(day), style: itemStyle), + ), + ), + ), + ); + + if (highlightPainter != null) { + dayWidget = CustomPaint( + painter: highlightPainter, + child: dayWidget, + ); + } + + if (!isDisabled) { + dayWidget = InkResponse( + focusNode: _dayFocusNodes[day - 1], + onTap: () => widget.onChanged(dayToBuild), + radius: _monthItemRowHeight / 2 + 4, + splashColor: colorScheme.primary.withOpacity(0.38), + onFocusChange: _dayFocusChanged, + child: dayWidget, + ); + } + + return dayWidget; + } + + Widget _buildEdgeContainer(BuildContext context, bool isHighlighted) { + return Container(color: isHighlighted ? _highlightColor(context) : null); + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final int year = widget.displayedMonth.year; + final int month = widget.displayedMonth.month; + final int daysInMonth = DateUtils.getDaysInMonth(year, month); + final int dayOffset = DateUtils.firstDayOffset(year, month, localizations); + final int weeks = ((daysInMonth + dayOffset) / DateTime.daysPerWeek).ceil(); + final double gridHeight = + weeks * _monthItemRowHeight + (weeks - 1) * _monthItemSpaceBetweenRows; + final List dayItems = []; + + for (int i = 0; true; i += 1) { + // 1-based day of month, e.g. 1-31 for January, and 1-29 for February on + // a leap year. + final int day = i - dayOffset + 1; + if (day > daysInMonth) { + break; + } + if (day < 1) { + dayItems.add(Container()); + } else { + final DateTime dayToBuild = DateTime(year, month, day); + final Widget dayItem = _buildDayItem( + context, + dayToBuild, + dayOffset, + daysInMonth, + ); + dayItems.add(dayItem); + } + } + + // Add the leading/trailing edge containers to each week in order to + // correctly extend the range highlight. + final List paddedDayItems = []; + for (int i = 0; i < weeks; i++) { + final int start = i * DateTime.daysPerWeek; + final int end = math.min( + start + DateTime.daysPerWeek, + dayItems.length, + ); + final List weekList = dayItems.sublist(start, end); + + final DateTime dateAfterLeadingPadding = DateTime(year, month, start - dayOffset + 1); + // Only color the edge container if it is after the start date and + // on/before the end date. + final bool isLeadingInRange = + !(dayOffset > 0 && i == 0) && + widget.selectedDateStart != null && + widget.selectedDateEnd != null && + dateAfterLeadingPadding.isAfter(widget.selectedDateStart!) && + !dateAfterLeadingPadding.isAfter(widget.selectedDateEnd!); + weekList.insert(0, _buildEdgeContainer(context, isLeadingInRange)); + + // Only add a trailing edge container if it is for a full week and not a + // partial week. + if (end < dayItems.length || (end == dayItems.length && dayItems.length % DateTime.daysPerWeek == 0)) { + final DateTime dateBeforeTrailingPadding = + DateTime(year, month, end - dayOffset); + // Only color the edge container if it is on/after the start date and + // before the end date. + final bool isTrailingInRange = + widget.selectedDateStart != null && + widget.selectedDateEnd != null && + !dateBeforeTrailingPadding.isBefore(widget.selectedDateStart!) && + dateBeforeTrailingPadding.isBefore(widget.selectedDateEnd!); + weekList.add(_buildEdgeContainer(context, isTrailingInRange)); + } + + paddedDayItems.addAll(weekList); + } + + final double maxWidth = MediaQuery.of(context).orientation == Orientation.landscape + ? _maxCalendarWidthLandscape + : _maxCalendarWidthPortrait; + return Column( + children: [ + Container( + constraints: BoxConstraints(maxWidth: maxWidth), + height: _monthItemHeaderHeight, + padding: const EdgeInsets.symmetric(horizontal: 16), + alignment: AlignmentDirectional.centerStart, + child: ExcludeSemantics( + child: Text( + localizations.formatMonthYear(widget.displayedMonth), + style: textTheme.bodyMedium!.apply(color: themeData.colorScheme.onSurface), + ), + ), + ), + Container( + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: gridHeight, + ), + child: GridView.custom( + physics: const NeverScrollableScrollPhysics(), + gridDelegate: _monthItemGridDelegate, + childrenDelegate: SliverChildListDelegate( + paddedDayItems, + addRepaintBoundaries: false, + ), + ), + ), + const SizedBox(height: _monthItemFooterHeight), + ], + ); + } +} + +/// Determines which style to use to paint the highlight. +enum _HighlightPainterStyle { + /// Paints nothing. + none, + + /// Paints a rectangle that occupies the leading half of the space. + highlightLeading, + + /// Paints a rectangle that occupies the trailing half of the space. + highlightTrailing, + + /// Paints a rectangle that occupies all available space. + highlightAll, +} + +/// This custom painter will add a background highlight to its child. +/// +/// This highlight will be drawn depending on the [style], [color], and +/// [textDirection] supplied. It will either paint a rectangle on the +/// left/right, a full rectangle, or nothing at all. This logic is determined by +/// a combination of the [style] and [textDirection]. +class _HighlightPainter extends CustomPainter { + _HighlightPainter({ + required this.color, + this.style = _HighlightPainterStyle.none, + this.textDirection, + }); + + final Color color; + final _HighlightPainterStyle style; + final TextDirection? textDirection; + + @override + void paint(Canvas canvas, Size size) { + if (style == _HighlightPainterStyle.none) { + return; + } + + final Paint paint = Paint() + ..color = color + ..style = PaintingStyle.fill; + + final Rect rectLeft = Rect.fromLTWH(0, 0, size.width / 2, size.height); + final Rect rectRight = Rect.fromLTWH(size.width / 2, 0, size.width / 2, size.height); + + switch (style) { + case _HighlightPainterStyle.highlightTrailing: + canvas.drawRect( + textDirection == TextDirection.ltr ? rectRight : rectLeft, + paint, + ); + break; + case _HighlightPainterStyle.highlightLeading: + canvas.drawRect( + textDirection == TextDirection.ltr ? rectLeft : rectRight, + paint, + ); + break; + case _HighlightPainterStyle.highlightAll: + canvas.drawRect( + Rect.fromLTWH(0, 0, size.width, size.height), + paint, + ); + break; + case _HighlightPainterStyle.none: + break; + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; +} + +class _InputDateRangePickerDialog extends StatelessWidget { + const _InputDateRangePickerDialog({ + required this.selectedStartDate, + required this.selectedEndDate, + required this.currentDate, + required this.picker, + required this.onConfirm, + required this.onCancel, + required this.confirmText, + required this.cancelText, + required this.helpText, + required this.entryModeButton, + }); + + final DateTime? selectedStartDate; + final DateTime? selectedEndDate; + final DateTime? currentDate; + final Widget picker; + final VoidCallback onConfirm; + final VoidCallback onCancel; + final String? confirmText; + final String? cancelText; + final String? helpText; + final Widget? entryModeButton; + + String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final String startText = _formatRangeStartDate(localizations, start, end); + final String endText = _formatRangeEndDate(localizations, start, end, now); + if (start == null || end == null) { + return localizations.unspecifiedDateRange; + } + if (Directionality.of(context) == TextDirection.ltr) { + return '$startText – $endText'; + } else { + return '$endText – $startText'; + } + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final Orientation orientation = MediaQuery.of(context).orientation; + final TextTheme textTheme = theme.textTheme; + + final Color onPrimarySurfaceColor = colorScheme.brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onSurface; + final TextStyle? dateStyle = orientation == Orientation.landscape + ? textTheme.bodySmall?.apply(color: onPrimarySurfaceColor) + : textTheme.bodyMedium?.apply(color: onPrimarySurfaceColor); + final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); + final String semanticDateText = selectedStartDate != null && selectedEndDate != null + ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' + : ''; + + final Widget header = _DatePickerHeader( + helpText: helpText ?? localizations.dateRangePickerHelpText, + titleText: dateText, + titleSemanticsLabel: semanticDateText, + titleStyle: dateStyle, + orientation: orientation, + isShort: orientation == Orientation.landscape, + entryModeButton: entryModeButton, + ); + + final Widget actions = Container( + alignment: AlignmentDirectional.centerEnd, + constraints: const BoxConstraints(minHeight: 52.0), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: OverflowBar( + spacing: 8, + children: [ + TextButton( + onPressed: onCancel, + child: Text(cancelText ?? localizations.cancelButtonLabel), + ), + TextButton( + onPressed: onConfirm, + child: Text(confirmText ?? localizations.okButtonLabel), + ), + ], + ), + ); + + switch (orientation) { + case Orientation.portrait: + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Expanded(child: picker), + actions, + ], + ); + + case Orientation.landscape: + return Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + header, + Flexible( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded(child: picker), + actions, + ], + ), + ), + ], + ); + } + } +} + +/// Provides a pair of text fields that allow the user to enter the start and +/// end dates that represent a range of dates. +class _InputDateRangePicker extends StatefulWidget { + /// Creates a row with two text fields configured to accept the start and end dates + /// of a date range. + _InputDateRangePicker({ + super.key, + DateTime? initialStartDate, + DateTime? initialEndDate, + required DateTime firstDate, + required DateTime lastDate, + required this.onStartDateChanged, + required this.onEndDateChanged, + this.helpText, + this.errorFormatText, + this.errorInvalidText, + this.errorInvalidRangeText, + this.fieldStartHintText, + this.fieldEndHintText, + this.fieldStartLabelText, + this.fieldEndLabelText, + this.autofocus = false, + this.autovalidate = false, + }) : initialStartDate = initialStartDate == null ? null : DateUtils.dateOnly(initialStartDate), + initialEndDate = initialEndDate == null ? null : DateUtils.dateOnly(initialEndDate), + assert(firstDate != null), + firstDate = DateUtils.dateOnly(firstDate), + assert(lastDate != null), + lastDate = DateUtils.dateOnly(lastDate), + assert(firstDate != null), + assert(lastDate != null), + assert(autofocus != null), + assert(autovalidate != null); + + /// The [DateTime] that represents the start of the initial date range selection. + final DateTime? initialStartDate; + + /// The [DateTime] that represents the end of the initial date range selection. + final DateTime? initialEndDate; + + /// The earliest allowable [DateTime] that the user can select. + final DateTime firstDate; + + /// The latest allowable [DateTime] that the user can select. + final DateTime lastDate; + + /// Called when the user changes the start date of the selected range. + final ValueChanged? onStartDateChanged; + + /// Called when the user changes the end date of the selected range. + final ValueChanged? onEndDateChanged; + + /// The text that is displayed at the top of the header. + /// + /// This is used to indicate to the user what they are selecting a date for. + final String? helpText; + + /// Error text used to indicate the text in a field is not a valid date. + final String? errorFormatText; + + /// Error text used to indicate the date in a field is not in the valid range + /// of [firstDate] - [lastDate]. + final String? errorInvalidText; + + /// Error text used to indicate the dates given don't form a valid date + /// range (i.e. the start date is after the end date). + final String? errorInvalidRangeText; + + /// Hint text shown when the start date field is empty. + final String? fieldStartHintText; + + /// Hint text shown when the end date field is empty. + final String? fieldEndHintText; + + /// Label used for the start date field. + final String? fieldStartLabelText; + + /// Label used for the end date field. + final String? fieldEndLabelText; + + /// {@macro flutter.widgets.editableText.autofocus} + final bool autofocus; + + /// If true, this the date fields will validate and update their error text + /// immediately after every change. Otherwise, you must call + /// [_InputDateRangePickerState.validate] to validate. + final bool autovalidate; + + @override + _InputDateRangePickerState createState() => _InputDateRangePickerState(); +} + +/// The current state of an [_InputDateRangePicker]. Can be used to +/// [validate] the date field entries. +class _InputDateRangePickerState extends State<_InputDateRangePicker> { + late String _startInputText; + late String _endInputText; + DateTime? _startDate; + DateTime? _endDate; + late TextEditingController _startController; + late TextEditingController _endController; + String? _startErrorText; + String? _endErrorText; + bool _autoSelected = false; + + @override + void initState() { + super.initState(); + _startDate = widget.initialStartDate; + _startController = TextEditingController(); + _endDate = widget.initialEndDate; + _endController = TextEditingController(); + } + + @override + void dispose() { + _startController.dispose(); + _endController.dispose(); + super.dispose(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + if (_startDate != null) { + _startInputText = localizations.formatCompactDate(_startDate!); + final bool selectText = widget.autofocus && !_autoSelected; + _updateController(_startController, _startInputText, selectText); + _autoSelected = selectText; + } + + if (_endDate != null) { + _endInputText = localizations.formatCompactDate(_endDate!); + _updateController(_endController, _endInputText, false); + } + } + + /// Validates that the text in the start and end fields represent a valid + /// date range. + /// + /// Will return true if the range is valid. If not, it will + /// return false and display an appropriate error message under one of the + /// text fields. + bool validate() { + String? startError = _validateDate(_startDate); + final String? endError = _validateDate(_endDate); + if (startError == null && endError == null) { + if (_startDate!.isAfter(_endDate!)) { + startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel; + } + } + setState(() { + _startErrorText = startError; + _endErrorText = endError; + }); + return startError == null && endError == null; + } + + DateTime? _parseDate(String? text) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + return localizations.parseCompactDate(text); + } + + String? _validateDate(DateTime? date) { + if (date == null) { + return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel; + } else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) { + return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel; + } + return null; + } + + void _updateController(TextEditingController controller, String text, bool selectText) { + TextEditingValue textEditingValue = controller.value.copyWith(text: text); + if (selectText) { + textEditingValue = textEditingValue.copyWith(selection: TextSelection( + baseOffset: 0, + extentOffset: text.length, + )); + } + controller.value = textEditingValue; + } + + void _handleStartChanged(String text) { + setState(() { + _startInputText = text; + _startDate = _parseDate(text); + widget.onStartDateChanged?.call(_startDate); + }); + if (widget.autovalidate) { + validate(); + } + } + + void _handleEndChanged(String text) { + setState(() { + _endInputText = text; + _endDate = _parseDate(text); + widget.onEndDateChanged?.call(_endDate); + }); + if (widget.autovalidate) { + validate(); + } + } + + @override + Widget build(BuildContext context) { + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final InputDecorationTheme inputTheme = Theme.of(context).inputDecorationTheme; + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: TextField( + controller: _startController, + decoration: InputDecoration( + border: inputTheme.border ?? const UnderlineInputBorder(), + filled: inputTheme.filled, + hintText: widget.fieldStartHintText ?? localizations.dateHelpText, + labelText: widget.fieldStartLabelText ?? localizations.dateRangeStartLabel, + errorText: _startErrorText, + ), + keyboardType: TextInputType.datetime, + onChanged: _handleStartChanged, + autofocus: widget.autofocus, + ), + ), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: _endController, + decoration: InputDecoration( + border: inputTheme.border ?? const UnderlineInputBorder(), + filled: inputTheme.filled, + hintText: widget.fieldEndHintText ?? localizations.dateHelpText, + labelText: widget.fieldEndLabelText ?? localizations.dateRangeEndLabel, + errorText: _endErrorText, + ), + keyboardType: TextInputType.datetime, + onChanged: _handleEndChanged, + ), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json new file mode 100644 index 00000000..dd521501 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Dekorierte Box-Übergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Decorated verwendet, um eine Übergangsanimation zwischen zwei Decorated-Objekten für die Kindkomponente durchzuführen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DecoratedBoxTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【position】 : Vordergrund-/Hintergrundfarbe 【DecorationPosition】", + "【decoration】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json new file mode 100644 index 00000000..49466d8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Decoration Transition", + "info": "A subclass of AnimatedWidget that uses a Decorated type animator to allow child components to transition between two Decorated objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DecoratedBoxTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【position】: Foreground/Background color 【DecorationPosition】", + "【decoration】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json new file mode 100644 index 00000000..a8cbf440 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transición de caja decorada", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Decorated para permitir que los componentes secundarios realicen una animación de transición entre dos objetos Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DecoratedBoxTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【position】 : Color de primer plano/fondo 【DecorationPosition】", + "【decoration】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json new file mode 100644 index 00000000..20bd975f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transition de boîte décorée", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Decorated pour permettre à un composant enfant de faire une transition animée entre deux objets Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DecoratedBoxTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【position】 : Couleur de premier plan/arrière-plan 【DecorationPosition】", + "【decoration】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json new file mode 100644 index 00000000..bad2bb5e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transizione Decorata", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Decorated per far sì che i componenti figli eseguano un'animazione di transizione tra due oggetti Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di DecoratedBoxTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【position】 : Colore di primo piano/sfondo 【DecorationPosition】", + "【decoration】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json new file mode 100644 index 00000000..7b3d731a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "装飾変換", + "info": "AnimatedWidgetのサブクラスで、Decoratedタイプのアニメーターを使用して、子コンポーネントが2つのDecoratedオブジェクト間で遷移アニメーションを行うようにします。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【position】 : 前景/背景色 【DecorationPosition】", + "【decoration】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json new file mode 100644 index 00000000..85687415 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "장식 변환", + "info": "AnimatedWidget의 하위 클래스, Decorated 타입의 애니메이터를 사용하여 자식 위젯이 두 Decorated 객체 간에 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【position】 : 전경/배경색 【DecorationPosition】", + "【decoration】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json new file mode 100644 index 00000000..1cd6907f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transição Decorada", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Decorated para permitir que os componentes filhos realizem uma animação de transição entre dois objetos Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DecoratedBoxTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【position】 : Cor de frente/fundo 【DecorationPosition】", + "【decoration】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json new file mode 100644 index 00000000..665d61b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Декорированный переход", + "info": "Подкласс AnimatedWidget, использует аниматор типа Decorated для создания переходной анимации между двумя объектами Decorated для дочерних компонентов.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DecoratedBoxTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【position】 : Передний/фоновый цвет 【DecorationPosition】", + "【decoration】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json new file mode 100644 index 00000000..6731cee6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "装饰变换", + "info": "AnimatedWidget的子类,使用Decorated类型的动画器让子组件在两个Decorated对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【position】 : 前/背景色 【DecorationPosition】", + "【decoration】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart new file mode 100644 index 00000000..1eced443 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomDecoratedBoxTransition extends StatefulWidget { + const CustomDecoratedBoxTransition({Key? key}) : super(key: key); + + @override + _CustomDecoratedBoxTransitionState createState() => + _CustomDecoratedBoxTransitionState(); +} + +class _CustomDecoratedBoxTransitionState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 1), + ); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: SizedBox( + width: 200, + height: 100, + child: DecoratedBoxTransition( + position: DecorationPosition.background, + decoration: DecorationTween( + begin: const BoxDecoration( + color: Colors.greenAccent, + borderRadius: BorderRadius.all(Radius.circular(50)), + boxShadow: [ + BoxShadow( + offset: Offset(1, 1), + color: Colors.purple, + blurRadius: 3, + spreadRadius: 1) + ]), + end: const BoxDecoration( + color: Colors.orange, + borderRadius: BorderRadius.all(Radius.circular(10)), + boxShadow: [ + BoxShadow( + offset: Offset(1, 1), + color: Colors.blue, + blurRadius: 1, + spreadRadius: 0) + ])).animate(_ctrl), + child: const Icon(Icons.android, color: Colors.white, size: 60), + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json new file mode 100644 index 00000000..c4196581 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Standard-Tab-Controller", + "info": "Bei der Verwendung von TabBar und TabBarView ist ein gemeinsamer Controller erforderlich, um die Steuerung der Tabs und Seiten zu implementieren. DefaultTabController bietet einen Standard-Controller, wenn kein Controller angegeben ist, und vereinfacht die Verwendung.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DefaultTabController", + "desc": [ + "【length】 : Anzahl der Tabs 【int】", + "【initialIndex】 : Anfänglicher Tab-Index 【int】", + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json new file mode 100644 index 00000000..29fa51ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Default Tab Controller", + "info": "When using TabBar and TabBarView, the same controller is needed to control both the tabs and the pages. DefaultTabController provides a default controller when no controller is specified, simplifying usage.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DefaultTabController", + "desc": [ + "【length】: Number of tabs 【int】", + "【initialIndex】: Initial tab index 【int】", + "【child】: Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json new file mode 100644 index 00000000..b21625e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controlador de pestañas predeterminado", + "info": "Al usar TabBar y TabBarView, se necesita el mismo controlador para controlar las pestañas y las páginas. DefaultTabController proporciona un controlador predeterminado cuando no se especifica uno, simplificando su uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DefaultTabController", + "desc": [ + "【length】 : Número de pestañas 【int】", + "【initialIndex】 : Índice inicial de la pestaña 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json new file mode 100644 index 00000000..6429435c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Contrôleur d'onglets par défaut", + "info": "Lors de l'utilisation de TabBar et TabBarView, il est nécessaire qu'un même contrôleur gère à la fois les onglets et les pages. DefaultTabController fournit un contrôleur par défaut lorsqu'aucun contrôleur n'est spécifié, simplifiant ainsi son utilisation.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DefaultTabController", + "desc": [ + "【length】 : Nombre d'onglets 【int】", + "【initialIndex】 : Index de l'onglet initial 【int】", + "【child】 : Composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json new file mode 100644 index 00000000..53653e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controllore di schede predefinito", + "info": "Quando si utilizza TabBar e TabBarView, è necessario che lo stesso controllore gestisca sia le schede che le pagine. DefaultTabController fornisce un controllore predefinito quando non ne viene specificato uno, semplificando l'uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DefaultTabController", + "desc": [ + "【length】 : Numero di schede 【int】", + "【initialIndex】 : Indice della scheda iniziale 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json new file mode 100644 index 00000000..a78257ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "デフォルトタブコントローラー", + "info": "TabBarとTabBarViewを使用する場合、同じコントローラーでタブとページの制御を実現する必要があります。DefaultTabControllerは、コントローラーが指定されていない場合にデフォルトのコントローラーを提供し、使用を簡素化します。", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabControllerの基本的な使用法", + "desc": [ + "【length】 : タブの数 【int】", + "【initialIndex】 : 初期タブインデックス 【int】", + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json new file mode 100644 index 00000000..5608a9a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "기본 탭 컨트롤러", + "info": "TabBar와 TabBarView를 사용할 때, 동일한 컨트롤러가 탭과 페이지를 제어해야 합니다. DefaultTabController는 컨트롤러가 지정되지 않았을 때 기본 컨트롤러를 제공하여 사용을 단순화합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabController 기본 사용", + "desc": [ + "【length】 : 탭 수 【int】", + "【initialIndex】 : 초기 탭 인덱스 【int】", + "【child】 : 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json new file mode 100644 index 00000000..010a806d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controlador de Abas Padrão", + "info": "Ao usar TabBar e TabBarView, é necessário que o mesmo controlador implemente o controle das abas e das páginas. O DefaultTabController fornece um controlador padrão quando nenhum controlador é especificado, simplificando o uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DefaultTabController", + "desc": [ + "【length】 : Número de abas 【int】", + "【initialIndex】 : Índice inicial da aba 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json new file mode 100644 index 00000000..09e795e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Контроллер вкладок по умолчанию", + "info": "При использовании TabBar и TabBarView требуется один и тот же контроллер для управления вкладками и страницами. DefaultTabController предоставляет контроллер по умолчанию, если он не указан, что упрощает использование.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DefaultTabController", + "desc": [ + "【length】 : Количество вкладок 【int】", + "【initialIndex】 : Начальный индекс вкладки 【int】", + "【child】 : Компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json new file mode 100644 index 00000000..51d6dc7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "默认页签控制器", + "info": "在使用 TabBar 和 TabBarView 时,需要同一个控制器实现页签和页面的控制。DefaultTabController 会在未指定控制器时提供默认控制器,简化使用。", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabController基本使用", + "desc": [ + "【length】 : 页签数量 【int】", + "【initialIndex】 : 初始页签索引 【int】", + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart new file mode 100644 index 00000000..3e04b515 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class DefaultTabControllerDemo extends StatelessWidget { + final List tabs = const [ + Tab(text: '青眼白龙'), + Tab(text: '黑魔术师'), + Tab(text: '混沌战士'), + ]; + + const DefaultTabControllerDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: DefaultTabController( + length: tabs.length, + child: Scaffold( + appBar: AppBar( + title: const Text("DefaultTabController"), + bottom: TabBar( + tabs: tabs, + ), + ), + body: TabBarView( + children: tabs.map((Tab tab) { + return Center( + child: Text( + '${tab.text}', + style: const TextStyle(fontSize: 20), + ), + ); + }).toList(), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json new file mode 100644 index 00000000..34d04c2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Textstilübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ TextStyle verwendet, um Textkomponenten zwischen zwei TextStyle-Objekten zu animieren.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DefaultTextStyleTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【textAlign】 : Textausrichtung 【TextAlign】", + "【softWrap】 : Umbrüche aktivieren 【bool】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【overflow】 : Überlaufmodus 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json new file mode 100644 index 00000000..2225e1be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Text Style Transition", + "info": "A subclass of AnimatedWidget, using a TextStyle type animator to transition text components between two TextStyle objects.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DefaultTextStyleTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【textAlign】 : Text alignment 【TextAlign】", + "【softWrap】 : Whether to wrap 【bool】", + "【maxLines】 : Maximum number of lines 【int】", + "【overflow】 : Overflow mode 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json new file mode 100644 index 00000000..2e865c01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transición de Estilo de Texto", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo TextStyle para permitir que los componentes de texto realicen una transición animada entre dos objetos TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DefaultTextStyleTransition", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【softWrap】 : Si debe envolver 【bool】", + "【maxLines】 : Número máximo de líneas 【int】", + "【overflow】 : Modo de desbordamiento 【TextOverflow】", + "【style】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json new file mode 100644 index 00000000..42a88a16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transition de style de texte", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type TextStyle pour permettre à un composant de texte de faire une transition animée entre deux objets TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DefaultTextStyleTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【softWrap】 : Enveloppement 【bool】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【overflow】 : Mode de débordement 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json new file mode 100644 index 00000000..5e229f8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transizione dello stile del testo", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo TextStyle per far sì che i componenti di testo eseguano un'animazione di transizione tra due oggetti TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DefaultTextStyleTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【softWrap】 : Se avvolgere 【bool】", + "【maxLines】 : Numero massimo di righe 【int】", + "【overflow】 : Modalità di overflow 【TextOverflow】", + "【style】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json new file mode 100644 index 00000000..3eb5d725 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "テキストスタイルの切り替え", + "info": "AnimatedWidgetのサブクラスで、TextStyleタイプのアニメーターを使用して、テキストコンポーネントが2つのTextStyleオブジェクト間でトランジションアニメーションを行います。", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【softWrap】 : ラップするかどうか 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : オーバーフローモード 【TextOverflow】", + "【style】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json new file mode 100644 index 00000000..2e3f8d7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "텍스트 스타일 전환", + "info": "AnimatedWidget의 하위 클래스로, TextStyle 타입의 애니메이터를 사용하여 텍스트 컴포넌트가 두 TextStyle 객체 사이에서 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransition 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【softWrap】 : 감싸기 여부 【bool】", + "【maxLines】 : 최대 줄 수 【int】", + "【overflow】 : 오버플로우 모드 【TextOverflow】", + "【style】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json new file mode 100644 index 00000000..32515881 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transição de Estilo de Texto", + "info": "Subclasse de AnimatedWidget, utiliza um animador do tipo TextStyle para permitir que componentes de texto façam uma transição animada entre dois objetos TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de DefaultTextStyleTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【softWrap】 : Se deve envolver 【bool】", + "【maxLines】 : Número máximo de linhas 【int】", + "【overflow】 : Modo de overflow 【TextOverflow】", + "【style】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json new file mode 100644 index 00000000..06190b7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Анимация стиля текста", + "info": "Подкласс AnimatedWidget, использует аниматор типа TextStyle для создания анимации перехода между двумя объектами TextStyle в текстовых компонентах.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DefaultTextStyleTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【softWrap】 : Обернуть ли текст 【bool】", + "【maxLines】 : Максимальное количество строк 【int】", + "【overflow】 : Режим переполнения 【TextOverflow】", + "【style】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json new file mode 100644 index 00000000..bd6649d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "文字样式变换", + "info": "AnimatedWidget的子类,使用TextStyle类型的动画器让文字组件在两个TextStyle对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【softWrap】 : 是否包裹 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : 溢出模式 【TextOverflow】", + "【style】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart new file mode 100644 index 00000000..da7853e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomDefaultTextStyleTransition extends StatefulWidget { + const CustomDefaultTextStyleTransition({Key? key}) : super(key: key); + + @override + _CustomDefaultTextStyleTransitionState createState() => + _CustomDefaultTextStyleTransitionState(); +} + +class _CustomDefaultTextStyleTransitionState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 1), + ); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + setState(() { + _ctrl.reset(); + _ctrl.forward(); + }); + }, + child: Container( + alignment: Alignment.center, + width: 300, + height: 100, + child: DefaultTextStyleTransition( + textAlign: TextAlign.start, + softWrap: true, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyleTween( + begin: const TextStyle( + color: Colors.blue, + fontSize: 50, + shadows: [ + Shadow( + offset: Offset(1, 1), + color: Colors.black, + blurRadius: 3) + ]), + end: const TextStyle( + color: Colors.white, + fontSize: 20, + shadows: [ + Shadow( + offset: Offset(1, 1), + color: Colors.purple, + blurRadius: 3) + ])).animate(_ctrl), + child: const Text('张风捷特烈'), + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json new file mode 100644 index 00000000..cb6cb1f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Wischbar", + "info": "Beim Wischen kann die untere Komponente angezeigt werden, die Wischrichtung und die seitliche Verschiebung können angegeben werden. Empfängt Rückrufe bei Bestätigung des Verschwindens und beim Verschwinden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Dismissible", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【background】 : Linke Unterseite 【Widget】", + "【secondaryBackground】 : Rechte Unterseite 【Widget】", + "【key】 : Schlüssel 【Key】", + "【confirmDismiss】 : Bestätigungsrückruf 【DismissDirectionCallback】", + "【onDismissed】 : Rückruf beim Verschwinden 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Grundlegende Verwendung von Dismissible", + "desc": [ + "【direction】 : Richtung 【DismissDirection】", + "【crossAxisEndOffset】 : Verschiebung 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json new file mode 100644 index 00000000..647ec0b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Swipe to Dismiss", + "info": "When swiping, the bottom component can be displayed, and the direction of the swipe and the offset of the cross axis can be specified. Receives callbacks for confirming dismissal and when dismissed.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Dismissible", + "desc": [ + "【child】: Child component 【Widget】", + "【background】: Left bottom 【Widget】", + "【secondaryBackground】: Right bottom 【Widget】", + "【key】: Key 【Key】", + "【confirmDismiss】: Confirmation callback 【DismissDirectionCallback】", + "【onDismissed】: Dismissal callback 【DismissDirectionCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Basic Usage of Dismissible", + "desc": [ + "【direction】: Direction 【DismissDirection】", + "【crossAxisEndOffset】: Offset 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json new file mode 100644 index 00000000..d128f79e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Deslizar para desaparecer", + "info": "Al deslizar, se puede mostrar el componente inferior. Se puede especificar la dirección del deslizamiento y el desplazamiento del eje cruzado. Recibe devoluciones de llamada de confirmación de desaparición y desaparición.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Dismissible", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【background】 : Fondo izquierdo 【Widget】", + "【secondaryBackground】 : Fondo derecho 【Widget】", + "【key】 : Clave 【Key】", + "【confirmDismiss】 : Devolución de llamada de confirmación 【DismissDirectionCallback】", + "【onDismissed】 : Devolución de llamada de desaparición 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso básico de Dismissible", + "desc": [ + "【direction】 : Dirección 【DismissDirection】", + "【crossAxisEndOffset】 : Desplazamiento 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json new file mode 100644 index 00000000..03d61cd7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Glissement pour disparaître", + "info": "Lors du glissement, le composant inférieur peut être affiché. Il est possible de spécifier la direction du glissement et le décalage de l'axe croisé. Reçoit des rappels de confirmation de disparition et de disparition.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Dismissible", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【background】 : Fond gauche 【Widget】", + "【secondaryBackground】 : Fond droit 【Widget】", + "【key】 : Clé 【Key】", + "【confirmDismiss】 : Rappel de confirmation 【DismissDirectionCallback】", + "【onDismissed】 : Rappel de disparition 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Utilisation de base de Dismissible", + "desc": [ + "【direction】 : Direction 【DismissDirection】", + "【crossAxisEndOffset】 : Décalage 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json new file mode 100644 index 00000000..96b27475 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Scorrimento per eliminare", + "info": "Durante lo scorrimento è possibile visualizzare il componente sottostante, è possibile specificare la direzione dello scorrimento e l'offset dell'asse trasversale. Riceve callback di conferma eliminazione e di eliminazione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Dismissible", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【background】 : fondo sinistro 【Widget】", + "【secondaryBackground】 : fondo destro 【Widget】", + "【key】 : chiave 【Key】", + "【confirmDismiss】 : callback di conferma 【DismissDirectionCallback】", + "【onDismissed】 : callback di eliminazione 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso di base di Dismissible", + "desc": [ + "【direction】 : direzione 【DismissDirection】", + "【crossAxisEndOffset】 : offset 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json new file mode 100644 index 00000000..4f656b32 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "スワイプで消える", + "info": "スワイプ時に下部コンポーネントを表示でき、スワイプの方向と交差軸のオフセットを指定できます。確認消失と消失時のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissibleの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【background】 : 左底 【Widget】", + "【secondaryBackground】 : 右底 【Widget】", + "【key】 : キー 【Key】", + "【confirmDismiss】 : 確認コールバック 【DismissDirectionCallback】", + "【onDismissed】 : 消失コールバック 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissibleの基本使用", + "desc": [ + "【direction】 : 方向 【DismissDirection】", + "【crossAxisEndOffset】 : オフセット 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json new file mode 100644 index 00000000..9d03c028 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "슬라이드로 사라짐", + "info": "슬라이드 시 하위 컴포넌트를 표시할 수 있으며, 슬라이드 방향과 교차 축의 오프셋을 지정할 수 있습니다. 사라짐 확인 및 사라짐 시 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissible 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【background】 : 왼쪽 하단 【Widget】", + "【secondaryBackground】 : 오른쪽 하단 【Widget】", + "【key】 : 키 【Key】", + "【confirmDismiss】 : 확인 콜백 【DismissDirectionCallback】", + "【onDismissed】 : 사라짐 콜백 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissible 기본 사용", + "desc": [ + "【direction】 : 방향 【DismissDirection】", + "【crossAxisEndOffset】 : 오프셋 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json new file mode 100644 index 00000000..0a9c30ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Deslizar para desaparecer", + "info": "Ao deslizar, o componente inferior pode ser exibido, e a direção do deslize e o deslocamento do eixo cruzado podem ser especificados. Recebe retornos de chamada para confirmação de desaparecimento e desaparecimento.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Dismissible", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【background】 : Fundo esquerdo 【Widget】", + "【secondaryBackground】 : Fundo direito 【Widget】", + "【key】 : Chave 【Key】", + "【confirmDismiss】 : Retorno de chamada de confirmação 【DismissDirectionCallback】", + "【onDismissed】 : Retorno de chamada de desaparecimento 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso básico do Dismissible", + "desc": [ + "【direction】 : Direção 【DismissDirection】", + "【crossAxisEndOffset】 : Deslocamento 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json new file mode 100644 index 00000000..128c3c9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Скользящее исчезновение", + "info": "При скольжении можно отобразить компонент внизу, можно указать направление скольжения и смещение по поперечной оси. Получает обратные вызовы при подтверждении исчезновения и исчезновении.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Dismissible", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【background】 : Левый низ 【Widget】", + "【secondaryBackground】 : Правый низ 【Widget】", + "【key】 : Ключ 【Key】", + "【confirmDismiss】 : Обратный вызов подтверждения 【DismissDirectionCallback】", + "【onDismissed】 : Обратный вызов исчезновения 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Основное использование Dismissible", + "desc": [ + "【direction】 : Направление 【DismissDirection】", + "【crossAxisEndOffset】 : Смещение 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json new file mode 100644 index 00000000..f4f9ae05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "滑动消失", + "info": "滑动时可显示底部组件,可指定滑动的方向和交叉轴的偏移量。接收确认消失和消失时的回调。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissible基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【background】 : 左底 【Widget】", + "【secondaryBackground】 : 右底 【Widget】", + "【key】 : 键 【Key】", + "【confirmDismiss】 : 确认回调 【DismissDirectionCallback】", + "【onDismissed】 : 消失回调 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissible基本使用", + "desc": [ + "【direction】 : 方向 【DismissDirection】", + "【crossAxisEndOffset】 : 偏移 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart new file mode 100644 index 00000000..06622ddd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomDismissible extends StatefulWidget { + const CustomDismissible({Key? key}) : super(key: key); + + @override + _CustomDismissibleState createState() => _CustomDismissibleState(); +} + +class _CustomDismissibleState extends State { + final List data = [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Widget _buildItem(Color color) { + return Dismissible( + background: Container( + color: Colors.green, + alignment: const Alignment(-0.9, 0), + child: const Icon( + Icons.check, + color: Colors.white, + ), + ), + secondaryBackground: Container( + alignment: const Alignment(0.9, 0), + child: const Icon( + Icons.close, + color: Colors.white, + ), + color: Colors.red, + ), + key: ValueKey(color), + onDismissed: (d) { + data.remove(color); + }, + confirmDismiss: (e) async { + if (e == DismissDirection.endToStart) { + return true; + } else { + return false; + } + }, + child: Container( + alignment: Alignment.center, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart new file mode 100644 index 00000000..66ee53a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart @@ -0,0 +1,99 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class DirectionDismissible extends StatefulWidget { + const DirectionDismissible({Key? key}) : super(key: key); + + @override + _CustomDirectionDismissibleState createState() => + _CustomDirectionDismissibleState(); +} + +class _CustomDirectionDismissibleState extends State { + final List data = [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ListView( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Widget _buildItem(Color color) { + return Dismissible( + direction: DismissDirection.vertical, + background: Container( + color: Colors.green, + alignment: const Alignment( + 0, + -0.9, + ), + child: const Icon( + Icons.check, + color: Colors.white, + ), + ), + crossAxisEndOffset: 0.5, + secondaryBackground: Container( + alignment: const Alignment( + 0, + 0.9, + ), + child: const Icon( + Icons.close, + color: Colors.white, + ), + color: Colors.red, + ), + key: ValueKey(color), + onDismissed: (d) { + data.remove(color); + }, + confirmDismiss: (e) async { + print(e); + if (e == DismissDirection.up) { + return true; + } else { + return false; + } + }, + child: Container( + alignment: Alignment.center, + width: 80, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json new file mode 100644 index 00000000..81b99c4f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Ziel zum Ziehen", + "info": "Ein Zielbereich zum Ziehen, der Informationen von der Draggable-Komponente empfangen kann. Kann Rückrufe beim Ziehen erhalten.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DragTarget", + "desc": [ + "【builder】 : Komponentenkonstruktor 【DragTargetBuilder】", + "【onWillAccept】 : Beim Ziehen 【Function(T)】", + "【onAccept】 : Ziehen erfolgreich 【Function(T)】", + "【onLeave】 : Ziehen und Loslassen 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json new file mode 100644 index 00000000..c7843644 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Drag Target", + "info": "A target area for dragging, which can receive information from the Draggable component. It can get callbacks during dragging.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DragTarget", + "desc": [ + "【builder】: Component builder 【DragTargetBuilder】", + "【onWillAccept】: When dragging in 【Function(T)】", + "【onAccept】: Drag success 【Function(T)】", + "【onLeave】: Drag in and then out 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json new file mode 100644 index 00000000..85904384 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Objetivo de Arrastrar", + "info": "Un área objetivo para arrastrar, que puede recibir información del componente Draggable. Puede obtener devoluciones de llamada durante el arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de DragTarget", + "desc": [ + "【builder】 : Constructor del componente 【DragTargetBuilder】", + "【onWillAccept】 : Al arrastrar hacia adentro 【Function(T)】", + "【onAccept】 : Arrastre exitoso 【Function(T)】", + "【onLeave】 : Arrastrar hacia adentro y luego hacia afuera 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json new file mode 100644 index 00000000..6d06cb8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Cible de glisser-déposer", + "info": "Une zone cible pour le glisser-déposer, capable de recevoir des informations du composant Draggable. Peut obtenir des rappels lors du glisser-déposer.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DragTarget", + "desc": [ + "【builder】 : Constructeur de composant 【DragTargetBuilder】", + "【onWillAccept】 : Lors du glissement 【Function(T)】", + "【onAccept】 : Glisser-déposer réussi 【Function(T)】", + "【onLeave】 : Glisser-déposer puis sortir 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json new file mode 100644 index 00000000..04c0e008 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Obiettivo di trascinamento", + "info": "Un'area di destinazione per il trascinamento, in grado di ricevere informazioni dal componente Draggable. È possibile ottenere callback durante il trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DragTarget", + "desc": [ + "【builder】 : Costruttore del componente 【DragTargetBuilder】", + "【onWillAccept】 : Durante il trascinamento 【Function(T)】", + "【onAccept】 : Trascinamento riuscito 【Function(T)】", + "【onLeave】 : Trascinato e poi rilasciato 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json new file mode 100644 index 00000000..60747d78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "ドラッグターゲット", + "info": "ドラッグ可能なコンポーネントの情報を受け取るためのドラッグターゲットエリアです。ドラッグ時のコールバックを取得できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTargetの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【DragTargetBuilder】", + "【onWillAccept】 : ドラッグイン時 【Function(T)】", + "【onAccept】 : ドラッグ成功時 【Function(T)】", + "【onLeave】 : ドラッグイン後ドラッグアウト時 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json new file mode 100644 index 00000000..c7822b57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "드래그 대상", + "info": "드래그 가능한 영역으로, Draggable 컴포넌트의 정보를 받을 수 있습니다. 드래그 시 콜백을 얻을 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTarget 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【DragTargetBuilder】", + "【onWillAccept】 : 드래그 시 【Function(T)】", + "【onAccept】 : 드래그 성공 【Function(T)】", + "【onLeave】 : 드래그 후 떼기 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json new file mode 100644 index 00000000..e8359167 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Alvo de Arrastar", + "info": "Uma área de destino para arrastar, que pode receber informações do componente Draggable. Pode obter retornos de chamada durante o arrasto.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DragTarget", + "desc": [ + "【builder】 : Construtor de componentes 【DragTargetBuilder】", + "【onWillAccept】 : Ao arrastar para dentro 【Function(T)】", + "【onAccept】 : Arrasto bem-sucedido 【Function(T)】", + "【onLeave】 : Arrastar para dentro e depois para fora 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json new file mode 100644 index 00000000..6355c56c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Цель перетаскивания", + "info": "Область цели для перетаскивания, которая может принимать информацию от компонента Draggable. Можно получить обратные вызовы при перетаскивании.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DragTarget", + "desc": [ + "【builder】 : Конструктор компонента 【DragTargetBuilder】", + "【onWillAccept】 : При перетаскивании 【Function(T)】", + "【onAccept】 : Успешное перетаскивание 【Function(T)】", + "【onLeave】 : Перетаскивание и выход 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json new file mode 100644 index 00000000..6f1036ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "拖拽目标", + "info": "一个拖拽的目标区域,可接收Draggable组件的信息。可以获取拖拽时的回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTarget基本使用", + "desc": [ + "【builder】 : 组件构造器 【DragTargetBuilder】", + "【onWillAccept】 : 拖入时 【Function(T)】", + "【onAccept】 : 拖拽成功 【Function(T)】", + "【onLeave】 : 拖入再脱出 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart new file mode 100644 index 00000000..75616022 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + + +class CustomDragTarget extends StatefulWidget { + const CustomDragTarget({Key? key}) : super(key: key); + + @override + _CustomDragTargetState createState() => _CustomDragTargetState(); +} + +class _CustomDragTargetState extends State { + Color _color = Colors.grey; + String _info = 'DragTarget'; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Wrap(children: _buildColors(), spacing: 10), + const SizedBox(height: 20), + _buildDragTarget() + ], + ); + } + + final List colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.purple, + Colors.cyanAccent + ]; + + List _buildColors() => colors + .map( + (e) => Draggable( + child: Container( + width: 30, + height: 30, + alignment: Alignment.center, + child: Text( + colors.indexOf(e).toString(), + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), + ), + decoration: BoxDecoration(color: e, shape: BoxShape.circle), + ), + data: e, + feedback: Container( + width: 25, + height: 25, + decoration: BoxDecoration(color: e, shape: BoxShape.circle), + )), + ).toList(); + + Widget _buildDragTarget() { + return DragTarget( + onLeave: (data) => setState(() => _info='onLeave'), + onAccept: (data) => setState(() { + _info='onAccept'; + _color = data; + }), + onWillAccept: (data) { + setState(() { + _info='onWillAccept'; + }); + print("onWillAccept: data = $data "); + return data != null; + }, + builder: (context, candidateData, rejectedData) => Container( + width: 150.0, + height: 50.0, + color: _color, + child: Center( + child: Text( + _info, + style: const TextStyle(color: Colors.white), + ), + ))); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json new file mode 100644 index 00000000..9d415728 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Verschiebbare Komponente", + "info": "Ermöglicht das Verschieben der Komponente auf der Benutzeroberfläche und kann Daten eines generischen Typs T speichern. Wird normalerweise in Kombination mit DragTarget verwendet, um den Drag-and-Drop-Effekt zu erzielen.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Draggable", + "desc": [ + "【child】 : Kind 【Widget】", + "【feedback】 : Kind während des Ziehens 【Widget】", + "【axis】 : Achse des Ziehens 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Kombinierte Verwendung von Draggable und DragTarget", + "desc": [ + "【data】 : Daten 【T】", + "【onDragStarted】 : Ziehen gestartet 【Function()】", + "【onDragEnd】 : Ziehen beendet 【Function(DraggableDetails)】", + "【onDragCompleted】 : Ziehen abgeschlossen 【Function()】", + "【onDraggableCanceled】 : Ziehen abgebrochen 【Function(Velocity,Offset)】", + "【onChanged】 : Rückruf bei Änderung 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Andere Verwendungen von Draggable", + "desc": [ + "Kann verwendet werden, um einige Ereignisse basierend auf dem Ziehen zu verarbeiten, wie z.B. Löschen, Abfragen, Pop-up-Fenster usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json new file mode 100644 index 00000000..28afb401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Draggable Component", + "info": "Allows the component to be dragged anywhere on the interface, and can store data of a generic type T. It is usually used in combination with DragTarget to achieve the drag effect.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Draggable", + "desc": [ + "【child】 : child 【Widget】", + "【feedback】 : child during dragging 【Widget】", + "【axis】 : axis of dragging 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Combined Usage of Draggable and DragTarget", + "desc": [ + "【data】 : data 【T】", + "【onDragStarted】 : start dragging 【Function()】", + "【onDragEnd】 : end dragging 【Function(DraggableDetails)】", + "【onDragCompleted】 : drag completed 【Function()】", + "【onDraggableCanceled】 : drag canceled 【Function(Velocity,Offset)】", + "【onChanged】 : callback when changed 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Other Usages of Draggable", + "desc": [ + "Some events can be handled based on dragging, such as deletion, querying, pop-ups, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json new file mode 100644 index 00000000..e36c39ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Arrastrable", + "info": "Permite arrastrar el componente en la interfaz, puede almacenar datos de un tipo genérico T. Normalmente se usa en combinación con DragTarget para lograr el efecto de arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Draggable", + "desc": [ + "【child】 : hijo 【Widget】", + "【feedback】 : hijo durante el arrastre 【Widget】", + "【axis】 : eje de arrastre 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Uso combinado de Draggable y DragTarget", + "desc": [ + "【data】 : datos 【T】", + "【onDragStarted】 : inicio del arrastre 【Function()】", + "【onDragEnd】 : fin del arrastre 【Function(DraggableDetails)】", + "【onDragCompleted】 : arrastre completado 【Function()】", + "【onDraggableCanceled】 : arrastre cancelado 【Function(Velocity,Offset)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Otros usos de Draggable", + "desc": [ + "Puede manejar algunos eventos según el arrastre. Como eliminar, consultar, mostrar cuadros de diálogo, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json new file mode 100644 index 00000000..9087a370 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Composant déplaçable", + "info": "Permet de déplacer un composant librement sur l'interface, peut contenir des données de type générique T. Généralement utilisé en combinaison avec DragTarget pour réaliser des effets de glisser-déposer.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Draggable", + "desc": [ + "【child】 : enfant 【Widget】", + "【feedback】 : enfant pendant le glissement 【Widget】", + "【axis】 : axe de glissement 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Utilisation combinée de Draggable et DragTarget", + "desc": [ + "【data】 : données 【T】", + "【onDragStarted】 : début du glissement 【Function()】", + "【onDragEnd】 : fin du glissement 【Function(DraggableDetails)】", + "【onDragCompleted】 : glissement terminé 【Function()】", + "【onDraggableCanceled】 : glissement annulé 【Function(Velocity,Offset)】", + "【onChanged】 : rappel lors du changement 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Autres utilisations de Draggable", + "desc": [ + "Peut traiter certains événements en fonction du glissement. Comme la suppression, la recherche, les boîtes de dialogue, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json new file mode 100644 index 00000000..6a8e0ecc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Trascinabile", + "info": "Permette di trascinare il componente sull'interfaccia e può contenere un dato di tipo generico T. Solitamente utilizzato in combinazione con DragTarget per completare l'effetto di trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di Draggable", + "desc": [ + "【child】 : figlio 【Widget】", + "【feedback】 : figlio durante il trascinamento 【Widget】", + "【axis】 : asse di trascinamento 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Utilizzo combinato di Draggable e DragTarget", + "desc": [ + "【data】 : dati 【T】", + "【onDragStarted】 : inizio del trascinamento 【Function()】", + "【onDragEnd】 : fine del trascinamento 【Function(DraggableDetails)】", + "【onDragCompleted】 : trascinamento completato 【Function()】", + "【onDraggableCanceled】 : trascinamento annullato 【Function(Velocity,Offset)】", + "【onChanged】 : callback al cambiamento 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Altri utilizzi di Draggable", + "desc": [ + "È possibile gestire alcuni eventi in base al trascinamento. Ad esempio, eliminazione, ricerca, finestra pop-up, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json new file mode 100644 index 00000000..39b75180 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "ドラッグ可能なコンポーネント", + "info": "コンポーネントをインターフェース上で自由にドラッグできるようにし、ジェネリック型Tのデータを格納できます。通常、DragTargetと組み合わせて使用し、ドラッグ効果を実現します。", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggableの基本使用", + "desc": [ + "【child】 : 子 【Widget】", + "【feedback】 : ドラッグ時の子 【Widget】", + "【axis】 : ドラッグ軸 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "DraggableとDragTargetの連携使用", + "desc": [ + "【data】 : データ 【T】", + "【onDragStarted】 : ドラッグ開始 【Function()】", + "【onDragEnd】 : ドラッグ終了 【Function(DraggableDetails)】", + "【onDragCompleted】 : ドラッグ完了 【Function()】", + "【onDraggableCanceled】 : ドラッグキャンセル 【Function(Velocity,Offset)】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggableのその他の使用", + "desc": [ + "ドラッグに基づいていくつかのイベントを処理できます。例えば、削除、検索、ポップアップなど" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json new file mode 100644 index 00000000..1d9a29c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "드래그 가능한 컴포넌트", + "info": "컴포넌트를 인터페이스 상에서 자유롭게 드래그할 수 있으며, 제네릭 T 데이터를 저장할 수 있습니다. 일반적으로 DragTarget과 함께 사용되어 드래그 효과를 완성합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggable 기본 사용", + "desc": [ + "【child】 : 자식 【Widget】", + "【feedback】 : 드래그 시의 자식 【Widget】", + "【axis】 : 드래그 축 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Draggable과 DragTarget 연동", + "desc": [ + "【data】 : 데이터 【T】", + "【onDragStarted】 : 드래그 시작 【Function()】", + "【onDragEnd】 : 드래그 종료 【Function(DraggableDetails)】", + "【onDragCompleted】 : 드래그 완료 【Function()】", + "【onDraggableCanceled】 : 드래그 취소 【Function(Velocity,Offset)】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggable 기타 사용", + "desc": [ + "드래그를 통해 일부 이벤트를 처리할 수 있습니다. 예를 들어 삭제, 조회, 팝업 등" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json new file mode 100644 index 00000000..b6b3af3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Arrastável", + "info": "Permite que o componente seja arrastado livremente na interface, podendo armazenar dados de um tipo genérico T. Normalmente usado em combinação com DragTarget para alcançar o efeito de arrastar e soltar.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Draggable", + "desc": [ + "【child】 : Filho 【Widget】", + "【feedback】 : Filho durante o arrasto 【Widget】", + "【axis】 : Eixo de arrasto 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Uso Conjunto de Draggable e DragTarget", + "desc": [ + "【data】 : Dados 【T】", + "【onDragStarted】 : Início do arrasto 【Function()】", + "【onDragEnd】 : Fim do arrasto 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrasto concluído 【Function()】", + "【onDraggableCanceled】 : Arrasto cancelado 【Function(Velocity,Offset)】", + "【onChanged】 : Callback de mudança 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Outros Usos do Draggable", + "desc": [ + "Pode processar alguns eventos com base no arrasto, como exclusão, consulta, exibição de diálogos, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json new file mode 100644 index 00000000..00ffd0c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Перетаскиваемый компонент", + "info": "Позволяет компоненту перетаскиваться на интерфейсе, может хранить данные типа T. Обычно используется в сочетании с DragTarget для достижения эффекта перетаскивания.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Draggable", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【feedback】 : Дочерний элемент при перетаскивании 【Widget】", + "【axis】 : Ось перетаскивания 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Использование Draggable с DragTarget", + "desc": [ + "【data】 : Данные 【T】", + "【onDragStarted】 : Начало перетаскивания 【Function()】", + "【onDragEnd】 : Конец перетаскивания 【Function(DraggableDetails)】", + "【onDragCompleted】 : Завершение перетаскивания 【Function()】", + "【onDraggableCanceled】 : Отмена перетаскивания 【Function(Velocity,Offset)】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Другое использование Draggable", + "desc": [ + "Можно обрабатывать некоторые события на основе перетаскивания. Например, удаление, поиск, всплывающие окна и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json new file mode 100644 index 00000000..4ab0f12d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "可拖拽组件", + "info": "可以让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggable基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【feedback】 : 拖拽时的孩子 【Widget】", + "【axis】 : 拖动的轴 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Draggable与DragTarget联用", + "desc": [ + "【data】 : 数据 【T】", + "【onDragStarted】 : 开始拖拽 【Function()】", + "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】", + "【onDragCompleted】 : 拖拽完成 【Function()】", + "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggable其他使用", + "desc": [ + "可以根据拖拽来处理一些事件。如删除、查询、弹框等" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart new file mode 100644 index 00000000..0f74ab70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomDraggable extends StatelessWidget { + const CustomDraggable({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List axis = [null, Axis.vertical, Axis.horizontal]; + return Wrap( + spacing: 30, + children: axis + .map((e) => Draggable( + axis: e, + child: Container( + width: 30, + height: 30, + alignment: Alignment.center, + decoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + ), + feedback: Container( + width: 30, + height: 30, + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), + ), + )) + .toList()); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node2_data.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart similarity index 81% rename from packages/widgets/lib/StatefulWidget/Draggable/node2_data.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart index 907f4583..d8bfd4d4 100644 --- a/packages/widgets/lib/StatefulWidget/Draggable/node2_data.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 103, -// "name": 'Draggable与DragTarget联用', -// "priority": 2, -// "subtitle": -// "【data】 : 数据 【T】\n" -// "【onDragStarted】 : 开始拖拽 【Function()】\n" -// "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n" -// "【onDragCompleted】 : 拖拽完成 【Function()】\n" -// "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】\n" -// "【onChanged】 : 改变时回调 【Function(T)】", -// } + class DraggablePage extends StatefulWidget { const DraggablePage({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node3_use.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart similarity index 90% rename from packages/widgets/lib/StatefulWidget/Draggable/node3_use.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart index ef946daa..6f2a09f6 100644 --- a/packages/widgets/lib/StatefulWidget/Draggable/node3_use.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 103, -// "name": 'Draggable其他使用', -// "priority": 3, -// "subtitle": -// "可以根据拖拽来处理一些事件。如删除、查询、弹框等", -// } class DeleteDraggable extends StatefulWidget { const DeleteDraggable({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json new file mode 100644 index 00000000..8186a954 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Zieh- und schiebbares Blatt", + "info": "Ein Blatt, das gezogen und geschoben werden kann, mit der Möglichkeit, den maximalen, minimalen und anfänglichen Teilungsbereich festzulegen. Der Konstruktor builder muss eine schiebbare Komponente zurückgeben.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Anfänglicher Teilungsgrad 【double】", + "【minChildSize】 : Minimaler Teilungsgrad 【double】", + "【maxChildSize】 : Maximaler Teilungsgrad 【double】", + "【builder】 : Schiebbare Komponentenkonstruktor 【ScrollableWidgetBuilder】", + "【expand】 : Ob erweitert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json new file mode 100644 index 00000000..3a4f380a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Draggable Sheet", + "info": "A sheet that can be dragged and scrolled, with the ability to specify the maximum, minimum, and initial fractions within the scroll range. The builder constructor needs to return a scrollable component.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DraggableScrollableSheet", + "desc": [ + "【initialChildSize】: Initial fraction 【double】", + "【minChildSize】: Minimum fraction 【double】", + "【maxChildSize】: Maximum fraction 【double】", + "【builder】: Scrollable component builder 【ScrollableWidgetBuilder】", + "【expand】: Whether to expand 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json new file mode 100644 index 00000000..bf72d364 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Hoja deslizante", + "info": "Hoja que se puede arrastrar y deslizar, se puede especificar el tamaño máximo, mínimo e inicial dentro del rango de deslizamiento. El constructor builder debe devolver un componente deslizable.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Tamaño inicial 【double】", + "【minChildSize】 : Tamaño mínimo 【double】", + "【maxChildSize】 : Tamaño máximo 【double】", + "【builder】 : Constructor de componente deslizable 【ScrollableWidgetBuilder】", + "【expand】 : Si se expande 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json new file mode 100644 index 00000000..61897ae3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Feuille glissable et déplaçable", + "info": "Feuille déplaçable et glissable, permettant de spécifier les divisions maximales, minimales et initiales dans la plage de glissement. Le constructeur builder doit retourner un composant glissant.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Division initiale 【double】", + "【minChildSize】 : Division minimale 【double】", + "【maxChildSize】 : Division maximale 【double】", + "【builder】 : Constructeur de composant glissant 【ScrollableWidgetBuilder】", + "【expand】 : S'étend ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json new file mode 100644 index 00000000..e1873bd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Foglio trascinabile e scorrevole", + "info": "Un foglio trascinabile e scorrevole che può specificare la dimensione massima, minima e iniziale all'interno dell'intervallo di scorrimento. Il costruttore builder deve restituire un componente scorrevole.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Dimensione iniziale 【double】", + "【minChildSize】 : Dimensione minima 【double】", + "【maxChildSize】 : Dimensione massima 【double】", + "【builder】 : Costruttore del componente scorrevole 【ScrollableWidgetBuilder】", + "【expand】 : Se espandere 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json new file mode 100644 index 00000000..9dbe32fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "ドラッグ可能なシート", + "info": "ドラッグおよびスクロール可能なシートで、最大、最小、および初期の分割位置を指定できます。ビルダーはスクロール可能なコンポーネントを返す必要があります。", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheetの基本使用", + "desc": [ + "【initialChildSize】 : 初期分割位置 【double】", + "【minChildSize】 : 最小分割位置 【double】", + "【maxChildSize】 : 最大分割位置 【double】", + "【builder】 : スクロールコンポーネントビルダー 【ScrollableWidgetBuilder】", + "【expand】 : 拡張するかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json new file mode 100644 index 00000000..be2920e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "드래그 가능한 시트", + "info": "드래그 및 스크롤 가능한 시트로, 최대, 최소, 초기 분할 위치를 지정할 수 있습니다. 생성자 builder는 스크롤 가능한 컴포넌트를 반환해야 합니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheet 기본 사용법", + "desc": [ + "【initialChildSize】 : 초기 분할 위치 【double】", + "【minChildSize】 : 최소 분할 위치 【double】", + "【maxChildSize】 : 최대 분할 위치 【double】", + "【builder】 : 스크롤 컴포넌트 생성자 【ScrollableWidgetBuilder】", + "【expand】 : 확장 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json new file mode 100644 index 00000000..b9b9a40e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Folha Deslizável e Arrastável", + "info": "Uma folha que pode ser arrastada e deslizada, permitindo especificar a divisão máxima, mínima e inicial dentro da faixa de deslizamento. O construtor builder precisa retornar um componente deslizável.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DraggableScrollableSheet", + "desc": [ + "【initialChildSize】: Divisão inicial 【double】", + "【minChildSize】: Divisão mínima 【double】", + "【maxChildSize】: Divisão máxima 【double】", + "【builder】: Construtor do componente deslizável 【ScrollableWidgetBuilder】", + "【expand】: Estender 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json new file mode 100644 index 00000000..6df183a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Перетаскиваемый и прокручиваемый лист", + "info": "Перетаскиваемый и прокручиваемый лист, который может указывать максимальное, минимальное и начальное деление в текущем диапазоне прокрутки. Конструктор builder должен возвращать прокручиваемый компонент.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Начальное деление 【double】", + "【minChildSize】 : Минимальное деление 【double】", + "【maxChildSize】 : Максимальное деление 【double】", + "【builder】 : Конструктор прокручиваемого компонента 【ScrollableWidgetBuilder】", + "【expand】 : Расширять ли 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json new file mode 100644 index 00000000..a49c47d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "拖滑页", + "info": "可拖动和滑动的Sheet,可指定最大、最小、最初的分度现在滑动范围。构造器builder需要返回一个可滑动组件。", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheet基本使用", + "desc": [ + "【initialChildSize】 : 初始分度 【double】", + "【minChildSize】 : 最小分度 【double】", + "【maxChildSize】 : 最大分度 【double】", + "【builder】 : 滑动组件构造器 【ScrollableWidgetBuilder】", + "【expand】 : 是否延展 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart new file mode 100644 index 00000000..6a93804e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class DraggableScrollableSheetDemo extends StatelessWidget { + const DraggableScrollableSheetDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(10), + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DraggableScrollableSheetPage()), + ); + }, + child: const Text("进入 DraggableScrollableSheet 测试页"), + ), + ); + } +} + +class DraggableScrollableSheetPage extends StatelessWidget { + DraggableScrollableSheetPage({Key? key}) : super(key: key); + + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("DraggableScrollableSheet"), + ), + body: SizedBox.expand( + child: DraggableScrollableSheet( + initialChildSize: 0.3, + minChildSize: 0.2, + maxChildSize: 0.5, + expand: true, + builder: (BuildContext context, ScrollController scrollController)=> + ListView.builder( + controller: scrollController, + itemCount: data.length, + itemBuilder: buildColorItem, + ), + )), + ); + } + + Widget buildColorItem(BuildContext context, int index) { + return Container( + alignment: Alignment.center, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json new file mode 100644 index 00000000..a2c8d346 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS-Schiebe-Tab", + "info": "Bietet Interaktionsverhalten für die Drawer-Komponente und wird selten verwendet. Es gibt Anwendungsfälle im Quellcode der Scaffold-Komponente.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerController", + "desc": [ + "【drawerCallback】 : Ereignisrückruf 【DrawerCallback】", + "【enableOpenDragGesture】 : Ob seitliches Aufziehen aktiviert ist 【bool】", + "【alignment】 : Ausrichtung 【DrawerAlignment】", + "【scrimColor】 : Hintergrundfarbe 【Color】", + "【child】 : Drawer-Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json new file mode 100644 index 00000000..e49012f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS Sliding Tabs", + "info": "Provides interactive behavior for the Drawer component, which is rarely used. It is used in the source code of the Scaffold component.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerController", + "desc": [ + "【drawerCallback】: Event callback 【DrawerCallback】", + "【enableOpenDragGesture】: Whether to slide open from the side 【bool】", + "【alignment】: Alignment 【DrawerAlignment】", + "【scrimColor】: Background color 【Color】", + "【child】: Drawer component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json new file mode 100644 index 00000000..7afc8a3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Pestañas deslizantes de iOS", + "info": "Proporciona comportamiento interactivo para el componente Drawer, generalmente se usa poco. Tiene un caso de uso en el código fuente del componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerController", + "desc": [ + "【drawerCallback】 : devolución de llamada de evento 【DrawerCallback】", + "【enableOpenDragGesture】 : si se puede deslizar hacia un lado 【bool】", + "【alignment】 : alineación 【DrawerAlignment】", + "【scrimColor】 : color de fondo 【Color】", + "【child】 : componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json new file mode 100644 index 00000000..bbf96da0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Onglets glissants iOS", + "info": "Fournit des comportements interactifs pour le composant Drawer, généralement peu utilisé. Utilisé dans le code source du composant Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerController", + "desc": [ + "【drawerCallback】 : Rappel d'événement 【DrawerCallback】", + "【enableOpenDragGesture】 : Glissement latéral activé 【bool】", + "【alignment】 : Mode d'alignement 【DrawerAlignment】", + "【scrimColor】 : Couleur de fond 【Color】", + "【child】 : Composant Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json new file mode 100644 index 00000000..0a51c96e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Schede scorrevoli iOS", + "info": "Fornisce comportamenti interattivi per il componente Drawer, generalmente usato raramente. Ci sono scenari di utilizzo nel codice sorgente del componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DrawerController", + "desc": [ + "【drawerCallback】 : callback dell'evento 【DrawerCallback】", + "【enableOpenDragGesture】 : se scorrere lateralmente per aprire 【bool】", + "【alignment】 : allineamento 【DrawerAlignment】", + "【scrimColor】 : colore di sfondo 【Color】", + "【child】 : componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json new file mode 100644 index 00000000..07b6f06d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOSスライドタブ", + "info": "Drawerコンポーネントにインタラクションを提供しますが、一般的にはあまり使用されません。Scaffoldコンポーネントのソースコードで使用されることがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerControllerの基本的な使用法", + "desc": [ + "【drawerCallback】 : イベントコールバック 【DrawerCallback】", + "【enableOpenDragGesture】 : サイドスワイプを有効にするか 【bool】", + "【alignment】 : 配置方法 【DrawerAlignment】", + "【scrimColor】 : 背景色 【Color】", + "【child】 : Drawerコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json new file mode 100644 index 00000000..bc6be0dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS 슬라이드 탭", + "info": "Drawer 컴포넌트에 상호 작용을 제공하며, 일반적으로 잘 사용되지 않습니다. Scaffold 컴포넌트 소스 코드에서 사용 사례가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerController 기본 사용", + "desc": [ + "【drawerCallback】 : 이벤트 콜백 【DrawerCallback】", + "【enableOpenDragGesture】 : 측면 슬라이드 열기 【bool】", + "【alignment】 : 정렬 방식 【DrawerAlignment】", + "【scrimColor】 : 배경 색상 【Color】", + "【child】 : Drawer 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json new file mode 100644 index 00000000..25c9c0e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Separador deslizante iOS", + "info": "Fornece comportamento interativo para o componente Drawer, geralmente raramente usado. Há cenários de uso no código-fonte do componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DrawerController", + "desc": [ + "【drawerCallback】 : Callback de evento 【DrawerCallback】", + "【enableOpenDragGesture】 : Se o deslizar lateral está ativado 【bool】", + "【alignment】 : Alinhamento 【DrawerAlignment】", + "【scrimColor】 : Cor de fundo 【Color】", + "【child】 : Componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json new file mode 100644 index 00000000..e2ae2d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS слайдер вкладок", + "info": "Обеспечивает интерактивное поведение для компонента Drawer, обычно используется редко. Используется в исходном коде компонента Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerController", + "desc": [ + "【drawerCallback】 : Обратный вызов события 【DrawerCallback】", + "【enableOpenDragGesture】 : Возможность открытия смахиванием 【bool】", + "【alignment】 : Способ выравнивания 【DrawerAlignment】", + "【scrimColor】 : Цвет фона 【Color】", + "【child】 : Компонент Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json new file mode 100644 index 00000000..2f3c9a12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS滑动页签", + "info": "为 Drawer 组件提供交互行为,一般很少使用。在 Scaffold 组件源码中有使用场景。", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerController基本使用", + "desc": [ + "【drawerCallback】 : 事件回调 【DrawerCallback】", + "【enableOpenDragGesture】 : 是否侧边滑开 【bool】", + "【alignment】 : 对齐方式 【DrawerAlignment】", + "【scrimColor】 : 背景颜色 【Color】", + "【child】 : Drawer组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart new file mode 100644 index 00000000..f29d10ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class DrawerControllerDemo extends StatefulWidget { + const DrawerControllerDemo({Key? key}) : super(key: key); + + @override + _DrawerControllerDemoState createState() => _DrawerControllerDemoState(); +} + +class _DrawerControllerDemoState extends State { + final GlobalKey _drawerKey = + GlobalKey(); + + bool _open = false; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ElevatedButton( + onPressed: toggleDrawer, + child: const Text("显隐 Drawer"), + ), + SizedBox( + height: 200, + child: DrawerController( + scrimColor: Colors.blue.withAlpha(88), + enableOpenDragGesture: true, + key: _drawerKey, + alignment: DrawerAlignment.start, + drawerCallback: (value) { + _open = value; + }, + child: Drawer( + child: Container( + alignment: Alignment.center, + color: Colors.red, + child: const Text( + "I am Drawer!", + style: TextStyle(color: Colors.white, fontSize: 18), + ), + ), + ), + ), + ), + ], + ); + } + + void toggleDrawer() { + if (_open) { + _drawerKey.currentState?.close(); + } else { + print('---open--$_open-------'); + _drawerKey.currentState?.open(); + } + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json new file mode 100644 index 00000000..6bb9d991 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Dropdown-Schaltfläche", + "info": "Eine Schaltfläche für Dropdown-Auswahl, die Eigenschaften wie Symbol, Schattentiefe, Hinweis usw. angeben kann und Ereignisse bei Änderungen der Auswahl empfängt.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DropdownButton", + "desc": [ + "【value】 : Aktueller Wert 【T】", + "【items】 : Dropdown-Auswahlbox 【List>】", + "【icon】 : Symbol 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【onChanged】 : Ereignis bei Auswahl eines Elements 【Function(T)】", + "【backgroundColor】 : Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stilangabe für DropdownButton", + "desc": [ + "【isDense】 : Ob kompakt angeordnet 【bool】", + "【iconSize】 : Symbolgröße 【double】", + "【hint】 : Hinweis-Komponente 【Widget】", + "【iconEnabledColor】 : Symbolfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json new file mode 100644 index 00000000..67516d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Dropdown Button", + "info": "A button for dropdown selection, which can specify attributes such as icon, elevation, hint, etc., and receives events for selection changes.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DropdownButton", + "desc": [ + "【value】 : Current value 【T】", + "【items】 : Dropdown items 【List>】", + "【icon】 : Icon 【Widget】", + "【elevation】 : Elevation 【double】", + "【onChanged】 : Selection change event 【Function(T)】", + "【backgroundColor】 : Background color 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Styling of DropdownButton", + "desc": [ + "【isDense】 : Whether to be dense 【bool】", + "【iconSize】 : Icon size 【double】", + "【hint】 : Hint widget 【Widget】", + "【iconEnabledColor】 : Icon color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json new file mode 100644 index 00000000..72085369 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Botón desplegable", + "info": "Botón para selección desplegable, se pueden especificar propiedades como icono, profundidad de sombra, sugerencias, etc., y recibe eventos de cambio de selección.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DropdownButton", + "desc": [ + "【value】 : Valor actual 【T】", + "【items】 : Opciones desplegables 【List>】", + "【icon】 : Icono 【Widget】", + "【elevation】 : Profundidad de sombra 【double】", + "【onChanged】 : Evento de cambio de selección 【Function(T)】", + "【backgroundColor】 : Color de fondo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Especificación de estilo de DropdownButton", + "desc": [ + "【isDense】 : Si está compacto 【bool】", + "【iconSize】 : Tamaño del icono 【double】", + "【hint】 : Componente de sugerencia 【Widget】", + "【iconEnabledColor】 : Color del icono 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json new file mode 100644 index 00000000..7116ccf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Bouton déroulant", + "info": "Bouton pour la sélection déroulante, pouvant spécifier des attributs tels que l'icône, la profondeur d'ombre, l'indice, etc., et recevoir des événements de changement de sélection.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DropdownButton", + "desc": [ + "【value】 : Valeur actuelle 【T】", + "【items】 : Liste déroulante 【List>】", + "【icon】 : Icône 【Widget】", + "【elevation】 : Profondeur d'ombre 【double】", + "【onChanged】 : Événement de sélection d'élément 【Function(T)】", + "【backgroundColor】 : Couleur de fond 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Spécification du style de DropdownButton", + "desc": [ + "【isDense】 : Si compact 【bool】", + "【iconSize】 : Taille de l'icône 【double】", + "【hint】 : Composant d'indice 【Widget】", + "【iconEnabledColor】 : Couleur de l'icône 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json new file mode 100644 index 00000000..f6ff0ac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Pulsante a discesa", + "info": "Pulsante per la selezione a discesa, può specificare attributi come icona, profondità dell'ombra, suggerimento, ecc., e riceve eventi di cambiamento di selezione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DropdownButton", + "desc": [ + "【value】 : Valore corrente 【T】", + "【items】 : Casella di selezione a discesa 【List>】", + "【icon】 : Icona 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【onChanged】 : Evento di selezione dell'elemento 【Function(T)】", + "【backgroundColor】 : Colore di sfondo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Specifica dello stile di DropdownButton", + "desc": [ + "【isDense】 : Se è compatto 【bool】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【hint】 : Componente di suggerimento 【Widget】", + "【iconEnabledColor】 : Colore dell'icona 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json new file mode 100644 index 00000000..17cebf26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "ドロップダウンボタン", + "info": "ドロップダウン選択用のボタンで、アイコン、影の深さ、ヒントなどの属性を指定でき、選択変更イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButtonの基本的な使い方", + "desc": [ + "【value】 : 現在の値 【T】", + "【items】 : ドロップダウンリスト 【List>】", + "【icon】 : アイコン 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【onChanged】 : 項目選択イベント 【Function(T)】", + "【backgroundColor】 : 背景色 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButtonのスタイル指定", + "desc": [ + "【isDense】 : コンパクト表示かどうか 【bool】", + "【iconSize】 : アイコンのサイズ 【double】", + "【hint】 : ヒントコンポーネント 【Widget】", + "【iconEnabledColor】 : アイコンの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json new file mode 100644 index 00000000..fcf3fdaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "드롭다운 버튼", + "info": "드롭다운 선택을 위한 버튼으로, 아이콘, 그림자 깊이, 힌트 등의 속성을 지정할 수 있으며, 선택 변경 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButton 기본 사용법", + "desc": [ + "【value】 : 현재 값 【T】", + "【items】 : 드롭다운 목록 【List>】", + "【icon】 : 아이콘 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【onChanged】 : 항목 선택 이벤트 【Function(T)】", + "【backgroundColor】 : 배경색 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButton 스타일 지정", + "desc": [ + "【isDense】 : 간격 축소 여부 【bool】", + "【iconSize】 : 아이콘 크기 【double】", + "【hint】 : 힌트 위젯 【Widget】", + "【iconEnabledColor】 : 아이콘 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json new file mode 100644 index 00000000..dc801566 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Botão de dropdown", + "info": "Botão para seleção de dropdown, pode especificar ícone, profundidade de sombra, dica e outros atributos, recebe eventos de mudança de seleção.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DropdownButton", + "desc": [ + "【value】 : Valor atual 【T】", + "【items】 : Caixa de seleção de dropdown 【List>】", + "【icon】 : Ícone 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【onChanged】 : Evento de seleção de item 【Function(T)】", + "【backgroundColor】 : Cor de fundo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Especificação de estilo do DropdownButton", + "desc": [ + "【isDense】 : Se deve ser compacto 【bool】", + "【iconSize】 : Tamanho do ícone 【double】", + "【hint】 : Componente de dica 【Widget】", + "【iconEnabledColor】 : Cor do ícone 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json new file mode 100644 index 00000000..a9a8965b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Выпадающая кнопка", + "info": "Кнопка для выбора из выпадающего списка, может иметь указанные иконки, тени, подсказки и другие свойства, принимает события изменения выбора.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DropdownButton", + "desc": [ + "【value】 : Текущее значение 【T】", + "【items】 : Выпадающий список 【List>】", + "【icon】 : Иконка 【Widget】", + "【elevation】 : Тень 【double】", + "【onChanged】 : Событие выбора элемента 【Function(T)】", + "【backgroundColor】 : Цвет фона 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Указание стиля DropdownButton", + "desc": [ + "【isDense】 : Компактное расположение 【bool】", + "【iconSize】 : Размер иконки 【double】", + "【hint】 : Компонент подсказки 【Widget】", + "【iconEnabledColor】 : Цвет иконки 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json new file mode 100644 index 00000000..3acb5df2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "下拉按钮", + "info": "用于下拉选择的按钮,可指定图标、影深、提示等属性,接收选中变化的事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButton基本用法", + "desc": [ + "【value】 : 当前值 【T】", + "【items】 : 下拉选框 【List>】", + "【icon】 : 图标 【Widget】", + "【elevation】 : 影深 【double】", + "【onChanged】 : 选择条目事件 【Function(T)】", + "【backgroundColor】 : 背景色 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButton的样式指定", + "desc": [ + "【isDense】 : 是否紧排 【bool】", + "【iconSize】 : 图标大小 【double】", + "【hint】 : 提示组件 【Widget】", + "【iconEnabledColor】 : 图标颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart new file mode 100644 index 00000000..7126a49c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com + +class CustomDropDownButton extends StatefulWidget { + const CustomDropDownButton({Key? key}) : super(key: key); + + @override + _CustomDropDownButtonState createState() => _CustomDropDownButtonState(); +} + +class _CustomDropDownButtonState extends State { + Color _color = Colors.red; + final List _colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + DropdownButton( + value: _color, + elevation: 1, + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (v) => setState(() => _color = v??Colors.blue)), + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart new file mode 100644 index 00000000..a5ce7c1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com + + +class StyleDropDownButton extends StatefulWidget { + const StyleDropDownButton({Key? key}) : super(key: key); + + @override + _StyleDropDownButtonState createState() => _StyleDropDownButtonState(); +} + +class _StyleDropDownButtonState extends State { + Color _color = Colors.red; + + final List _colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + DropdownButton( + hint: const Text('请选择'), + isDense: true, + iconSize:20, + iconEnabledColor:_color, + value: _color, + items: _buildItems(), + onChanged: (v) => setState(() => _color = v??Colors.blue)), + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json new file mode 100644 index 00000000..4ae73458 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Formular Dropdown", + "info": "Basiert auf der DropdownButton-Implementierung, daher sind die grundlegenden Eigenschaften ähnlich. Verfügt jedoch über die Funktionen von FormField und kann die Methoden onSaved und validator zurückrufen.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung des Formular Dropdowns", + "desc": [ + "【items】 : Liste der Unterkomponenten 【List>】", + "【validator】 : Rückruf für Formularvalidierung 【FormFieldValidator】", + "【onSaved】 : Rückruf für Formularspeicherung 【FormFieldSetter】", + "Weitere Eigenschaften finden Sie unter DropdownButton, Formularvalidierungsfunktionen finden Sie unter FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json new file mode 100644 index 00000000..0ac6e2cf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Form Dropdown", + "info": "It is implemented based on DropdownButton, so it has similar basic properties. However, it has the characteristics of FormField and can call back the onSaved and validator methods.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Simple Usage of Form Dropdown", + "desc": [ + "【items】: List of child components 【List>】", + "【validator】: Form validation callback 【FormFieldValidator】", + "【onSaved】: Form save callback 【FormFieldSetter】", + "For other properties, refer to DropdownButton. For form validation features, refer to FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json new file mode 100644 index 00000000..79188e35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo de selección de formulario", + "info": "Depende de DropdownButton en su implementación subyacente, por lo que las propiedades básicas son similares. Sin embargo, tiene características de FormField, lo que permite devolver los métodos onSaved y validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simple del campo de selección de formulario", + "desc": [ + "【items】: Lista de componentes secundarios 【List>】", + "【validator】: Devolución de llamada de validación de formulario 【FormFieldValidator】", + "【onSaved】: Devolución de llamada de guardado de formulario 【FormFieldSetter】", + "Para otras propiedades, consulte DropdownButton, y para las características de validación de formularios, consulte FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json new file mode 100644 index 00000000..6f9970d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Champ de formulaire déroulant", + "info": "Basé sur DropdownButton, donc les propriétés de base sont similaires. Mais il possède les caractéristiques de FormField, permettant de rappeler les méthodes onSaved et validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple du champ de formulaire déroulant", + "desc": [ + "【items】 : Liste des composants enfants 【List>】", + "【validator】 : Rappel de validation du formulaire 【FormFieldValidator】", + "【onSaved】 : Rappel de sauvegarde du formulaire 【FormFieldSetter】", + "Pour les autres propriétés, voir DropdownButton. Pour les caractéristiques de validation du formulaire, voir FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json new file mode 100644 index 00000000..985a7f29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo a discesa del modulo", + "info": "Si basa sull'implementazione di DropdownButton, quindi le proprietà di base sono simili. Tuttavia, ha le caratteristiche di FormField, può richiamare i metodi onSaved e validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice del campo a discesa del modulo", + "desc": [ + "【items】 : Lista dei componenti figli 【List>】", + "【validator】 : Callback di convalida del modulo 【FormFieldValidator】", + "【onSaved】 : Callback di salvataggio del modulo 【FormFieldSetter】", + "Per altre proprietà, vedere DropdownButton, per le caratteristiche di convalida del modulo, vedere FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json new file mode 100644 index 00000000..a2c48623 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "フォームドロップダウン", + "info": "基盤は DropdownButton に依存して実装されているため、基本的な属性は似ています。ただし、FormField の特性を持っており、onSaved や validator メソッドをコールバックできます。", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "フォームドロップダウンの簡単な使用", + "desc": [ + "【items】 : 子コンポーネントリスト 【List>】", + "【validator】 : フォーム検証コールバック 【FormFieldValidator】", + "【onSaved】 : フォーム保存コールバック 【FormFieldSetter】", + "その他の属性については DropdownButton を参照し、フォーム検証の特性については FormField を参照してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json new file mode 100644 index 00000000..88832c68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "폼 드롭다운", + "info": "기본적으로 DropdownButton에 의존하여 구현되었으므로 기본 속성이 유사합니다. 그러나 FormField의 특성을 가지고 있어 onSaved, validator 메서드를 콜백할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "폼 드롭다운 간단 사용", + "desc": [ + "【items】 : 하위 컴포넌트 리스트 【List>】", + "【validator】 : 폼 검증 콜백 【FormFieldValidator】", + "【onSaved】 : 폼 저장 콜백 【FormFieldSetter】", + "기타 속성은 DropdownButton을 참조하고, 폼 검증 특성은 FormField를 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json new file mode 100644 index 00000000..2eff5ad6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo de seleção de formulário", + "info": "Implementado com base no DropdownButton, portanto, possui propriedades semelhantes. No entanto, possui características do FormField, podendo chamar os métodos onSaved e validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simples do campo de seleção de formulário", + "desc": [ + "【items】: Lista de componentes filhos 【List>】", + "【validator】: Callback de validação do formulário 【FormFieldValidator】", + "【onSaved】: Callback de salvamento do formulário 【FormFieldSetter】", + "Para outras propriedades, consulte DropdownButton. Para características de validação de formulário, consulte FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json new file mode 100644 index 00000000..f7450f3e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Выпадающее поле формы", + "info": "Базовая реализация зависит от DropdownButton, поэтому основные свойства схожи. Однако обладает функциями FormField, может вызывать методы onSaved и validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование выпадающего поля формы", + "desc": [ + "【items】 : Список дочерних компонентов 【List>】", + "【validator】 : Обратный вызов проверки формы 【FormFieldValidator】", + "【onSaved】 : Обратный вызов сохранения формы 【FormFieldSetter】", + "Другие свойства см. в DropdownButton, функции проверки формы см. в FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json new file mode 100644 index 00000000..9b42b54b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "表单下拉框", + "info": "底层依赖 DropdownButton 实现,所以基本属性类似。但拥有 FormField 的特性,可以回调 onSaved、validator 方法。", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "表单下拉框简单使用", + "desc": [ + "【items】 : 子组件列表 【List>】", + "【validator】 : 表单验证回调 【FormFieldValidator】", + "【onSaved】 : 表单保存回调 【FormFieldSetter】", + "其他属性详见 DropdownButton,表单校验特性详见 FormField。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart new file mode 100644 index 00000000..63014bca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class DropdownButtonFormFieldDemo extends StatefulWidget { + const DropdownButtonFormFieldDemo({Key? key}) : super(key: key); + + @override + _DropdownButtonFormFieldDemoState createState() => + _DropdownButtonFormFieldDemoState(); +} + +class _DropdownButtonFormFieldDemoState extends State { + Color _color = Colors.blue; + final List _colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + + SizedBox( + width: 80, + child: DropdownButtonFormField( + value: _color, + elevation: 1, + hint: const Text('选择颜色',style: TextStyle(fontSize: 12),), + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (v) => setState(() => _color = v ?? Colors.blue)), + ) + + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json new file mode 100644 index 00000000..73673fe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Dropdown-Menü", + "info": "Dropdown-Auswahlkomponente, unterstützt Textfilterung und kann Menüelemente anpassen. Basierend auf MenuAnchor und TextFiled.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Einfache Verwendung des Dropdown-Menüs", + "desc": [ + "【dropdownMenuEntries】 : Liste der Menüeinträge 【List>】", + "【initialSelection】 : Rückruf zur Formularvalidierung 【T?】", + "【onSelected】 : Rückruf zur Formularspeicherung 【ValueChanged?】", + "【menuHeight】 : Menühöhe 【double】", + "【width】 : Breite des Eingabefelds 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Stil des Dropdown-Menüs", + "desc": [ + "【controller】 : Text-Eingabe-Controller 【TextEditingController?】", + "【label】 : Label des Eingabefelds 【Widget?】", + "【textStyle】 : Textstil des Eingabefelds 【TextStyle?】", + "【inputDecorationTheme】 : Dekorationsthema des Eingabefelds 【InputDecorationTheme?】", + "【leadingIcon】 : Linkes Symbol 【Widget?】", + "【trailingIcon】 : Rechtes Symbol, wenn das Menü erweitert ist 【Widget?】", + "【selectedTrailingIcon】 : Rechtes Symbol, wenn das Menü erweitert ist 【Widget?】", + "【hintText】 : Hinweistext des Eingabefelds 【String?】", + "【helperText】 : Hilfstext des Eingabefelds 【String?】", + "【errorText】 : Fehlertext des Eingabefelds 【String?】", + "【menuStyle】 : Stil des Popup-Menüs 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Benutzerdefinierte Menüelemente im Dropdown-Menü", + "desc": [ + "Menüelemente können über das labelWidget von DropdownMenuEntry angepasst werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json new file mode 100644 index 00000000..e15e900b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Dropdown Menu", + "info": "Dropdown selection component, supports text input filtering, and allows custom menu items. It mainly relies on MenuAnchor and TextField for implementation.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Simple Usage of Dropdown Menu", + "desc": [ + "【dropdownMenuEntries】 : Menu item list 【List>】", + "【initialSelection】 : Form validation callback 【T?】", + "【onSelected】 : Form save callback 【ValueChanged?】", + "【menuHeight】 : Menu height 【double】", + "【width】 : Input box width 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Dropdown Menu Style Settings", + "desc": [ + "【controller】 : Text input controller 【TextEditingController?】", + "【label】 : Input box label 【Widget?】", + "【textStyle】 : Input box text style 【TextStyle?】", + "【inputDecorationTheme】 : Input box decoration theme 【InputDecorationTheme?】", + "【leadingIcon】 : Left icon 【Widget?】", + "【trailingIcon】 : Right icon when menu is expanded 【Widget?】", + "【selectedTrailingIcon】 : Right icon when menu is expanded 【Widget?】", + "【hintText】 : Input box hint text 【String?】", + "【helperText】 : Input box helper text 【String?】", + "【errorText】 : Input box error text 【String?】", + "【menuStyle】 : Popup menu style 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Custom Menu Items for Dropdown Menu", + "desc": [ + "You can customize the menu items by using the labelWidget of DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json new file mode 100644 index 00000000..aba441ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menú desplegable", + "info": "Componente de selección desplegable, admite filtrado de entrada de texto y permite personalizar los elementos del menú. Depende principalmente de MenuAnchor y TextFiled para su implementación.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico del menú desplegable", + "desc": [ + "【dropdownMenuEntries】 : Lista de entradas del menú 【List>】", + "【initialSelection】 : Callback de validación del formulario 【T?】", + "【onSelected】 : Callback de guardado del formulario 【ValueChanged?】", + "【menuHeight】 : Altura del menú 【double】", + "【width】 : Ancho del campo de entrada 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuración de estilo del menú desplegable", + "desc": [ + "【controller】 : Controlador de entrada de texto 【TextEditingController?】", + "【label】 : Etiqueta del campo de entrada 【Widget?】", + "【textStyle】 : Estilo del texto del campo de entrada 【TextStyle?】", + "【inputDecorationTheme】 : Tema de decoración del campo de entrada 【InputDecorationTheme?】", + "【leadingIcon】 : Icono izquierdo 【Widget?】", + "【trailingIcon】 : Icono derecho cuando el menú está colapsado 【Widget?】", + "【selectedTrailingIcon】 : Icono derecho cuando el menú está expandido 【Widget?】", + "【hintText】 : Texto de sugerencia del campo de entrada 【String?】", + "【helperText】 : Texto auxiliar del campo de entrada 【String?】", + "【errorText】 : Texto de error del campo de entrada 【String?】", + "【menuStyle】 : Estilo del menú emergente 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalización de elementos del menú desplegable", + "desc": [ + "Puede personalizar la construcción de los elementos del menú utilizando labelWidget de DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json new file mode 100644 index 00000000..5af1271f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu déroulant", + "info": "Composant de sélection déroulante, prend en charge le filtrage par saisie de texte, et permet de personnaliser les éléments du menu. Il repose principalement sur MenuAnchor et TextFiled pour son implémentation.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation simple du menu déroulant", + "desc": [ + "【dropdownMenuEntries】 : Liste des entrées du menu 【List>】", + "【initialSelection】 : Rappel de validation du formulaire 【T?】", + "【onSelected】 : Rappel de sauvegarde du formulaire 【ValueChanged?】", + "【menuHeight】 : Hauteur du menu 【double】", + "【width】 : Largeur du champ de saisie 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuration du style du menu déroulant", + "desc": [ + "【controller】 : Contrôleur de saisie de texte 【TextEditingController?】", + "【label】 : Étiquette du champ de saisie 【Widget?】", + "【textStyle】 : Style du texte du champ de saisie 【TextStyle?】", + "【inputDecorationTheme】 : Thème de décoration du champ de saisie 【InputDecorationTheme?】", + "【leadingIcon】 : Icône de gauche 【Widget?】", + "【trailingIcon】 : Icône de droite lorsque le menu est déployé 【Widget?】", + "【selectedTrailingIcon】 : Icône de droite lorsque le menu est déployé 【Widget?】", + "【hintText】 : Texte d'indication du champ de saisie 【String?】", + "【helperText】 : Texte d'aide du champ de saisie 【String?】", + "【errorText】 : Texte d'erreur du champ de saisie 【String?】", + "【menuStyle】 : Style du menu contextuel 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personnalisation des éléments du menu déroulant", + "desc": [ + "Il est possible de personnaliser la construction des éléments du menu via le labelWidget de DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json new file mode 100644 index 00000000..074fcd7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu a tendina", + "info": "Componente di selezione a tendina, supporta il filtraggio tramite input di testo e consente la personalizzazione delle voci del menu. Si basa principalmente su MenuAnchor e TextFiled per l'implementazione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso semplice del menu a tendina", + "desc": [ + "【dropdownMenuEntries】 : Lista delle voci del menu 【List>】", + "【initialSelection】 : Callback di convalida del modulo 【T?】", + "【onSelected】 : Callback di salvataggio del modulo 【ValueChanged?】", + "【menuHeight】 : Altezza del menu 【double】", + "【width】 : Larghezza del campo di input 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Impostazione dello stile del menu a tendina", + "desc": [ + "【controller】 : Controller di input del testo 【TextEditingController?】", + "【label】 : Etichetta del campo di input 【Widget?】", + "【textStyle】 : Stile del testo del campo di input 【TextStyle?】", + "【inputDecorationTheme】 : Tema di decorazione del campo di input 【InputDecorationTheme?】", + "【leadingIcon】 : Icona a sinistra 【Widget?】", + "【trailingIcon】 : Icona a destra quando il menu è espanso 【Widget?】", + "【selectedTrailingIcon】 : Icona a destra quando il menu è espanso 【Widget?】", + "【hintText】 : Testo di suggerimento del campo di input 【String?】", + "【helperText】 : Testo di supporto del campo di input 【String?】", + "【errorText】 : Testo di errore del campo di input 【String?】", + "【menuStyle】 : Stile del menu a comparsa 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalizzazione delle voci del menu a tendina", + "desc": [ + "È possibile personalizzare la costruzione delle voci del menu utilizzando il labelWidget di DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json new file mode 100644 index 00000000..cab24c05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "ドロップダウンメニュー", + "info": "ドロップダウン選択コンポーネント、テキスト入力フィルタリングをサポートし、メニュー項目をカスタマイズ可能。主にMenuAnchorとTextFiledに依存して実装されています。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "ドロップダウンメニューの簡単な使用", + "desc": [ + "【dropdownMenuEntries】 : メニューエントリリスト 【List>】", + "【initialSelection】 : フォーム検証コールバック 【T?】", + "【onSelected】 : フォーム保存コールバック 【ValueChanged?】", + "【menuHeight】 : メニューの高さ 【double】", + "【width】 : 入力ボックスの幅 【double】" + ] + }, + { + "file": "node2.dart", + "name": "ドロップダウンメニューのスタイル設定", + "desc": [ + "【controller】 : テキスト入力コントローラー 【TextEditingController?】", + "【label】 : 入力ボックスのラベル 【Widget?】", + "【textStyle】 : 入力ボックスのテキストスタイル 【TextStyle?】", + "【inputDecorationTheme】 : 入力ボックスの装飾テーマ 【InputDecorationTheme?】", + "【leadingIcon】 : 左側のアイコン 【Widget?】", + "【trailingIcon】 : 右側のメニュー展開時のアイコン 【Widget?】", + "【selectedTrailingIcon】 : 右側のメニュー展開時のアイコン 【Widget?】", + "【hintText】 : 入力ボックスのヒントテキスト 【String?】", + "【helperText】 : 入力ボックスの補助テキスト 【String?】", + "【errorText】 : 入力ボックスのエラーテキスト 【String?】", + "【menuStyle】 : ポップアップメニューのスタイル 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "ドロップダウンメニューのカスタムメニュー項目", + "desc": [ + "DropdownMenuEntryのlabelWidgetを使用してメニュー項目をカスタマイズできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json new file mode 100644 index 00000000..ad696156 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "드롭다운 메뉴", + "info": "드롭다운 선택 컴포넌트로, 텍스트 입력 필터링을 지원하며 메뉴 항목을 사용자 정의할 수 있습니다. 기본적으로 MenuAnchor와 TextFiled에 의존하여 구현됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "드롭다운 메뉴의 간단한 사용", + "desc": [ + "【dropdownMenuEntries】 : 메뉴 항목 리스트 【List>】", + "【initialSelection】 : 폼 검증 콜백 【T?】", + "【onSelected】 : 폼 저장 콜백 【ValueChanged?】", + "【menuHeight】 : 메뉴 높이 【double】", + "【width】 : 입력 필드 너비 【double】" + ] + }, + { + "file": "node2.dart", + "name": "드롭다운 메뉴 스타일 설정", + "desc": [ + "【controller】 : 텍스트 입력 컨트롤러 【TextEditingController?】", + "【label】 : 입력 필드 라벨 【Widget?】", + "【textStyle】 : 입력 필드 텍스트 스타일 【TextStyle?】", + "【inputDecorationTheme】 : 입력 필드 장식 테마 【InputDecorationTheme?】", + "【leadingIcon】 : 왼쪽 아이콘 【Widget?】", + "【trailingIcon】 : 오른쪽 메뉴 확장 아이콘 【Widget?】", + "【selectedTrailingIcon】 : 오른쪽 메뉴 확장 아이콘 【Widget?】", + "【hintText】 : 입력 필드 힌트 텍스트 【String?】", + "【helperText】 : 입력 필드 보조 텍스트 【String?】", + "【errorText】 : 입력 필드 오류 텍스트 【String?】", + "【menuStyle】 : 팝업 메뉴 스타일 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "드롭다운 메뉴 사용자 정의 메뉴 항목", + "desc": [ + "DropdownMenuEntry의 labelWidget을 통해 메뉴 항목을 사용자 정의할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json new file mode 100644 index 00000000..4442f7fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu Suspenso", + "info": "Componente de seleção suspensa, suporta filtragem de entrada de texto, e permite personalizar os itens do menu. Depende principalmente de MenuAnchor e TextFiled para implementação.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Simples do Menu Suspenso", + "desc": [ + "【dropdownMenuEntries】 : Lista de entradas do menu 【List>】", + "【initialSelection】 : Callback de validação do formulário 【T?】", + "【onSelected】 : Callback de salvamento do formulário 【ValueChanged?】", + "【menuHeight】 : Altura do menu 【double】", + "【width】 : Largura da caixa de entrada 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuração de Estilo do Menu Suspenso", + "desc": [ + "【controller】 : Controlador de entrada de texto 【TextEditingController?】", + "【label】 : Etiqueta da caixa de entrada 【Widget?】", + "【textStyle】 : Estilo do texto da caixa de entrada 【TextStyle?】", + "【inputDecorationTheme】 : Tema de decoração da caixa de entrada 【InputDecorationTheme?】", + "【leadingIcon】 : Ícone à esquerda 【Widget?】", + "【trailingIcon】 : Ícone à direita quando o menu está expandido 【Widget?】", + "【selectedTrailingIcon】 : Ícone à direita quando o menu está expandido 【Widget?】", + "【hintText】 : Texto de dica da caixa de entrada 【String?】", + "【helperText】 : Texto auxiliar da caixa de entrada 【String?】", + "【errorText】 : Texto de erro da caixa de entrada 【String?】", + "【menuStyle】 : Estilo do menu suspenso 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalização de Itens do Menu Suspenso", + "desc": [ + "É possível personalizar a construção de itens do menu através do labelWidget do DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json new file mode 100644 index 00000000..e04a851f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Выпадающее меню", + "info": "Компонент выбора из выпадающего списка, поддерживает фильтрацию по текстовому вводу, позволяет настраивать пункты меню. Основная реализация зависит от MenuAnchor и TextFiled.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Простое использование выпадающего меню", + "desc": [ + "【dropdownMenuEntries】 : Список пунктов меню 【List>】", + "【initialSelection】 : Обратный вызов проверки формы 【T?】", + "【onSelected】 : Обратный вызов сохранения формы 【ValueChanged?】", + "【menuHeight】 : Высота меню 【double】", + "【width】 : Ширина поля ввода 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Настройка стиля выпадающего меню", + "desc": [ + "【controller】 : Контроллер текстового ввода 【TextEditingController?】", + "【label】 : Метка поля ввода 【Widget?】", + "【textStyle】 : Стиль текста поля ввода 【TextStyle?】", + "【inputDecorationTheme】 : Тема оформления поля ввода 【InputDecorationTheme?】", + "【leadingIcon】 : Иконка слева 【Widget?】", + "【trailingIcon】 : Иконка справа при развернутом меню 【Widget?】", + "【selectedTrailingIcon】 : Иконка справа при развернутом меню 【Widget?】", + "【hintText】 : Подсказка в поле ввода 【String?】", + "【helperText】 : Вспомогательный текст в поле ввода 【String?】", + "【errorText】 : Текст ошибки в поле ввода 【String?】", + "【menuStyle】 : Стиль всплывающего меню 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Настройка пунктов меню выпадающего меню", + "desc": [ + "Можно настроить пункты меню с помощью labelWidget в DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json new file mode 100644 index 00000000..047ff7ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "下拉菜单", + "info": "下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "下拉菜单的简单使用", + "desc": [ + "【dropdownMenuEntries】 : 菜单条目列表 【List>】", + "【initialSelection】 : 表单验证回调 【T?】", + "【onSelected】 : 表单保存回调 【ValueChanged?】", + "【menuHeight】 : 菜单高度 【double】", + "【width】 : 输入框宽度 【double】" + ] + }, + { + "file": "node2.dart", + "name": "下拉菜单样式设置", + "desc": [ + "【controller】 : 文字输入控制器 【TextEditingController?】", + "【label】 : 输入框标签 【Widget?】", + "【textStyle】 : 输入框文字样式 【TextStyle?】", + "【inputDecorationTheme】 : 输入框装饰主题 【InputDecorationTheme?】", + "【leadingIcon】 : 左侧图标 【Widget?】", + "【trailingIcon】 : 右侧为展开菜单时图标 【Widget?】", + "【selectedTrailingIcon】 : 右侧展开菜单时图标 【Widget?】", + "【hintText】 : 输入框提示文字 【String?】", + "【helperText】 : 输入框辅助文字 【String?】", + "【errorText】 : 输入框错误文字 【String?】", + "【menuStyle】 : 弹出菜单样式 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "下拉菜单自定义菜单项", + "desc": [ + "可以通过 DropdownMenuEntry 的 labelWidget 定制构建菜单项。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart new file mode 100644 index 00000000..a2dc6ebf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class DropdownMenuNode1 extends StatefulWidget { + const DropdownMenuNode1({super.key}); + + @override + State createState() => _DropdownMenuNode1State(); +} + +class _DropdownMenuNode1State extends State { + final List data = ['语文', '数学', '英语', '物理', '化学', '生物', '地理']; + late String _dropdownValue = data.first; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + DropdownMenu( + menuHeight: 200, + initialSelection: data.first, + onSelected: _onSelect, + dropdownMenuEntries: _buildMenuList(data), + ), + const SizedBox(height: 8,), + Text('你选择的学科是: $_dropdownValue') + ], + ); + } + + void _onSelect(String? value) { + setState(() { + _dropdownValue = value!; + }); + } + + List> _buildMenuList(List data) { + return data.map((String value) { + return DropdownMenuEntry(value: value, label: value); + }).toList(); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart new file mode 100644 index 00000000..cf4f5eaa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart @@ -0,0 +1,148 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +enum ColorLabel { + blue('Blue', Colors.blue), + pink('Pink', Colors.pink), + green('Green', Colors.green), + yellow('Orange', Colors.orange), + grey('Grey', Colors.grey); + + const ColorLabel(this.label, this.color); + + final String label; + final Color color; +} + + +enum IconLabel { + smile('Smile', Icons.sentiment_satisfied_outlined), + cloud('Cloud', Icons.cloud_outlined), + brush('Brush', Icons.brush_outlined), + heart('Heart', Icons.favorite); + + const IconLabel(this.label, this.icon); + + final String label; + final IconData icon; +} + +class DropdownMenuNode2 extends StatefulWidget { + const DropdownMenuNode2({super.key}); + + @override + State createState() => _DropdownMenuNode2State(); +} + +class _DropdownMenuNode2State extends State { + final TextEditingController colorController = TextEditingController(); + final TextEditingController iconController = TextEditingController(); + ColorLabel? selectedColor; + IconLabel? selectedIcon; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 20,horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildColorMenu(), + const SizedBox(height: 16), + _buildLabelMenu(), + ], + ), + ), + const SizedBox(height: 8), + _buildInfo() + ], + ); + } + + Widget _buildColorMenu(){ + return DropdownMenu( + initialSelection: ColorLabel.green, + controller: colorController, + requestFocusOnTap: true, + label: const Text('Color'), + width: 160, + menuHeight: 150, + menuStyle: const MenuStyle( + backgroundColor: MaterialStatePropertyAll(Colors.white), + surfaceTintColor: MaterialStatePropertyAll(Colors.white), + padding: MaterialStatePropertyAll(EdgeInsets.symmetric(vertical: 20,horizontal: 8)), + ), + onSelected: (ColorLabel? color) { + setState(() { + selectedColor = color; + }); + }, + dropdownMenuEntries: ColorLabel.values.map((ColorLabel color) { + return DropdownMenuEntry( + value: color, + label: color.label, + enabled: color.label != 'Grey', + style: MenuItemButton.styleFrom( + foregroundColor: color.color, + ), + ); + } + ).toList(), + ); + } + + Widget _buildInfo() { + if (selectedColor != null && selectedIcon != null) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('You selected a ${selectedColor?.label} ${selectedIcon?.label}'), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon( + selectedIcon?.icon, + color: selectedColor?.color, + ), + ) + ], + ); + } + return const Text('Please select a color and an icon.'); + } + + Widget _buildLabelMenu() { + return DropdownMenu( + controller: iconController, + enableFilter: false, + requestFocusOnTap: false, + width: 160, + leadingIcon: const Icon(Icons.search), + label: const Text('Icon'), + inputDecorationTheme: const InputDecorationTheme( + filled: true, + contentPadding: EdgeInsets.symmetric(vertical: 5.0), + ), + onSelected: (IconLabel? icon) { + setState(() { + selectedIcon = icon; + }); + }, + dropdownMenuEntries: IconLabel.values.map((IconLabel icon) { + return DropdownMenuEntry( + value: icon, + label: icon.label, + leadingIcon: Icon(icon.icon), + ); + }, + ).toList(), + ); + } +} + + + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart new file mode 100644 index 00000000..f401df20 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + +class User { + final String name; + final bool man; + final String image; + + const User(this.name, this.man, this.image); + + @override + String toString() { + return 'User{name: $name, man: $man, image: $image}'; + } +} + +class DropdownMenuNode3 extends StatefulWidget { + const DropdownMenuNode3({ super.key }); + + @override + State createState() => _DropdownMenuNode3State(); +} + +class _DropdownMenuNode3State extends State { + late final TextEditingController controller; + + List data = const [ + User('toly', true, 'icon_5.webp'), + User('toly49', false, 'icon_6.webp'), + User('toly42', true, 'icon_7.webp'), + User('toly56', false, 'icon_8.webp'), + User('card', true, 'icon_5.webp'), + User('ls', true, 'icon_6.webp'), + User('alex', true, 'icon_7.webp'), + User('fan sha', false, 'icon_8.webp'), + ]; + + User? _selectUser; + + @override + void initState() { + super.initState(); + controller = TextEditingController(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return DropdownMenu( + width: 300, + menuHeight: 250, + controller: controller, + leadingIcon: _selectUser!=null?SizedBox( + width: 26, + height: 26, + child: Center( + child: CircleAvatar( + radius: 14, + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${_selectUser!.image}'), + ), + ), + ):null, + label: const Text('选择用户'), + onSelected: (User? user) { + print('Selected $user'); + setState(() { + _selectUser = user; + + }); + }, + dropdownMenuEntries: data.map>((User user) { + return DropdownMenuEntry( + value: user, + label: user.name, + // Try commenting the labelWidget out or changing + // the labelWidget's Text parameters. + labelWidget: _UserItem(user: user), + ); + }).toList(), + ); + } +} +class _UserItem extends StatelessWidget { + final User user; + + const _UserItem({ + Key? key, + required this.user, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 6), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${user.image}'), + ), + const SizedBox(width: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(user.name), + Text( + '性别:'+ (user.man ? '男' : '女'), + style: const TextStyle(color: Colors.grey), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json new file mode 100644 index 00000000..c74d1d99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Bearbarer Text", + "info": "Bearbarer Text ist die grundlegendste Komponente von TextField und wird in der Regel nicht allein verwendet.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von EditableText", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【focusNode】 : Fokus 【FocusNode】", + "【style】 : Textstil 【TextStyle】", + "【backgroundCursorColor】 : Hintergrundcursorfarbe 【Color】", + "【cursorColor】 : Cursorfarbe 【Color】", + "Die oben genannten fünf Attribute sind für EditableText obligatorisch, andere sind identisch mit TextField und werden hier nicht aufgeführt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json new file mode 100644 index 00000000..54b54a0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Editable Text", + "info": "Editable text is the core component at the bottom layer of TextField and is generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of EditableText", + "desc": [ + "【controller】: Controller 【TextEditingController】", + "【focusNode】: Focus Node 【FocusNode】", + "【style】: Text Style 【TextStyle】", + "【backgroundCursorColor】: Background Cursor Color 【Color】", + "【cursorColor】: Cursor Color 【Color】", + "The above five are the essential properties of EditableText. Others are the same as TextField and will not be listed here." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json new file mode 100644 index 00000000..54869ba9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texto editable", + "info": "Texto que se puede editar, es el componente central subyacente de TextField, generalmente no se usa solo.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de EditableText", + "desc": [ + "【controller】: Controlador 【TextEditingController】", + "【focusNode】: Foco 【FocusNode】", + "【style】: Estilo de texto 【TextStyle】", + "【backgroundCursorColor】: Color del cursor de fondo 【Color】", + "【cursorColor】: Color del cursor 【Color】", + "Los cinco anteriores son atributos obligatorios de EditableText, otros son iguales a TextField, no se enumeran aquí." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json new file mode 100644 index 00000000..8c42e91c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texte modifiable", + "info": "Texte qui peut être édité, c'est le composant central sous-jacent de TextField, généralement non utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de EditableText", + "desc": [ + "【controller】 : Contrôleur 【TextEditingController】", + "【focusNode】 : Nœud de focus 【FocusNode】", + "【style】 : Style de texte 【TextStyle】", + "【backgroundCursorColor】 : Couleur du curseur de fond 【Color】", + "【cursorColor】 : Couleur du curseur 【Color】", + "Les cinq propriétés ci-dessus sont obligatoires pour EditableText, les autres sont similaires à TextField et ne sont pas listées ici." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json new file mode 100644 index 00000000..c3ec0779 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Testo modificabile", + "info": "Testo che può essere modificato, è il componente più fondamentale di TextField, generalmente non utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di EditableText", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【focusNode】 : Focus 【FocusNode】", + "【style】 : Stile del testo 【TextStyle】", + "【backgroundCursorColor】 : Colore del cursore di sfondo 【Color】", + "【cursorColor】 : Colore del cursore 【Color】", + "I cinque attributi sopra sono obbligatori per EditableText, gli altri sono simili a TextField e non verranno elencati qui." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json new file mode 100644 index 00000000..4098e386 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "編集可能なテキスト", + "info": "編集可能なテキストで、TextFieldの最もコアなコンポーネントです。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableTextの基本使用", + "desc": [ + "【controller】 : コントローラー 【TextEditingController】", + "【focusNode】 : フォーカス 【FocusNode】", + "【style】 : テキストスタイル 【TextStyle】", + "【backgroundCursorColor】 : 背景カーソルカラー 【Color】", + "【cursorColor】 : カーソルカラー 【Color】", + "上記の5つはEditableTextの必須属性です。その他はTextFieldと同じで、ここでは列挙しません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json new file mode 100644 index 00000000..b3865d54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "편집 가능한 텍스트", + "info": "편집 가능한 텍스트는 TextField의 가장 핵심적인 구성 요소로, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableText 기본 사용법", + "desc": [ + "【controller】 : 컨트롤러 【TextEditingController】", + "【focusNode】 : 포커스 【FocusNode】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【backgroundCursorColor】 : 배경 커서 색상 【Color】", + "【cursorColor】 : 커서 색상 【Color】", + "위 다섯 가지는 EditableText의 필수 속성이며, 나머지는 TextField와 동일하므로 여기서는 더 이상 열거하지 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json new file mode 100644 index 00000000..e558d541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texto Editável", + "info": "Texto que pode ser editado, é o componente central mais básico do TextField, geralmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do EditableText", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【focusNode】 : Foco 【FocusNode】", + "【style】 : Estilo de Texto 【TextStyle】", + "【backgroundCursorColor】 : Cor do Cursor de Fundo 【Color】", + "【cursorColor】 : Cor do Cursor 【Color】", + "Os cinco acima são atributos obrigatórios do EditableText, outros são semelhantes ao TextField, não serão listados aqui." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json new file mode 100644 index 00000000..b0182f62 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Редактируемый текст", + "info": "Редактируемый текст, это основной компонент TextField, обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование EditableText", + "desc": [ + "【controller】 : Контроллер 【TextEditingController】", + "【focusNode】 : Фокус 【FocusNode】", + "【style】 : Стиль текста 【TextStyle】", + "【backgroundCursorColor】 : Цвет фонового курсора 【Color】", + "【cursorColor】 : Цвет курсора 【Color】", + "Эти пять свойств являются обязательными для EditableText, остальные аналогичны TextField и здесь не перечисляются." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json new file mode 100644 index 00000000..01075660 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "可编辑文字", + "info": "可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableText基本使用", + "desc": [ + "【controller】 : 控制器 【TextEditingController】", + "【focusNode】 : 焦点 【FocusNode】", + "【style】 : 文字样式 【TextStyle】", + "【backgroundCursorColor】 : 背景游标颜色 【Color】", + "【cursorColor】 : 游标颜色 【Color】", + "上面五个是EditableText必须的属性,其他同TextField,此处不再列举。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart new file mode 100644 index 00000000..951baf83 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class EditableTextDemo extends StatefulWidget { + const EditableTextDemo({Key? key}) : super(key: key); + + @override + _EditableTextDemoState createState() => _EditableTextDemoState(); +} + +class _EditableTextDemoState extends State { + final TextEditingController _ctrl = + TextEditingController(text: 'Hello Flutter Unit!'); + final FocusNode _node = FocusNode(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: EditableText( + controller: _ctrl, + focusNode: _node, + style: const TextStyle(fontSize: 16, color: Colors.blue), + cursorColor: Colors.blue, + backgroundCursorColor: Colors.orange, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json new file mode 100644 index 00000000..35e6a1b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Erhobener Button", + "info": "Material-stil erhobener Button, ähnlich wie RaisedButton. Eigenschaften wie Rahmen, Farbe, Schatten können durch Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ElevatedButton", + "desc": [ + "【child】 : Hat es ein scrollendes Hauptelement 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langer Druckereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil von ElevatedButton", + "desc": [ + "【style】 : Button-Stil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json new file mode 100644 index 00000000..ece99fa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Raised Button", + "info": "A Material-styled raised button, similar in behavior to RaisedButton. Properties such as border, color, and shadow can be changed through styling.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ElevatedButton", + "desc": [ + "【child】: Whether it has a scrollable body 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onLongPress】: Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton Style", + "desc": [ + "【style】: Button style 【ButtonStyle】", + "【focusNode】: Focus 【FocusNode】", + "【clipBehavior】: Clip behavior 【Clip】", + "【autofocus】: Auto focus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json new file mode 100644 index 00000000..4381dd4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Botón elevado", + "info": "Botón elevado de estilo Material, similar en comportamiento a RaisedButton. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., mediante estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ElevatedButton", + "desc": [ + "【child】 : Si tiene un cuerpo desplazable 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación prolongada 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de ElevatedButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json new file mode 100644 index 00000000..3768217e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Bouton surélevé", + "info": "Bouton de style Material, similaire à RaisedButton. Les propriétés telles que la bordure, la couleur, l'ombre peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ElevatedButton", + "desc": [ + "【child】 : Si le bouton a un corps défilant 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de pression longue 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style d'ElevatedButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json new file mode 100644 index 00000000..c5887407 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Pulsante sollevato", + "info": "Pulsante in stile Material, simile a RaisedButton. È possibile modificare proprietà come bordo, colore, ombra, ecc. attraverso lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ElevatedButton", + "desc": [ + "【child】 : Se ha un corpo scorrevole 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione lunga 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di ElevatedButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json new file mode 100644 index 00000000..f094a53f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "昇格ボタン", + "info": "Materialスタイルの昇格ボタンで、RaisedButtonと似たような動作をします。スタイルを変更して、ボーダー、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButtonの基本使用", + "desc": [ + "【child】 : スクロール主体を持つかどうか 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json new file mode 100644 index 00000000..af9be933 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "올라간 버튼", + "info": "Material 스타일의 올라간 버튼으로, RaisedButton과 유사하게 동작합니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButton 기본 사용법", + "desc": [ + "【child】 : 스크롤 가능한 본체 여부 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json new file mode 100644 index 00000000..91c7f259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Botão Elevado", + "info": "Botão elevado no estilo Material, semelhante ao RaisedButton. Pode alterar propriedades como borda, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ElevatedButton", + "desc": [ + "【child】 : Se tem um corpo rolável 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressão longa 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do ElevatedButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json new file mode 100644 index 00000000..91c2bfe1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Поднятая кнопка", + "info": "Кнопка в стиле Material, похожая на RaisedButton. Можно изменить свойства, такие как граница, цвет, тень и т.д., через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ElevatedButton", + "desc": [ + "【child】 : Имеет ли прокручиваемое содержимое 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль ElevatedButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json new file mode 100644 index 00000000..a4f8675d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "升起按钮", + "info": "Material风格的升起按钮,表现和RaisedButton类似。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButton基本使用", + "desc": [ + "【child】 : 是否具有滚动主体 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart new file mode 100644 index 00000000..68ce3de1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ElevatedButtonDemo extends StatelessWidget { + const ElevatedButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + height: 60, + child: Wrap( + spacing: 20, + children: [ + ElevatedButton( + child: const Text('ElevatedButton'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + const ElevatedButton( + child: Text('禁用按钮'), + onPressed: null, + onLongPress: null, + ), + ], + )); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart new file mode 100644 index 00000000..afe9bf65 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ElevatedButtonStyleDemo extends StatelessWidget { + const ElevatedButtonStyleDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + child: Wrap( + spacing: 10, + children: [ + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.orange, + foregroundColor: Colors.white, + elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('ElevatedButton样式'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + side: const BorderSide(color: Colors.blue,width: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)) + ), + // elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('ElevatedButton边线'), + autofocus: false, + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + ], + ), + ); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json new file mode 100644 index 00000000..adafa04d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Erweitern-Symbol", + "info": "Ein Erweitern-Button, der beim Klicken eine 180-Grad-Drehanimation ausführt. Kann Farbe, Größe, Rand angeben und Klickereignisse empfangen.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpandIcon", + "desc": [ + "【isExpanded】 : Ob erweitert 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【size】 : Symbolgröße 【double】", + "【color】 : Farbe wenn nicht erweitert 【Color】", + "【expandedColor】 : Farbe wenn erweitert 【Color】", + "【onPressed】 : Klickereignis 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json new file mode 100644 index 00000000..09a290c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Expand Icon", + "info": "An expand button that performs a 180-degree rotation animation when clicked. Can specify color, size, margin, and receive click events.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpandIcon", + "desc": [ + "【isExpanded】 : Whether expanded 【bool】", + "【padding】 : Padding 【EdgeInsetsGeometry】,", + "【size】 : Icon size 【double】", + "【color】 : Color when not expanded 【Color】", + "【expandedColor】 : Color when expanded 【Color】", + "【onPressed】 : Click event 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json new file mode 100644 index 00000000..3b1b28a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icono de expansión", + "info": "Un botón de expansión que, al hacer clic, realiza una animación de rotación de 180 grados. Se puede especificar el color, el tamaño, el margen y recibir eventos de clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpandIcon", + "desc": [ + "【isExpanded】 : Si está expandido 【bool】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】,", + "【size】 : Tamaño del icono 【double】", + "【color】 : Color cuando no está expandido 【Color】", + "【expandedColor】 : Color cuando está expandido 【Color】", + "【onPressed】 : Evento de clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json new file mode 100644 index 00000000..31b6694f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icône de déploiement", + "info": "Un bouton de déploiement qui exécute une animation de rotation de 180 degrés lorsqu'il est cliqué. Peut spécifier la couleur, la taille, la marge et recevoir des événements de clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ExpandIcon", + "desc": [ + "【isExpanded】 : Déployé ou non 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】,", + "【size】 : Taille de l'icône 【double】", + "【color】 : Couleur lorsqu'il n'est pas déployé 【Color】", + "【expandedColor】 : Couleur lorsqu'il est déployé 【Color】", + "【onPressed】 : Événement de clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json new file mode 100644 index 00000000..a166b811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icona Espandi", + "info": "Un pulsante di espansione che esegue un'animazione di rotazione di 180 gradi quando viene cliccato. È possibile specificare colore, dimensione, margine e ricevere eventi di clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpandIcon", + "desc": [ + "【isExpanded】 : Se è espanso 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】,", + "【size】 : Dimensione dell'icona 【double】", + "【color】 : Colore quando non è espanso 【Color】", + "【expandedColor】 : Colore quando è espanso 【Color】", + "【onPressed】 : Evento di clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json new file mode 100644 index 00000000..561d97c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "展開アイコン", + "info": "展開ボタンで、クリックすると180度回転するアニメーションを自動的に実行します。色、サイズ、マージンを指定でき、クリックイベントを受け取ります。", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIconの基本的な使用", + "desc": [ + "【isExpanded】 : 展開されているかどうか 【bool】", + "【padding】 : パディング 【EdgeInsetsGeometry】,", + "【size】 : アイコンのサイズ 【double】", + "【color】 : 展開されていないときの色 【Color】", + "【expandedColor】 : 展開されているときの色 【Color】", + "【onPressed】 : クリックイベント 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json new file mode 100644 index 00000000..86696afd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "펼치기 아이콘", + "info": "펼치기 버튼으로, 클릭 시 180도 회전 애니메이션을 자동으로 실행합니다. 색상, 크기, 여백을 지정할 수 있으며 클릭 이벤트를 받습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIcon 기본 사용", + "desc": [ + "【isExpanded】 : 펼쳐져 있는지 여부 【bool】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】,", + "【size】 : 아이콘 크기 【double】", + "【color】 : 펼쳐지지 않았을 때 색상 【Color】", + "【expandedColor】 : 펼쳐졌을 때 색상 【Color】", + "【onPressed】 : 클릭 이벤트 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json new file mode 100644 index 00000000..61a79288 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Ícone de Expansão", + "info": "Um botão de expansão que executa uma animação de rotação de 180 graus ao ser clicado. Pode especificar cor, tamanho, margem e receber eventos de clique.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ExpandIcon", + "desc": [ + "【isExpanded】 : Se está expandido 【bool】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】,", + "【size】 : Tamanho do ícone 【double】", + "【color】 : Cor quando não expandido 【Color】", + "【expandedColor】 : Cor quando expandido 【Color】", + "【onPressed】 : Evento de clique 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json new file mode 100644 index 00000000..f642cbde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Иконка раскрытия", + "info": "Кнопка раскрытия, которая при нажатии выполняет анимацию поворота на 180 градусов. Можно указать цвет, размер, отступы и обрабатывать события нажатия.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpandIcon", + "desc": [ + "【isExpanded】 : Раскрыто ли 【bool】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【size】 : Размер иконки 【double】", + "【color】 : Цвет в нераскрытом состоянии 【Color】", + "【expandedColor】 : Цвет в раскрытом состоянии 【Color】", + "【onPressed】 : Событие нажатия 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json new file mode 100644 index 00000000..0e38b4cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "展开图标", + "info": "一个展开按钮,点击时会自己执行旋转180的动画。可指定颜色、大小、边距,接收点击事件。", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIcon基本使用", + "desc": [ + "【isExpanded】 : 是否展开 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】,", + "【size】 : 图标大小 【double】", + "【color】 : 不展开时颜色 【Color】", + "【expandedColor】 : 展开时颜色 【Color】", + "【onPressed】 : 点击事件 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart new file mode 100644 index 00000000..f3c3ae02 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com + +class CustomExpandIcon extends StatefulWidget { + const CustomExpandIcon({Key? key}) : super(key: key); + + @override + _CustomExpandIconState createState() => _CustomExpandIconState(); +} + +class _CustomExpandIconState extends State { + bool _closed = true; + + @override + Widget build(BuildContext context) { + return ExpandIcon( + isExpanded: _closed, + padding: const EdgeInsets.all(5), + size: 30, + color: Colors.blue, + expandedColor: Colors.orangeAccent, + onPressed: (value) => setState(() => _closed = !_closed), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json new file mode 100644 index 00000000..1fa12fbc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Erweiterungsliste", + "info": "Erweiterbare Listenkomponente, die logisch für einfache oder mehrfache Erweiterungen implementiert werden kann. Kann die Animationsdauer für die Erweiterung festlegen und empfängt einen Rückruf bei der Erweiterung", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpansionPanelList", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【animationDuration】 : Animationsdauer 【Duration】", + "【expansionCallback】 : Rückruf bei Erweiterung 【List】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json new file mode 100644 index 00000000..2c2c9e00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Expandable List", + "info": "A list component that can be expanded, which can implement single or multiple expansions based on logic. You can specify the duration of the expansion animation and receive expansion callbacks.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpansionPanelList", + "desc": [ + "【children】: List of child components 【List】", + "【animationDuration】: Animation duration 【Duration】", + "【expansionCallback】: Expansion callback 【List】", + "【onPressed】: Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json new file mode 100644 index 00000000..7ad00b1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Expandible", + "info": "Componente de lista expandible que puede implementar expansión única o múltiple según la lógica. Puede especificar la duración de la animación de expansión y recibir una devolución de llamada de expansión.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpansionPanelList", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【animationDuration】 : Duración de la animación 【Duration】", + "【expansionCallback】 : Devolución de llamada de expansión 【List】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json new file mode 100644 index 00000000..80df8e54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Liste de déploiement", + "info": "Composant de liste extensible, pouvant être implémenté pour un déploiement unique ou multiple selon la logique. Permet de spécifier la durée de l'animation de déploiement et reçoit un rappel de déploiement.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ExpansionPanelList", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【animationDuration】 : Durée de l'animation 【Duration】", + "【expansionCallback】 : Rappel de déploiement 【List】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json new file mode 100644 index 00000000..eef55654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Espandibile", + "info": "Componente lista espandibile, può essere implementato per espansione singola o multipla in base alla logica. È possibile specificare la durata dell'animazione di espansione e ricevere un callback di espansione", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpansionPanelList", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【animationDuration】 : Durata dell'animazione 【Duration】", + "【expansionCallback】 : Callback di espansione 【List】", + "【onPressed】 : Evento di click 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json new file mode 100644 index 00000000..4d590b2a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "展開リスト", + "info": "展開可能なリストコンポーネントで、ロジックに応じて単一展開または複数展開を実現できます。展開アニメーションの持続時間を指定でき、展開コールバックを受け取ります", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【animationDuration】 : アニメーションの持続時間 【Duration】", + "【expansionCallback】 : 展開コールバック 【List】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json new file mode 100644 index 00000000..21d91c6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "확장 목록", + "info": "확장 가능한 목록 컴포넌트로, 로직에 따라 단일 확장 또는 다중 확장을 구현할 수 있습니다. 확장 애니메이션 지속 시간을 지정할 수 있으며, 확장 콜백을 받습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList 기본 사용", + "desc": [ + "【children】 : 자식 컴포넌트 목록 【List】", + "【animationDuration】 : 애니메이션 지속 시간 【Duration】", + "【expansionCallback】 : 확장 콜백 【List】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json new file mode 100644 index 00000000..4432a019 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Expansível", + "info": "Componente de lista expansível, pode implementar expansão única ou múltipla de acordo com a lógica. Pode especificar a duração da animação de expansão e receber um callback de expansão.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ExpansionPanelList", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【animationDuration】 : Duração da animação 【Duration】", + "【expansionCallback】 : Callback de expansão 【List】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json new file mode 100644 index 00000000..6ab3ff8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Раскрывающийся список", + "info": "Раскрывающийся компонент списка, который может быть реализован для одиночного или множественного раскрытия в зависимости от логики. Можно указать продолжительность анимации раскрытия, принимает обратный вызов при раскрытии", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpansionPanelList", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【animationDuration】 : Продолжительность анимации 【Duration】", + "【expansionCallback】 : Обратный вызов при раскрытии 【List】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json new file mode 100644 index 00000000..25d51a59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "展开列表", + "info": "可展开的列表组件,可根据逻辑来实现单展开或多展开。可指定展开动画时长,接收展开回调", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【animationDuration】 : 动画时长 【Duration】", + "【expansionCallback】 : 展开回调 【List】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart new file mode 100644 index 00000000..2576dc4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomExpansionPanelList extends StatefulWidget { + const CustomExpansionPanelList({Key? key}) : super(key: key); + + @override + _CustomExpansionPanelListState createState() => + _CustomExpansionPanelListState(); +} + +class _CustomExpansionPanelListState extends State { + final List data = [ + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + int _position = 0; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 300, + child: ExpansionPanelList( + children: data.map((color) => _buildItem(color)).toList(), + animationDuration: const Duration(milliseconds: 200), + expansionCallback: (index, open) { + setState(() => _position = open ? -1 : index); + }, + ), + ); + } + + ExpansionPanel _buildItem(Color color) { + return ExpansionPanel( + isExpanded: data.indexOf(color) == _position, + canTapOnHeader: true, + headerBuilder: (ctx, index) => Center( + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Container( + height: 30, + width: 30, + decoration: + BoxDecoration(color: color, shape: BoxShape.circle), + ), + Container( + width: 120, + alignment: Alignment.center, + height: 50, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.black), + ), + ), + ], + ), + ), + body: Container( + alignment: Alignment.center, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + )); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json new file mode 100644 index 00000000..e0286cec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Erweiterungs-Kachel", + "info": "Ein allgemeines Erweiterungsfeld, das Komponenten an einer bestimmten Stelle platzieren kann. Beim Klicken werden die darunter liegenden Komponenten ein- und ausgeklappt. Empfängt Ereignisse beim Einklappen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpansionTile", + "desc": [ + "【children】 : Erweiterungsinhalt 【List】", + "【leading】 : Linke Kopfkomponente 【Widget】", + "【title】 : Mittlere Kopfkomponente 【Widget】", + "【trailing】 : Rechte Kopfkomponente 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【onExpansionChanged】 : Einklapp-Ereignis 【Function(bool)】", + "【initiallyExpanded】 : Beim Start erweitert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json new file mode 100644 index 00000000..26aadb37 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Expand Tile", + "info": "A general-purpose expansion panel that can place components in specified locations. Clicking it will collapse or expand the components below. Receives events upon collapsing.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpansionTile", + "desc": [ + "【children】: Expanded content 【List】", + "【leading】: Leading component 【Widget】", + "【title】: Title component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【onExpansionChanged】: Collapse event 【Function(bool)】", + "【initiallyExpanded】: Whether initially expanded 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json new file mode 100644 index 00000000..bcd41126 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Panel Expandible", + "info": "Un panel expandible genérico que permite colocar componentes en áreas específicas. Al hacer clic, se pliega o despliega para mostrar u ocultar los componentes inferiores. Recibe eventos al plegarse.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpansionTile", + "desc": [ + "【children】: Contenido expandido 【List】", + "【leading】: Componente izquierdo del encabezado 【Widget】", + "【title】: Componente central del encabezado 【Widget】", + "【trailing】: Componente derecho del encabezado 【Widget】", + "【backgroundColor】: Color de fondo 【Color】", + "【onExpansionChanged】: Evento de plegado 【Function(bool)】", + "【initiallyExpanded】: Si está inicialmente expandido 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json new file mode 100644 index 00000000..53c7262c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Tuile d'expansion", + "info": "Un panneau d'expansion générique qui peut placer des composants dans une partie spécifiée. Cliquez pour plier ou déplier les composants ci-dessous. Reçoit un événement lors du pliage.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ExpansionTile", + "desc": [ + "【children】 : Contenu déplié 【List】", + "【leading】 : Composant gauche de la tête 【Widget】", + "【title】 : Composant central de la tête 【Widget】", + "【trailing】 : Composant droit de la tête 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【onExpansionChanged】 : Événement de pliage 【Function(bool)】", + "【initiallyExpanded】 : Déplié initialement 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json new file mode 100644 index 00000000..7c14f9be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Piastrella Espandibile", + "info": "Un pannello espandibile generico, che può posizionare componenti in aree specifiche. Cliccando, si espande o collassa per mostrare o nascondere i componenti sottostanti. Riceve eventi quando viene collassato.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpansionTile", + "desc": [ + "【children】 : Contenuto espanso 【List】", + "【leading】 : Componente sinistro dell'intestazione 【Widget】", + "【title】 : Componente centrale dell'intestazione 【Widget】", + "【trailing】 : Componente destro dell'intestazione 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【onExpansionChanged】 : Evento di collassamento 【Function(bool)】", + "【initiallyExpanded】 : Se espanso inizialmente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json new file mode 100644 index 00000000..9dd2b3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "展開タイル", + "info": "一般的な展開バーで、指定された部分にコンポーネントを配置でき、クリックすると下のコンポーネントを折りたたんで表示/非表示にします。折りたたみ時のイベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTileの基本的な使用", + "desc": [ + "【children】 : 展開内容 【List】", + "【leading】 : ヘッダー左コンポーネント 【Widget】", + "【title】 : ヘッダー中央コンポーネント 【Widget】", + "【trailing】 : ヘッダー右コンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【onExpansionChanged】 : 折りたたみイベント 【Function(bool)】", + "【initiallyExpanded】 : 初期状態で展開されているか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json new file mode 100644 index 00000000..ab1bf332 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "확장 타일", + "info": "일반적인 확장 바, 지정된 부분에 컴포넌트를 배치할 수 있으며, 클릭 시 아래 컴포넌트를 접거나 펼칠 수 있습니다. 접힐 때 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTile 기본 사용", + "desc": [ + "【children】 : 확장 내용 【List】", + "【leading】 : 헤더 왼쪽 컴포넌트 【Widget】", + "【title】 : 헤더 중앙 컴포넌트 【Widget】", + "【trailing】 : 헤더 오른쪽 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【onExpansionChanged】 : 접힘 이벤트 【Function(bool)】", + "【initiallyExpanded】 : 초기 상태에서 펼쳐져 있는지 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json new file mode 100644 index 00000000..5ad3db3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Azulejo de Expansão", + "info": "Uma barra de expansão genérica que pode ser usada para colocar componentes em uma área especificada. Clicar nela irá expandir ou recolher os componentes abaixo. Recebe eventos quando recolhida.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ExpansionTile", + "desc": [ + "【children】: Conteúdo expandido 【List】", + "【leading】: Componente à esquerda do cabeçalho 【Widget】", + "【title】: Componente no centro do cabeçalho 【Widget】", + "【trailing】: Componente à direita do cabeçalho 【Widget】", + "【backgroundColor】: Cor de fundo 【Color】", + "【onExpansionChanged】: Evento de recolhimento 【Function(bool)】", + "【initiallyExpanded】: Expandido inicialmente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json new file mode 100644 index 00000000..92d07803 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Раскрывающаяся плитка", + "info": "Универсальная раскрывающаяся панель, в которой можно разместить компоненты в указанной области. При нажатии сворачивает или раскрывает компоненты снизу. Получает события при сворачивании.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpansionTile", + "desc": [ + "【children】 : Раскрываемое содержимое 【List】", + "【leading】 : Компонент слева в заголовке 【Widget】", + "【title】 : Компонент в центре заголовка 【Widget】", + "【trailing】 : Компонент справа в заголовке 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【onExpansionChanged】 : Событие сворачивания 【Function(bool)】", + "【initiallyExpanded】 : Раскрыт ли изначально 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json new file mode 100644 index 00000000..8eca010f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "展开瓦片", + "info": "一个通用的展开栏,可在指定的部位安放组件,点击时会折叠显隐下方组件。接收折叠时事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTile基本使用", + "desc": [ + "【children】 : 展开内容 【List】", + "【leading】 : 头左组件 【Widget】", + "【title】 : 头中组件 【Widget】", + "【trailing】 : 头尾组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【onExpansionChanged】 : 折叠事件 【Function(bool)】", + "【initiallyExpanded】 : 是否初始时展开 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart new file mode 100644 index 00000000..d3f0f816 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import '../../StatelessWidget/RadioListTile/node1_base.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomExpansionTile extends StatefulWidget { + const CustomExpansionTile({Key? key}) : super(key: key); + + @override + _CustomExpansionTileState createState() => _CustomExpansionTileState(); +} + +class _CustomExpansionTileState extends State { + @override + Widget build(BuildContext context) { + return ExpansionTile( + leading: const Icon(Icons.star), + title: const Text("选择语言"), + backgroundColor: Colors.grey.withAlpha(6), + onExpansionChanged: (value) { + print('$value'); + }, + initiallyExpanded: false, + children: const[CustomRadioListTile()], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json new file mode 100644 index 00000000..54c85111 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Gefüllter Button", + "info": "Ein gefüllter Button, der den Material Design-Richtlinien entspricht, dessen Stil durch FilledButtonTheme festgelegt wird.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Buttoninhalt 【Widget】", + "【onPressed】 : Klick-Ereignis 【VoidCallback】", + "【onHover】 : Hover-Ereignis 【ValueChanged? 】", + "【onLongPress】 : Langdruck-Ereignis 【VoidCallback?】", + "Der gefüllte Button ist visuell nur dem [FloatingActionButton] unterlegen und wird für wichtige, abschließende Aktionen wie Speichern, Sofort beitreten oder Bestätigen verwendet." + ] + }, + { + "file": "node2.dart", + "name": "Farbtonvariante", + "desc": [ + "FilledButton.tonal ist ein tonal gefüllter Button, der visuell zwischen [FilledButton] und [OutlinedButton] liegt und für Szenarien geeignet ist, die eine etwas stärkere Betonung als ein Konturbutton erfordern, aber eine niedrigere Priorität haben. Zum Beispiel der [Weiter] Button." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json new file mode 100644 index 00000000..45d61d7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Filled Button", + "info": "A filled button that conforms to Material Design, with styles set via FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage", + "desc": [ + "【child】: Button content 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onHover】: Long press event 【ValueChanged? 】", + "【onLongPress】: Long press event 【VoidCallback?】", + "The filled button is visually second only to [FloatingActionButton] and is used for important, finalizing actions such as save, join now, or confirm." + ] + }, + { + "file": "node2.dart", + "name": "Tonal Variant", + "desc": [ + "FilledButton.tonal is a tonal filled button, visually between [FilledButton] and [OutlinedButton], suitable for scenarios requiring slightly stronger emphasis than an outlined button but with lower priority. For example, a [Next] button." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json new file mode 100644 index 00000000..969b6c36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Botón Relleno", + "info": "Un botón relleno que cumple con Material Design, configurado a través de FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Contenido del botón 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onHover】 : Evento de mantener presionado 【ValueChanged? 】", + "【onLongPress】 : Evento de mantener presionado 【VoidCallback?】", + "El botón relleno es visualmente inferior al [FloatingActionButton], y se utiliza para acciones importantes y finales, como: guardar, unirse ahora o confirmar." + ] + }, + { + "file": "node2.dart", + "name": "Variante Tonal", + "desc": [ + "FilledButton.tonal es un botón relleno tonal, visualmente entre [FilledButton] y [OutlinedButton], adecuado para escenarios que requieren un énfasis ligeramente mayor que el botón de contorno pero con menor prioridad. Por ejemplo, el botón [Siguiente]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json new file mode 100644 index 00000000..e5cf563c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Bouton rempli", + "info": "Un bouton rempli conforme au Material Design, configurable via FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Contenu du bouton 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onHover】 : Événement de survol 【ValueChanged? 】", + "【onLongPress】 : Événement de pression longue 【VoidCallback?】", + "Le bouton rempli est visuellement secondaire au [FloatingActionButton], utilisé pour des actions importantes et finales, comme : sauvegarder, rejoindre immédiatement ou confirmer." + ] + }, + { + "file": "node2.dart", + "name": "Variante tonale", + "desc": [ + "FilledButton.tonal est un bouton rempli tonal, visuellement entre [FilledButton] et [OutlinedButton], adapté pour des scénarios nécessitant une emphase légèrement plus forte que le bouton contour mais avec une priorité moindre. Par exemple, le bouton [Suivant]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json new file mode 100644 index 00000000..065eda6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Pulsante Riempito", + "info": "Un pulsante conforme a Material Design che utilizza FilledButtonTheme per impostare lo stile del pulsante.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di Base", + "desc": [ + "【child】 : Contenuto del pulsante 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onHover】 : Evento di pressione prolungata 【ValueChanged? 】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback?】", + "Il pulsante riempito è visivamente secondario solo a [FloatingActionButton] e viene utilizzato per operazioni importanti e finali del flusso, come: salvare, unirsi immediatamente o confermare." + ] + }, + { + "file": "node2.dart", + "name": "Variante Tonale", + "desc": [ + "FilledButton.tonal è un pulsante riempito tonale, visivamente intermedio tra [FilledButton] e [OutlinedButton], adatto per scenari che richiedono un'enfasi leggermente maggiore rispetto ai pulsanti contornati ma con priorità inferiore. Ad esempio il pulsante [Avanti]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json new file mode 100644 index 00000000..cc03a205 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "塗りつぶしボタン", + "info": "Material Designに準拠した塗りつぶしボタンで、FilledButtonThemeを使用してボタンのスタイルを設定します。", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "基本使用", + "desc": [ + "【child】 : ボタンの内容 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onHover】 : 長押しイベント 【ValueChanged? 】", + "【onLongPress】 : 長押しイベント 【VoidCallback?】", + "塗りつぶしボタンは視覚的に [FloatingActionButton] に次ぐもので、重要な、最終的なプロセスを完了する操作に使用されます。例えば、保存、即時参加、確認などです。" + ] + }, + { + "file": "node2.dart", + "name": "トーンバリアント", + "desc": [ + "FilledButton.tonal はトーン塗りつぶしボタンで、視覚的に [FilledButton] と [OutlinedButton] の中間に位置し、輪郭ボタンよりもやや強い強調が必要だが優先度が低いシナリオに適しています。例えば [次へ] ボタン" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json new file mode 100644 index 00000000..ac83fa5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "채움 버튼", + "info": "Material Design을 준수하는 채움 버튼으로, FilledButtonTheme을 통해 버튼 스타일을 설정합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "기본 사용", + "desc": [ + "【child】 : 버튼 내용 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onHover】 : 롱프레스 이벤트 【ValueChanged? 】", + "【onLongPress】 : 롱프레스 이벤트 【VoidCallback?】", + "채움 버튼은 시각적으로 [FloatingActionButton] 다음으로 중요하며, 중요한 최종 프로세스 작업에 사용됩니다. 예: 저장, 즉시 가입 또는 확인." + ] + }, + { + "file": "node2.dart", + "name": "톤 변형", + "desc": [ + "FilledButton.tonal은 톤 채움 버튼으로, 시각적으로 [FilledButton]과 [OutlinedButton] 사이에 위치하며, 윤곽 버튼보다 약간 강조가 필요하지만 우선순위가 낮은 시나리오에 적합합니다. 예: [다음] 버튼" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json new file mode 100644 index 00000000..845de819 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Botão Preenchido", + "info": "Um botão preenchido que segue o Material Design, com o estilo definido pelo FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Conteúdo do botão 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onHover】 : Evento de passar o mouse 【ValueChanged? 】", + "【onLongPress】 : Evento de pressionar e segurar 【VoidCallback?】", + "O botão preenchido é visualmente inferior apenas ao [FloatingActionButton], sendo usado para ações importantes e finais do processo, como: salvar, juntar-se imediatamente ou confirmar." + ] + }, + { + "file": "node2.dart", + "name": "Variante de Tom", + "desc": [ + "FilledButton.tonal é um botão preenchido com tom, visualmente entre [FilledButton] e [OutlinedButton], adequado para cenários que precisam de um pouco mais de ênfase do que um botão de contorno, mas com menor prioridade. Por exemplo, o botão [Próximo]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json new file mode 100644 index 00000000..ef07de34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Заполненная кнопка", + "info": "Кнопка, соответствующая Material Design, стиль которой задается через FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Содержимое кнопки 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onHover】 : Событие наведения 【ValueChanged? 】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback?】", + "Заполненная кнопка визуально уступает только [FloatingActionButton] и используется для важных, завершающих действий, таких как: сохранение, немедленное присоединение или подтверждение." + ] + }, + { + "file": "node2.dart", + "name": "Тональный вариант", + "desc": [ + "FilledButton.tonal - это тональная заполненная кнопка, визуально находящаяся между [FilledButton] и [OutlinedButton], подходит для сценариев, где требуется немного больше акцента, чем у контурной кнопки, но с более низким приоритетом. Например, кнопка [Далее]." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json new file mode 100644 index 00000000..ececec5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "填充按钮", + "info": "一个符合 Material Design 的填充按钮,通过 FilledButtonTheme 设置按钮样式。", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "基本使用", + "desc": [ + "【child】 : 按钮内容 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onHover】 : 长按事件 【ValueChanged? 】", + "【onLongPress】 : 长按事件 【VoidCallback?】", + "填充按钮在视觉上仅次于 [FloatingActionButton],应用于重要的、最终完成流程的操作,例如: 保存、立即加入 或 确认。" + ] + }, + { + "file": "node2.dart", + "name": "色调变体", + "desc": [ + "FilledButton.tonal 是色调填充按钮,视觉上介于 [FilledButton] 和 [OutlinedButton] 之间,适用于需要比轮廓按钮稍强一些的强调但优先级较低的场景。例如 [下一步] 按钮 " + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart new file mode 100644 index 00000000..d083f55d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FilledButtonDemo1 extends StatelessWidget { + const FilledButtonDemo1({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap(spacing: 10, children: [ + FilledButton( + onPressed: () {}, + child: const Text('FilledButton'), + ), + const FilledButton( + onPressed: null, + child: Text('Disabled'), + ), + ]); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart new file mode 100644 index 00000000..2d8d078c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class FilledButtonDemo2 extends StatelessWidget { + const FilledButtonDemo2({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: [ + FilledButton.tonal( + onPressed: () {}, + child: const Text('FilledButton'), + ), + const FilledButton.tonal( + onPressed: null, + child: Text('Disabled'), + ), + ]); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json new file mode 100644 index 00000000..60ccb469 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Fokus-Komponente", + "info": "Eine Komponente zur Verwaltung von [FocusNode], die es ermöglicht, den Tastaturfokus auf dieses Widget und seine Unterbaumknoten zu setzen.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode Fokussierung und Defokussierung", + "desc": [ + "【focusNode】 : Fokus 【FocusNode?】", + "【onFocusChange】 : Fokusänderungsüberwachung 【ValueChanged?】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Automatische Fokussierung", + "desc": [ + "【autofocus】 : Automatische Fokussierung 【bool】", + "Das Flutter-Framework verfügt über integrierte Tastenkombinationen für den Fokuswechsel, z. B. ← und → für die horizontale Bildlaufleiste, um den Fokus auf das vorherige bzw. nächste Element zu setzen. Die Tab-Taste kann den Fokus auf den nächsten Focus-Knoten setzen." + ] + }, + { + "file": "node3.dart", + "name": "Tastaturereignis-Rückruf", + "desc": [ + "【onKeyEvent】 : Tastaturereignis-Rückruf 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json new file mode 100644 index 00000000..ba989bf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Focus Component", + "info": "A component that manages [FocusNode], used to allow keyboard focus to be assigned to this widget and its subtree nodes.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode Focus and Blur", + "desc": [ + "【focusNode】 : Focus 【FocusNode?】", + "【onFocusChange】 : Focus change listener 【ValueChanged?】", + "【child】 : Child widget 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Auto Focus", + "desc": [ + "【autofocus】 : Whether to auto focus 【bool】", + "The Flutter framework has built-in shortcuts for focus switching, such as ← and → for horizontal sliding lists to focus on the previous and next items respectively. The Tab key can focus on the next Focus node." + ] + }, + { + "file": "node3.dart", + "name": "Keyboard Event Callback", + "desc": [ + "【onKeyEvent】 : Keyboard event callback 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json new file mode 100644 index 00000000..cddd075d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente de enfoque", + "info": "Un componente que gestiona [FocusNode], utilizado para permitir que el enfoque del teclado se asigne a este widget y a los nodos de su subárbol.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Enfoque y desenfoque de FocusNode", + "desc": [ + "【focusNode】 : enfoque 【FocusNode?】", + "【onFocusChange】 : escucha de cambios de enfoque 【ValueChanged?】", + "【child】 : componente hijo 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Enfoque automático", + "desc": [ + "【autofocus】 : si se enfoca automáticamente 【bool】", + "El marco de Flutter incluye atajos de teclado para cambiar el enfoque, como deslizar horizontalmente la lista ←, → para enfocar el elemento anterior y posterior respectivamente. La tecla Tab puede enfocar el siguiente nodo Focus." + ] + }, + { + "file": "node3.dart", + "name": "Devolución de llamada de eventos de teclado", + "desc": [ + "【onKeyEvent】 : devolución de llamada de eventos de teclado 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json new file mode 100644 index 00000000..4e14496c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Composant de mise au point", + "info": "Un composant qui gère [FocusNode], utilisé pour permettre au focus clavier d'être attribué à ce widget et à ses nœuds enfants.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Mise au point et perte de focus de FocusNode", + "desc": [ + "【focusNode】 : focus 【FocusNode?】", + "【onFocusChange】 : écouteur de changement de focus 【ValueChanged?】", + "【child】 : composant enfant 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Mise au point automatique", + "desc": [ + "【autofocus】 : mise au point automatique 【bool】", + "Le framework Flutter intègre des raccourcis clavier pour changer le focus, par exemple, dans une liste défilable horizontalement, ← et → permettent de se concentrer respectivement sur l'élément précédent et suivant. La touche Tab permet de se concentrer sur le nœud Focus suivant" + ] + }, + { + "file": "node3.dart", + "name": "Rappel d'événement clavier", + "desc": [ + "【onKeyEvent】 : rappel d'événement clavier 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json new file mode 100644 index 00000000..f44e45b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente Focus", + "info": "Un componente che gestisce [FocusNode], utilizzato per consentire che il focus della tastiera venga assegnato a questo widget e ai suoi nodi secondari.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode messa a fuoco e perdita di fuoco", + "desc": [ + "【focusNode】 : focus 【FocusNode?】", + "【onFocusChange】 : listener per il cambio di focus 【ValueChanged?】", + "【child】 : componente figlio 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Autofocus", + "desc": [ + "【autofocus】 : se mettere a fuoco automaticamente 【bool】", + "Il framework Flutter ha scorciatoie integrate per il cambio di focus, ad esempio in una lista scorrevole orizzontalmente ← e → mettono a fuoco rispettivamente l'elemento precedente e successivo. Il tasto Tab può mettere a fuoco il prossimo nodo Focus." + ] + }, + { + "file": "node3.dart", + "name": "Callback per eventi della tastiera", + "desc": [ + "【onKeyEvent】 : callback per eventi della tastiera 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json new file mode 100644 index 00000000..223fd449 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "フォーカスコンポーネント", + "info": "[FocusNode]を管理するコンポーネントで、キーボードフォーカスをこのウィジェットとそのサブツリーノードに与えることを可能にします。", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode フォーカスとフォーカス解除", + "desc": [ + "【focusNode】 : フォーカス 【FocusNode?】", + "【onFocusChange】 : フォーカス変更リスナー 【ValueChanged?】", + "【child】 : 子コンポーネント 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "自動フォーカス", + "desc": [ + "【autofocus】 : 自動フォーカスするかどうか 【bool】", + "Flutterフレームワークには、フォーカス切り替えのショートカットキーが組み込まれており、例えば横方向にスクロールするリストでは ←、→ で前後の項目にフォーカスが移動します。Tabキーで次のFocusノードにフォーカスを移動できます" + ] + }, + { + "file": "node3.dart", + "name": "キーボードイベントコールバック", + "desc": [ + "【onKeyEvent】 : キーボードイベントコールバック 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json new file mode 100644 index 00000000..e78e6542 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "포커스 컴포넌트", + "info": "[FocusNode]를 관리하는 컴포넌트로, 키보드 포커스가 해당 위젯 및 하위 트리 노드에 부여될 수 있도록 합니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode 포커스와 포커스 해제", + "desc": [ + "【focusNode】 : 포커스 【FocusNode?】", + "【onFocusChange】 : 포커스 변화 리스너 【ValueChanged?】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "자동 포커스", + "desc": [ + "【autofocus】 : 자동 포커스 여부 【bool】", + "Flutter 프레임워크는 포커스 전환을 위한 단축키를 내장하고 있습니다. 예를 들어, 가로 스크롤 목록에서 ←, →는 각각 이전 항목과 다음 항목에 포커스를 줍니다. Tab 키는 다음 Focus 노드에 포커스를 줄 수 있습니다." + ] + }, + { + "file": "node3.dart", + "name": "키보드 이벤트 콜백", + "desc": [ + "【onKeyEvent】 : 키보드 이벤트 콜백 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json new file mode 100644 index 00000000..840780c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente de Foco", + "info": "Um componente que gerencia [FocusNode], usado para permitir que o foco do teclado seja atribuído a este widget e aos nós da sua subárvore.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Foco e Desfoco do FocusNode", + "desc": [ + "【focusNode】 : Foco 【FocusNode?】", + "【onFocusChange】 : Monitoramento de mudança de foco 【ValueChanged?】", + "【child】 : Componente filho 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Foco Automático", + "desc": [ + "【autofocus】 : Foco automático 【bool】", + "O framework Flutter possui atalhos de teclado embutidos para alternar o foco, como ← e → em listas de deslizamento horizontal para focar o item anterior e o próximo. A tecla Tab pode focar o próximo nó Focus." + ] + }, + { + "file": "node3.dart", + "name": "Callback de Evento de Teclado", + "desc": [ + "【onKeyEvent】 : Callback de evento de teclado 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json new file mode 100644 index 00000000..00506af5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Компонент фокуса", + "info": "Компонент, управляющий [FocusNode], который позволяет клавиатурному фокусу быть назначенным на этот виджет и его дочерние узлы.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Фокусировка и потер фокуса FocusNode", + "desc": [ + "【focusNode】 : фокус 【FocusNode?】", + "【onFocusChange】 : отслеживание изменений фокуса 【ValueChanged?】", + "【child】 : дочерний компонент 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Автоматическая фокусировка", + "desc": [ + "【autofocus】 : автоматическая фокусировка 【bool】", + "Фреймворк Flutter имеет встроенные сочетания клавиш для переключения фокуса, например, ← и → для горизонтального списка позволяют фокусироваться на предыдущем и следующем элементе. Клавиша Tab позволяет фокусироваться на следующем узле Focus." + ] + }, + { + "file": "node3.dart", + "name": "Обратный вызов событий клавиатуры", + "desc": [ + "【onKeyEvent】 : обратный вызов событий клавиатуры 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json new file mode 100644 index 00000000..accac233 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "焦点组件", + "info": "一个管理 [FocusNode] 的组件,用于允许键盘焦点被赋予该小部件及其子树节点。", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode 聚焦与失焦", + "desc": [ + "【focusNode】 : 焦点 【FocusNode?】", + "【onFocusChange】 : 焦点变化监听 【ValueChanged?】", + "【child】 : 子组件 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "自动聚焦", + "desc": [ + "【autofocus】 : 是否自动聚焦 【bool】", + "Flutter 框架内置了焦点切换的快捷键,比如横向滑动的列表 ←、→ 分别让前项和后项聚焦。Tab 键可以让下一个 Focus 节点聚焦" + ] + }, + { + "file": "node3.dart", + "name": "键盘事件回调", + "desc": [ + "【onKeyEvent】 : 键盘事件回调 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart new file mode 100644 index 00000000..f7814780 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart @@ -0,0 +1,72 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class FocusDemo1 extends StatefulWidget { + const FocusDemo1({super.key}); + + @override + State createState() => _FocusDemo1State(); +} + +class _FocusDemo1State extends State { + final FocusNode _focusNode = FocusNode(); + + @override + void dispose() { + super.dispose(); + _focusNode.dispose(); + } + + @override + Widget build(BuildContext context) { + return Focus( + focusNode: _focusNode, + onFocusChange: _onFocusChange, + child: GestureDetector( + onTap: _toggleFocus, + child: _FocusBox(active: _focusNode.hasFocus), + ), + ); + } + + void _onFocusChange(bool value) { + setState(() {}); + } + + void _toggleFocus() { + if (_focusNode.hasFocus) { + _focusNode.unfocus(); + } else { + _focusNode.requestFocus(); + } + } +} + +class _FocusBox extends StatelessWidget { + final bool active; + + const _FocusBox({super.key, required this.active}); + + @override + Widget build(BuildContext context) { + Color color = active ? Colors.blue : Colors.white; + Color borderColor = active ? Colors.lightBlue : Colors.grey; + Color? textColor = active ? Colors.white : null; + String text = active ? "点击失去焦点" : '点击获取焦点'; + return Container( + width: 120, + height: 60, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: borderColor), + color: color, + ), + alignment: Alignment.center, + child: Text(text, style: TextStyle(color: textColor)), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart new file mode 100644 index 00000000..da663acc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart @@ -0,0 +1,75 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +/// Flutter code sample for [Focus]. + +void main() => runApp(const FocusExampleApp()); + +class FocusExampleApp extends StatelessWidget { + const FocusExampleApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + home: FocusDemo2(), + ); + } +} + +class _FocusTiled extends StatelessWidget { + const _FocusTiled( + this.data, { + super.key, + required this.autofocus, + }); + + final String data; + final bool autofocus; + + @override + Widget build(BuildContext context) { + return Focus( + autofocus: autofocus, + child: Builder(builder: _buildTiled), + ); + } + + Widget _buildTiled(BuildContext context) { + FocusNode node = Focus.of(context); + bool focus = node.hasFocus; + Color color = focus ? Colors.blue : Colors.white; + Color? textColor = focus ? Colors.white : null; + return GestureDetector( + onTap: node.requestFocus, + child: Container( + padding: const EdgeInsets.all(8.0), + alignment: Alignment.center, + color: color, + child: Text(data, style: TextStyle(color: textColor)), + ), + ); + } +} + +class FocusDemo2 extends StatelessWidget { + const FocusDemo2({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: 56, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemBuilder: (_, int index) => _FocusTiled( + 'Item $index', + autofocus: index == 0, + ), + itemCount: 50, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart new file mode 100644 index 00000000..bbba3bef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class FocusDemo3 extends StatefulWidget { + const FocusDemo3({super.key}); + + @override + State createState() => _FocusDemo3State(); +} + +class _FocusDemo3State extends State { + FocusNode focusNode = FocusNode(); + List events = []; + ScrollController _ctrl = ScrollController(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) => focusNode.requestFocus(), + onTapOutside: (_) => focusNode.unfocus(), + child: Focus( + autofocus: true, + focusNode: focusNode, + onKeyEvent: _onKeyEvent, + child: _buildDisplay(), + ), + ), + ); + } + + KeyEventResult _onKeyEvent(FocusNode node,KeyEvent value) { + events.add(value); + setState(() {}); + _scrollToEnd(); + print('${value.runtimeType}:${value.logicalKey.keyLabel}'); + return KeyEventResult.ignored; + } + + void _onFocusChange() { + if (!focusNode.hasFocus) { + events.clear(); + } + setState(() {}); + } + + void _scrollToEnd() async { + if (_ctrl.hasClients) { + await Future.delayed(Duration(milliseconds: 200)); + _ctrl.animateTo(_ctrl.position.maxScrollExtent, + duration: Duration(milliseconds: 100), curve: Curves.ease); + } + } + + Widget _buildDisplay() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: events.isNotEmpty + ? SizedBox( + width: 460, + height: 60, + child: ListView.builder( + controller: _ctrl, + itemCount: events.length, + scrollDirection: Axis.horizontal, + itemBuilder: (_, index) => _KeyBoardBox( + event: events[index], + )), + ) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class _KeyBoardBox extends StatelessWidget { + final KeyEvent event; + + const _KeyBoardBox({super.key, required this.event}); + + @override + Widget build(BuildContext context) { + Color? color; + if (event is KeyDownEvent) { + color = Colors.blue; + } + if (event is KeyRepeatEvent) { + color = Colors.green; + } + if (event is KeyUpEvent) { + color = Colors.grey; + } + return Center( + child: Container( + margin: EdgeInsets.only(right: 4), + width: 32, + height: 32, + decoration: BoxDecoration(color: color), + alignment: Alignment.center, + child: Text( + event.logicalKey.keyLabel, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 8, height: 1), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json new file mode 100644 index 00000000..73eda55c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Formular-Komponente", + "info": "Die Formular-Komponente kann Rückrufe für Änderungen der darunter liegenden FormField-Komponenten empfangen, den Seitenrückruf über onWillPop abfangen und Formularfelder über FormState speichern oder validieren.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Form", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onChanged】 : Rückruf bei Formularänderungen 【VoidCallback】", + "【onWillPop】 : Rückruf bei Rückkehr 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json new file mode 100644 index 00000000..f2e847d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Form Component", + "info": "Form component, which can receive change callbacks from FormField components below it, intercept page returns through onWillPop, and save or validate form fields through FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Form", + "desc": [ + "【child】 : Child component 【Widget】", + "【onChanged】 : Form change callback 【VoidCallback】", + "【onWillPop】 : Return callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json new file mode 100644 index 00000000..dfcab4d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente de formulario", + "info": "Componente de formulario que puede recibir devoluciones de llamada de cambios de los componentes FormField debajo de él, interceptar el retorno de la página a través de onWillPop, y guardar o validar los campos del formulario a través de FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Form", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onChanged】 : Devolución de llamada de cambio de formulario 【VoidCallback】", + "【onWillPop】 : Devolución de llamada de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json new file mode 100644 index 00000000..0ac4e0db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Composant de formulaire", + "info": "Le composant de formulaire peut recevoir les rappels de changement des composants FormField qui lui sont associés, intercepter le retour de la page via onWillPop, et enregistrer ou valider les champs du formulaire via FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Form", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onChanged】 : Rappel de changement de formulaire 【VoidCallback】", + "【onWillPop】 : Rappel de retour 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json new file mode 100644 index 00000000..cdc73cfe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente modulo", + "info": "Il componente modulo può ricevere callback di modifica dai componenti FormField sottostanti, intercetta il ritorno alla pagina tramite onWillPop e consente di salvare o convalidare i campi del modulo tramite FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Form", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onChanged】 : Callback per le modifiche del modulo 【VoidCallback】", + "【onWillPop】 : Callback di ritorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json new file mode 100644 index 00000000..f7190629 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "フォームコンポーネント", + "info": "フォームコンポーネントは、その下のFormFieldコンポーネントの変更コールバックを受け取ることができ、onWillPopでページの戻りをインターセプトし、FormStateでフォームフィールドを保存または検証することができます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Formの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onChanged】 : フォーム変更コールバック 【VoidCallback】", + "【onWillPop】 : 戻りコールバック 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json new file mode 100644 index 00000000..dd14d454 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "폼 컴포넌트", + "info": "폼 컴포넌트는 하위 FormField 컴포넌트의 변경 콜백을 받을 수 있으며, onWillPop을 통해 페이지 반환을 가로채고, FormState를 통해 폼 필드를 저장하거나 검증할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Form 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onChanged】 : 폼 변경 콜백 【VoidCallback】", + "【onWillPop】 : 반환 콜백 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json new file mode 100644 index 00000000..679d3393 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente de Formulário", + "info": "Componente de formulário, pode receber retornos de chamada de alterações dos componentes FormField abaixo dele, interceptar o retorno da página através de onWillPop, e salvar ou validar os campos do formulário através de FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Form", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onChanged】 : Retorno de chamada de alteração do formulário 【VoidCallback】", + "【onWillPop】 : Retorno de chamada de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json new file mode 100644 index 00000000..58c176a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Компонент формы", + "info": "Компонент формы, который может получать обратные вызовы изменений от компонентов FormField, перехватывать возврат на страницу через onWillPop, а также сохранять или проверять поля формы через FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Form", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onChanged】 : Обратный вызов изменения формы 【VoidCallback】", + "【onWillPop】 : Обратный вызов возврата 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json new file mode 100644 index 00000000..18d129e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "表单组件", + "info": "表单组件,可以接收其下的FormField组件的变化回调,通过onWillPop拦截页面返回,通过FormState可对表单字段进行保存或校验。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Form基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onChanged】 : 表单变化回调 【VoidCallback】", + "【onWillPop】 : 返回回调 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart new file mode 100644 index 00000000..22d56bd8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomForm extends StatefulWidget { + const CustomForm({Key? key}) : super(key: key); + + @override + _CustomFormState createState() => _CustomFormState(); +} + +class _CustomFormState extends State { + final GlobalKey _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return Form( + onWillPop: () => _willPop(context), + key: _formKey, + onChanged: () { + print('Form---onChanged'); + }, + child: + Stack( + alignment: Alignment.centerRight, + children: [ + SizedBox( + width: 350, + child: UnconstrainedBox( + child: SizedBox( + width: 200, + height: 70, + child: TextFormField( + style: const TextStyle(textBaseline: TextBaseline.alphabetic), + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'username', + ), + validator: _validateUsername, + ), + ), + ), + ), + Positioned( + top: 0, right: 0, child: _buildSubmitButton(context)), + ], + ), + ); + } + + String? _validateUsername(value) { + if (value.isEmpty) { + return '用户名不能为空'; + } + return null; + } + + Widget _buildSubmitButton(BuildContext context) { + return ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + ), + onPressed: _onSubmit, + child: const Icon( + Icons.check, + color: Colors.white, + ), + ); + } + + void _onSubmit(){ + if(_formKey.currentState==null) return; + if (_formKey.currentState!.validate()) { + FocusScope.of(context).requestFocus(FocusNode()); + Navigator.of(context).pop(); + } + } + + Future _willPop(context) async { + return await showDialog( + context: context, + builder: (context) => AlertDialog( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + title: const Text('提示'), + content: const Text('你确定要离开此页吗?'), + actions: [ + ElevatedButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('确定'), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('取消'), + ), + ], + ), + ) ?? + false; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json new file mode 100644 index 00000000..40fa20bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Formularfeld", + "info": "Ein Formularfeld, das in der Form-Komponente verwendet werden muss, enthält ein Feld des generischen Typs T als Zustandsvariable. Aktualisierungen und Validierungen des Felds lösen entsprechende Rückrufe aus.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in FormField", + "desc": [ + "【builder】 : Inhaltsersteller 【FormFieldBuilder】", + "【initialValue】 : Anfangswert 【T】", + "【validator】 : Validierungsfunktion 【FormFieldValidator 】", + "【enabled】 : Ist aktiviert 【bool】", + "【onSaved】 : Rückruf beim Speichern des Formulars 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json new file mode 100644 index 00000000..c4b8578a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Form Field", + "info": "A form field that needs to be used within the Form component, containing a field of generic type T as the state. Updates and validations of the field will trigger corresponding callbacks.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField Introduction", + "desc": [ + "【builder】 : Content builder 【FormFieldBuilder】", + "【initialValue】 : Initial value 【T】", + "【validator】 : Validation function 【FormFieldValidator】", + "【enabled】 : Whether it is enabled 【bool】", + "【onSaved】 : Callback when the form is saved 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json new file mode 100644 index 00000000..b5f3f784 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo de formulario", + "info": "Un campo de formulario que debe usarse en el componente Form, contiene un campo de tipo genérico T como estado, y las actualizaciones y validaciones del campo activarán las devoluciones de llamada correspondientes.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a FormField", + "desc": [ + "【builder】 : Constructor de contenido 【FormFieldBuilder】", + "【initialValue】 : Valor inicial 【T】", + "【validator】 : Función de validación 【FormFieldValidator 】", + "【enabled】 : Si está habilitado 【bool】", + "【onSaved】 : Devolución de llamada al guardar el formulario 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json new file mode 100644 index 00000000..849cbfd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Champ de formulaire", + "info": "Un champ de formulaire, à utiliser dans le composant Form, contenant un champ de type générique T comme état, les mises à jour et les validations du champ déclenchent des rappels correspondants.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à FormField", + "desc": [ + "【builder】 : Constructeur de contenu 【FormFieldBuilder】", + "【initialValue】 : Valeur initiale 【T】", + "【validator】 : Fonction de validation 【FormFieldValidator 】", + "【enabled】 : Est activé 【bool】", + "【onSaved】 : Rappel lors de la sauvegarde du formulaire 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json new file mode 100644 index 00000000..83bb81b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo del modulo", + "info": "Un campo del modulo, deve essere utilizzato nel componente Form, contiene un campo di tipo generico T come stato, gli aggiornamenti e le validazioni del campo attivano i rispettivi callback.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a FormField", + "desc": [ + "【builder】 : Costruttore del contenuto 【FormFieldBuilder】", + "【initialValue】 : Valore iniziale 【T】", + "【validator】 : Funzione di validazione 【FormFieldValidator 】", + "【enabled】 : Se è abilitato 【bool】", + "【onSaved】 : Callback quando il modulo viene salvato 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json new file mode 100644 index 00000000..cf65e35f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "フォームフィールド", + "info": "フォームフィールドは、Formコンポーネント内で使用する必要があり、ジェネリック型Tのフィールドを状態量として含みます。フィールドの更新と検証に応じて、対応するコールバックがトリガーされます。", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 紹介", + "desc": [ + "【builder】 : 内容ビルダー 【FormFieldBuilder】", + "【initialValue】 : 初期値 【T】", + "【validator】 : 検証関数 【FormFieldValidator 】", + "【enabled】 : 有効かどうか 【bool】", + "【onSaved】 : フォーム保存時のコールバック 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json new file mode 100644 index 00000000..28777a15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "폼 필드", + "info": "폼 필드는 Form 컴포넌트 내에서 사용되며, 상태량으로 제네릭 T의 필드를 포함합니다. 필드의 업데이트 및 검증에 따라 해당 콜백이 트리거됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 소개", + "desc": [ + "【builder】 : 콘텐츠 빌더 【FormFieldBuilder】", + "【initialValue】 : 초기값 【T】", + "【validator】 : 검증 함수 【FormFieldValidator 】", + "【enabled】 : 유효 여부 【bool】", + "【onSaved】 : 폼 저장 시 콜백 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json new file mode 100644 index 00000000..cf1bcc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo de Formulário", + "info": "Um campo de formulário, que precisa ser usado no componente Form, contém um campo do tipo genérico T como estado, e as atualizações e validações do campo acionam callbacks correspondentes.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao FormField", + "desc": [ + "【builder】 : Construtor de conteúdo 【FormFieldBuilder】", + "【initialValue】 : Valor inicial 【T】", + "【validator】 : Função de validação 【FormFieldValidator 】", + "【enabled】 : Se está ativo 【bool】", + "【onSaved】 : Callback ao salvar o formulário 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json new file mode 100644 index 00000000..95155cf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Поле формы", + "info": "Поле формы, которое должно использоваться в компоненте Form, содержит поле типа T в качестве состояния. Обновление и проверка поля вызывают соответствующие обратные вызовы.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в FormField", + "desc": [ + "【builder】 : Конструктор содержимого 【FormFieldBuilder】", + "【initialValue】 : Начальное значение 【T】", + "【validator】 : Функция проверки 【FormFieldValidator 】", + "【enabled】 : Активно ли поле 【bool】", + "【onSaved】 : Обратный вызов при сохранении формы 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json new file mode 100644 index 00000000..f1925f24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "表单字段", + "info": "一个表单字段,需要在 Form 组件中使用,内含泛型 T 的字段作为状态量,对根据字段的更新和验证会触发相应回调。", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 介绍", + "desc": [ + "【builder】 : 内容构造器 【FormFieldBuilder】", + "【initialValue】 : 初始值 【T】", + "【validator】 : 验证函数 【FormFieldValidator 】", + "【enabled】 : 是否有效 【bool】", + "【onSaved】 : 表单save时回调 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart new file mode 100644 index 00000000..690432be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class FormFieldDemo extends StatelessWidget { + const FormFieldDemo({Key? key}) : super(key: key); + + final String info = + 'FormField 代表表单中的一个字段,对于字符串类型的字段,框架中封装了 TextFormField 以便使用;下拉选择的字段,用 DropdownButtonFormField。' + '目前框架中 FormField 的子类也只有这两个。既然是表单字段,必然是要和 Form 组件一起使用。通过对 Form 添加 GlobalKey ,来获取 FormState 对象。' + '当 FormState 调用 save 方法时,所有的 FormField 都会触发 onSave 方法,当 FormState 调用 validate 方法时,所有的 FormField 都会触发 validate 方法。'; + + + @override + Widget build(BuildContext context) { + + + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json new file mode 100644 index 00000000..8e76619d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Asynchroner Konstruktor", + "info": "Kann ein Future-Objekt angeben, das den Status der asynchronen Ausführung überwachen kann und im Konstruktor unterschiedliche Schnittstellen basierend auf dem Status erstellt. Beachten Sie, dass das Future-Objekt nicht gleichzeitig mit dem FutureBuilder erstellt werden kann, da dies zu übermäßigen Aktualisierungen führen kann.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FutureBuilder", + "desc": [ + "【builder】 : Unterkomponente 【AsyncWidgetBuilder】", + "【initialData】 : Initialdaten 【T】", + "【future】 : Asynchrone Aufgabe 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json new file mode 100644 index 00000000..ee2173e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Asynchronous Constructor", + "info": "You can specify a Future object, which can monitor the status of asynchronous execution and build different interfaces in the constructor based on the status. Note that the Future object cannot be created simultaneously with the FutureBuilder, otherwise it may cause excessive refreshing.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FutureBuilder", + "desc": [ + "【builder】 : Subcomponent 【AsyncWidgetBuilder】", + "【initialData】 : Initial Data 【T】", + "【future】 : Asynchronous Task 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json new file mode 100644 index 00000000..0d574611 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Constructor Asíncrono", + "info": "Puede especificar un objeto Future, que puede monitorear el estado de la ejecución asíncrona y construir diferentes interfaces en el constructor según el estado. Tenga en cuenta que este objeto Future no se puede crear simultáneamente con FutureBuilder, de lo contrario podría provocar una actualización excesiva.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FutureBuilder", + "desc": [ + "【builder】 : Componente hijo 【AsyncWidgetBuilder】", + "【initialData】 : Datos iniciales 【T】", + "【future】 : Tarea asíncrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json new file mode 100644 index 00000000..b3e47444 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Constructeur asynchrone", + "info": "Peut spécifier un objet Future, capable d'écouter l'état de l'exécution asynchrone et de construire des interfaces différentes dans le constructeur en fonction de l'état. Notez que cet objet Future ne peut pas être créé en même temps que FutureBuilder, sinon il pourrait y avoir un rafraîchissement excessif.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FutureBuilder", + "desc": [ + "【builder】 : Composant enfant 【AsyncWidgetBuilder】", + "【initialData】 : Données initiales 【T】", + "【future】 : Tâche asynchrone 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json new file mode 100644 index 00000000..f1f0e453 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Costruttore Asincrono", + "info": "Puoi specificare un oggetto Future, che può monitorare lo stato dell'esecuzione asincrona e costruire interfacce diverse nel costruttore in base allo stato. Nota che l'oggetto Future non può essere creato contemporaneamente al FutureBuilder, altrimenti potrebbe causare un aggiornamento eccessivo.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di FutureBuilder", + "desc": [ + "【builder】 : Componente Figlio 【AsyncWidgetBuilder】", + "【initialData】 : Dati Iniziali 【T】", + "【future】 : Attività Asincrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json new file mode 100644 index 00000000..80034fe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "非同期ビルダー", + "info": "Futureオブジェクトを指定することができ、非同期実行の状態を監視し、ビルダー内で状態に応じて異なるインターフェースを構築できます。このFutureオブジェクトはFutureBuilderと同時に作成しないでください。そうしないと、過剰なリフレッシュが発生する可能性があります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilderの基本使用", + "desc": [ + "【builder】 : 子コンポーネント 【AsyncWidgetBuilder】", + "【initialData】 : 初期データ 【T】", + "【future】 : 非同期タスク 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json new file mode 100644 index 00000000..0079d897 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "비동기 빌더", + "info": "Future 객체를 지정할 수 있으며, 비동기 실행 상태를 모니터링하고 빌더에서 상태에 따라 다른 인터페이스를 구성할 수 있습니다. 주의할 점은 해당 Future 객체가 FutureBuilder와 동시에 생성되면 과도한 새로고침이 발생할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilder 기본 사용", + "desc": [ + "【builder】 : 자식 컴포넌트 【AsyncWidgetBuilder】", + "【initialData】 : 초기 데이터 【T】", + "【future】 : 비동기 작업 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json new file mode 100644 index 00000000..3d3ae963 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Construtor Assíncrono", + "info": "Pode especificar um objeto Future, que pode monitorar o estado da execução assíncrona e construir diferentes interfaces no construtor com base no estado. Observe que o objeto Future não pode ser criado ao mesmo tempo que o FutureBuilder, caso contrário, pode ocorrer uma atualização excessiva.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FutureBuilder", + "desc": [ + "【builder】 : Componente Filho 【AsyncWidgetBuilder】", + "【initialData】 : Dados Iniciais 【T】", + "【future】 : Tarefa Assíncrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json new file mode 100644 index 00000000..b841a64e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Асинхронный конструктор", + "info": "Можно указать объект Future, который может отслеживать состояние асинхронного выполнения и строить различные интерфейсы в конструкторе в зависимости от состояния. Обратите внимание, что объект Future не может быть создан одновременно с FutureBuilder, иначе может произойти чрезмерное обновление.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FutureBuilder", + "desc": [ + "【builder】 : Дочерний компонент 【AsyncWidgetBuilder】", + "【initialData】 : Начальные данные 【T】", + "【future】 : Асинхронная задача 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json new file mode 100644 index 00000000..7e59a172 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "异步构造器", + "info": "可指定一个Future对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。注意该Future对象不能和FutureBuilder同时创建,否则可能过渡刷新。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilder基本使用", + "desc": [ + "【builder】 : 子组件 【AsyncWidgetBuilder】", + "【initialData】 : 初始数据 【T】", + "【future】 : 异步任务 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart new file mode 100644 index 00000000..8a5afea7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomFutureBuilder extends StatefulWidget { + const CustomFutureBuilder({Key? key}) : super(key: key); + + @override + _CustomFutureBuilderState createState() => _CustomFutureBuilderState(); +} + +class _CustomFutureBuilderState extends State { + late Future _future; + + @override + void initState() { + _future = loadData(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + initialData: 'Load', + future: _future, + builder: (ctx, snap) { + if (snap.connectionState == ConnectionState.done) { + return Text('${snap.data}'); + } + if (snap.connectionState == ConnectionState.waiting) { + return const CircularProgressIndicator(); + } + if (snap.hasError) { + return const Text('Error'); + } + return Container(); + }); + } + + Future loadData() async { + await Future.delayed(const Duration(seconds: 2)); + return 'LoadeSuccess'; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json new file mode 100644 index 00000000..61cd130d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Überlaufindikator", + "info": "Das Kind ist eine scrollbare Liste, die einen Indikatoreffekt anzeigt, wenn man oben und unten scrollt. Die Farbe kann angegeben werden, hat aber keine große Bedeutung. Es ist der Standard-Scrolleffekt für Android- und Fuchsia-Systeme.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【showLeading】 : Ob der Kopf aktiv ist 【bool】", + "【showTrailing】 : Ob das Ende aktiv ist 【bool】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【color】 : Farbe 【Color】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json new file mode 100644 index 00000000..f1128401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Scroll Boundary Indicator", + "info": "A child is a scrollable list, with an indicator effect when scrolling to the top and bottom. The color can be specified, but it is not very useful. It is the default scrolling effect for Android and Fuchsia systems.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【showLeading】: Whether the header is active 【bool】", + "【showTrailing】: Whether the footer is active 【bool】", + "【axisDirection】: Axis direction 【AxisDirection】", + "【color】: Color 【Color】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json new file mode 100644 index 00000000..24fa1922 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicador de desplazamiento fuera de límites", + "info": "El niño es una lista deslizable, el efecto indicador cuando se desliza hacia la parte superior e inferior, se puede especificar el color, no es muy útil. Es el efecto de deslizamiento predeterminado del sistema Android y Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【showLeading】 : Si la cabeza es efectiva 【bool】", + "【showTrailing】 : Si la parte inferior es efectiva 【bool】", + "【axisDirection】 : Dirección del eje 【AxisDirection】", + "【color】 : Color 【Color】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json new file mode 100644 index 00000000..3c75e0de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicateur de dépassement de défilement", + "info": "L'enfant est une liste déroulante, l'effet indicateur lorsqu'on fait défiler vers le haut et le bas, la couleur peut être spécifiée, mais ce n'est pas très utile. C'est l'effet de défilement par défaut des systèmes Android et Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【showLeading】 : Si la tête est active 【bool】", + "【showTrailing】 : Si le bas est actif 【bool】", + "【axisDirection】 : Direction de l'axe 【AxisDirection】", + "【color】 : Couleur 【Color】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json new file mode 100644 index 00000000..2a9d76dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicatore di scorrimento oltre i limiti", + "info": "Il bambino è una lista scorrevole, con un effetto indicatore quando si scorre verso l'alto e verso il basso, è possibile specificare il colore, ma non è molto utile. È l'effetto di scorrimento predefinito per i sistemi Android e Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base", + "desc": [ + "【showLeading】 : Se la parte superiore è attiva 【bool】", + "【showTrailing】 : Se la parte inferiore è attiva 【bool】", + "【axisDirection】 : Direzione dell'asse 【AxisDirection】", + "【color】 : Colore 【Color】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json new file mode 100644 index 00000000..1623f5e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "スクロールオーバーインジケーター", + "info": "子要素がスクロール可能なリストで、上部または下部にスクロールした際のインジケーター効果です。色を指定できますが、あまり役に立ちません。AndroidとFuchsiaシステムのデフォルトのスクロール効果です。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【showLeading】 : ヘッダーが有効かどうか 【bool】", + "【showTrailing】 : フッターが有効かどうか 【bool】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【color】 : 色 【Color】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json new file mode 100644 index 00000000..66a187c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "스크롤 오버스크롤 표시기", + "info": "자식이 스크롤 가능한 리스트일 때, 상단과 하단으로 스크롤할 때의 표시 효과. 색상을 지정할 수 있지만 큰 의미는 없습니다. Android와 Fuchsia 시스템의 기본 스크롤 효과입니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용", + "desc": [ + "【showLeading】 : 헤더가 활성화되는지 여부 【bool】", + "【showTrailing】 : 하단이 활성화되는지 여부 【bool】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【color】 : 색상 【Color】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json new file mode 100644 index 00000000..c74b8ea2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicador de deslizamento fora dos limites", + "info": "A criança é uma lista deslizante, o efeito indicador quando desliza para o topo e para a base, pode especificar a cor, não tem muita utilidade. É o efeito de deslizamento padrão do sistema Android e Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【showLeading】 : Se o cabeçalho está ativo 【bool】", + "【showTrailing】 : Se a base está ativa 【bool】", + "【axisDirection】 : Direção do eixo 【AxisDirection】", + "【color】 : Cor 【Color】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json new file mode 100644 index 00000000..62a47392 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Индикатор прокрутки за пределы", + "info": "Дети - это прокручиваемый список, индикаторный эффект при прокрутке до верха и низа, можно указать цвет, не имеет большого значения. Это эффект прокрутки по умолчанию для систем Android и Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【showLeading】 : Действует ли на голову 【bool】", + "【showTrailing】 : Действует ли на дно 【bool】", + "【axisDirection】 : Направление оси 【AxisDirection】", + "【color】 : Цвет 【Color】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json new file mode 100644 index 00000000..57ad2ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "滑动越域指示器", + "info": "孩子为可滑动列表,当滑动到顶部和底部时的指示效果,可指定颜色,没什么太大卵用。是Android和fuchsia系统默认滑动效果。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【showLeading】 : 头部是否生效 【bool】", + "【showTrailing】 : 底部是否生效 【bool】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【color】 : 颜色 【Color】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart new file mode 100644 index 00000000..aa263239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class GlowingOverscrollIndicatorDemo extends StatelessWidget { + const GlowingOverscrollIndicatorDemo({super.key}); + + List get data => [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: GlowingOverscrollIndicator( + color: Colors.purple, + // showLeading: false, + // showTrailing: false, + axisDirection: AxisDirection.down, + child: ListView.builder( + itemBuilder: (_, index) => Container( + margin: const EdgeInsets.all(10), + height: 60, + color: data[index], + ), + itemCount: data.length, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json new file mode 100644 index 00000000..0ab7c519 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Geteilter Animationseffekt", + "info": "Es kann ein Labelname angegeben werden. Wenn zwei Schnittstellen umgeschaltet werden, führen Komponenten mit demselben Label einen gemeinsamen Animationseffekt aus. In einer Schnittstelle können nicht zwei Hero-Labels mit demselben Namen existieren.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Hero", + "desc": [ + "【tag】 : Label 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json new file mode 100644 index 00000000..b6a0e733 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Shared Animation", + "info": "You can specify a tag name, and components with the same tag will perform a shared animation when transitioning between two interfaces. There cannot be two Hero tags with the same name in one interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Hero", + "desc": [ + "【tag】 : tag 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json new file mode 100644 index 00000000..72665027 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animación compartida", + "info": "Se puede especificar un nombre de etiqueta, los componentes con la misma etiqueta realizarán una animación compartida al saltar entre dos interfaces. No pueden existir dos etiquetas Hero con el mismo nombre en una misma interfaz.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Hero", + "desc": [ + "【tag】 : etiqueta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json new file mode 100644 index 00000000..efe22337 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animation partagée", + "info": "Vous pouvez spécifier un nom de tag, les composants avec le même tag effectueront une animation partagée lors du changement d'interface. Il ne peut pas y avoir deux tags Hero avec le même nom dans une même interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Hero", + "desc": [ + "【tag】 : étiquette 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json new file mode 100644 index 00000000..4003710e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animazione condivisa", + "info": "È possibile specificare un nome di tag. Quando si passa da un'interfaccia all'altra, i componenti con lo stesso tag eseguiranno un'animazione condivisa. Non possono esistere due tag Hero con lo stesso nome in un'interfaccia.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Hero", + "desc": [ + "【tag】 : etichetta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json new file mode 100644 index 00000000..da433da6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "共有アニメーション", + "info": "タグ名を指定でき、2つの画面間で同じタグを持つコンポーネントが共有アニメーションを行います。1つの画面に同じ名前のHeroタグを2つ存在させることはできません。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Heroの基本的な使用", + "desc": [ + "【tag】 : タグ 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json new file mode 100644 index 00000000..3a36cd46 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "공유 애니메이션", + "info": "태그 이름을 지정할 수 있으며, 두 인터페이스 간 전환 시 동일한 태그를 가진 구성 요소가 공유 애니메이션을 수행합니다. 하나의 인터페이스에는 동일한 이름의 Hero 태그가 두 개 존재할 수 없습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Hero 기본 사용법", + "desc": [ + "【tag】 : 태그 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json new file mode 100644 index 00000000..d8eb837e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animação Compartilhada", + "info": "Pode especificar o nome da etiqueta, os componentes com a mesma etiqueta realizarão uma animação compartilhada ao saltar entre duas interfaces. Não pode haver duas etiquetas Hero com o mesmo nome numa interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Hero", + "desc": [ + "【tag】 : etiqueta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json new file mode 100644 index 00000000..b88d92a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Общая анимация", + "info": "Можно указать имя тега, при переходе между двумя интерфейсами компоненты с одинаковым тегом будут выполнять общую анимацию. В одном интерфейсе не может быть двух тегов Hero с одинаковым именем.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Hero", + "desc": [ + "【tag】 : тег 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json new file mode 100644 index 00000000..6cd3ba9e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "共享动画", + "info": "可指定标签名,两个界面跳转时具有相同标签的组件会进行共享动画。一个界面中不能存在两个同名的Hero标签", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Hero基本使用", + "desc": [ + "【tag】 : 标签 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart new file mode 100644 index 00000000..c0224bf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart @@ -0,0 +1,120 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomHero extends StatelessWidget { + const CustomHero({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Hero hero = Hero( + //----定义一个Hero,并添加tag标签,此中组件共享 + tag: 'user-head', + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(30)), + child: Image.asset( + "assets/images/icon_head.webp", + width: 60, + height: 60, + fit: BoxFit.cover, + ), + ), + ); + + Widget container = Container( + alignment: const Alignment(-0.8, -0.8), + child: hero, + width: 250, + height: 250 * 0.618, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Colors.red.withAlpha(99), + Colors.yellow.withAlpha(189), + Colors.green.withAlpha(88), + Colors.blue.withAlpha(230) + ])), + ); + + return GestureDetector( + child: Card(elevation: 5, child: container), + onTap: () => Navigator.push( + context, + Bottom2TopRouter(child: const TargetPage(), duration: 1000), + ), + ); + } + +} + +class TargetPage extends StatelessWidget { + const TargetPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Hero hero = const Hero( + //----定义一个Hero,为其添加标签,两个标签相同,则可以共享 + tag: 'user-head', + child: Padding( + padding: EdgeInsets.all(6.0), + child: CircleAvatar( + backgroundColor: Colors.transparent, + backgroundImage: AssetImage( + "assets/images/icon_head.webp", + ), + ), + ), + ); + + Widget touch = InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: hero, + ); + + return Scaffold( + appBar: AppBar( + actions: [touch], + ), + body: Container( + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Colors.red.withAlpha(99), + Colors.yellow.withAlpha(189), + Colors.green.withAlpha(88), + Colors.blue.withAlpha(230) + ])), + ), + ); + } +} + +//下--->上 +class Bottom2TopRouter extends PageRouteBuilder { + final Widget child; + final int duration; + final Curve curve; + + Bottom2TopRouter({ + required this.child, + this.duration = 500, + this.curve = Curves.fastOutSlowIn, + }) : super( + transitionDuration: Duration(milliseconds: duration), + pageBuilder: (ctx, a1, a2) { + return child; + }, + transitionsBuilder: ( + ctx, + a1, + a2, + Widget child, + ) => SlideTransition( + position: Tween( + begin: const Offset(0.0, 1.0), + end: const Offset(0.0, 0.0), + ).animate(CurvedAnimation(parent: a1, curve: curve)), + child: child)); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json new file mode 100644 index 00000000..b34fed38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Bildkomponente", + "info": "Wird verwendet, um ein Bild anzuzeigen, das aus einer Datei, dem Speicher, dem Netzwerk oder Ressourcen geladen werden kann. Kann Anpassungsmodus, Stil, Farbmischmodus, Wiederholungsmodus usw. angeben.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann Bilder aus Ressourcendateien und dem Netzwerk laden", + "desc": [ + "Image.asset lädt Ressourcenbilder." + ] + }, + { + "file": "node2_fit.dart", + "name": "Anpassungsmodus des Bildes", + "desc": [ + "【fit】 : Anpassungsmodus*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Ausrichtungsmodus des Bildes", + "desc": [ + "【alignment】 : Farbe 【AlignmentGeometry】", + " Neun statische Konstanten der Alignment-Klasse werden häufig verwendet, aber die Position kann auch angepasst werden." + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Farbe und Mischmodus des Bildes", + "desc": [ + "【color】 : Farbe 【Color】", + "【colorBlendMode】: Mischmodus*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Wiederholungsmodus des Bildes", + "desc": [ + "【repeat】 : Wiederholungsmodus*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Lokale Vergrößerung des Bildes", + "desc": [ + "【centerSlice】 : Beibehaltener Bereich 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json new file mode 100644 index 00000000..d3d10de9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Image Component", + "info": "Used to display an image, which can be loaded from a file, memory, network, or resources. You can specify the adaptation method, style, color blending mode, repeat mode, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Load images from resource files and the network", + "desc": [ + "Image.asset loads resource images," + ] + }, + { + "file": "node2_fit.dart", + "name": "Image adaptation mode", + "desc": [ + "【fit】 : Adaptation mode*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Image alignment mode", + "desc": [ + "【alignment】 : Color 【AlignmentGeometry】", + " Common nine static constants of the Alignment class, but custom positions are also possible" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Image color and blending mode", + "desc": [ + "【color】 : Color 【Color】", + "【colorBlendMode】: Blending mode*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Image repeat mode", + "desc": [ + "【repeat】 : Repeat mode*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Image partial zoom implementation", + "desc": [ + "【centerSlice】 : Reserved area 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json new file mode 100644 index 00000000..c259bd7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente de imagen", + "info": "Se utiliza para mostrar una imagen, que se puede cargar desde un archivo, memoria, red o recursos. Se puede especificar el modo de ajuste, estilo, modo de mezcla de colores, modo de repetición, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cargar imágenes desde archivos de recursos y la red", + "desc": [ + "Image.asset carga imágenes de recursos." + ] + }, + { + "file": "node2_fit.dart", + "name": "Modo de ajuste de la imagen", + "desc": [ + "【fit】 : Modo de ajuste*7 【BoxFit】." + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modo de alineación de la imagen", + "desc": [ + "【alignment】 : Color 【AlignmentGeometry】", + " Nueve constantes estáticas comunes de la clase Alignment, pero también se puede personalizar la posición." + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Color y modo de mezcla de la imagen", + "desc": [ + "【color】 : Color 【Color】", + "【colorBlendMode】: Modo de mezcla*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modo de repetición de la imagen", + "desc": [ + "【repeat】 : Modo de repetición*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ampliación local de la imagen", + "desc": [ + "【centerSlice】 : Área conservada 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json new file mode 100644 index 00000000..c618d6d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Composant d'image", + "info": "Utilisé pour afficher une image, qui peut être chargée à partir d'un fichier, de la mémoire, du réseau ou des ressources. Vous pouvez spécifier le mode d'adaptation, le style, le mode de mélange des couleurs, le mode de répétition, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut charger des images à partir de fichiers de ressources et du réseau", + "desc": [ + "Image.asset charge les images de ressources." + ] + }, + { + "file": "node2_fit.dart", + "name": "Mode d'adaptation de l'image", + "desc": [ + "【fit】 : Mode d'adaptation*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Mode d'alignement de l'image", + "desc": [ + "【alignment】 : Couleur 【AlignmentGeometry】", + " Neuf constantes statiques couramment utilisées de la classe Alignment, mais il est également possible de personnaliser la position" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Couleur et mode de mélange de l'image", + "desc": [ + "【color】 : Couleur 【Color】", + "【colorBlendMode】: Mode de mélange*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Mode de répétition de l'image", + "desc": [ + "【repeat】 : Mode de répétition*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Agrandissement local de l'image", + "desc": [ + "【centerSlice】 : Zone conservée 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json new file mode 100644 index 00000000..3b43a1fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente immagine", + "info": "Utilizzato per visualizzare un'immagine, può essere caricata da file, memoria, rete o risorse. È possibile specificare modalità di adattamento, stile, modalità di fusione del colore, modalità di ripetizione, ecc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può caricare immagini da file di risorse e dalla rete", + "desc": [ + "Image.asset carica immagini da risorse," + ] + }, + { + "file": "node2_fit.dart", + "name": "Modalità di adattamento dell'immagine", + "desc": [ + "【fit】 : modalità di adattamento*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modalità di allineamento dell'immagine", + "desc": [ + "【alignment】 : colore 【AlignmentGeometry】", + " Nove costanti statiche della classe Alignment, ma è anche possibile personalizzare la posizione" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Colore e modalità di fusione dell'immagine", + "desc": [ + "【color】 : colore 【Color】", + "【colorBlendMode】: modalità di fusione*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modalità di ripetizione dell'immagine", + "desc": [ + "【repeat】 : modalità di ripetizione*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ingrandimento locale dell'immagine", + "desc": [ + "【centerSlice】 : area conservata 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json new file mode 100644 index 00000000..608ca9ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "画像コンポーネント", + "info": "画像を表示するために使用され、ファイル、メモリ、ネットワーク、リソースからロードできます。適応モード、スタイル、カラーブレンドモード、リピートモードなどを指定できます", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "リソースファイルとネットワークから画像をロードできます", + "desc": [ + "Image.assetでリソース画像をロードします" + ] + }, + { + "file": "node2_fit.dart", + "name": "画像の適応モード", + "desc": [ + "【fit】 : 適応モード*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "画像の整列モード", + "desc": [ + "【alignment】 : カラー 【AlignmentGeometry】", + " 一般的にAlignmentクラスの9つの静的定数を使用しますが、位置をカスタマイズすることもできます" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "画像のカラー及びブレンドモード", + "desc": [ + "【color】 : カラー 【Color】", + "【colorBlendMode】: ブレンドモード*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "画像のリピートモード", + "desc": [ + "【repeat】 : リピートモード*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "画像の一部を拡大", + "desc": [ + "【centerSlice】 : 保持する領域 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json new file mode 100644 index 00000000..ac7e3d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "이미지 컴포넌트", + "info": "이미지를 표시하는 데 사용되며, 파일, 메모리, 네트워크, 리소스에서 로드할 수 있습니다. 적응 방식, 스타일, 색상 혼합 모드, 반복 모드 등을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "리소스 파일 및 네트워크에서 이미지 로드", + "desc": [ + "Image.asset로 리소스 이미지 로드" + ] + }, + { + "file": "node2_fit.dart", + "name": "이미지 적응 모드", + "desc": [ + "【fit】 : 적응 모드*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "이미지 정렬 모드", + "desc": [ + "【alignment】 : 색상 【AlignmentGeometry】", + " 일반적으로 Alignment 클래스의 9개 정적 상수를 사용하지만, 위치를 사용자 정의할 수도 있음" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "이미지 색상 및 혼합 모드", + "desc": [ + "【color】 : 색상 【Color】", + "【colorBlendMode】: 혼합 모드*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "이미지 반복 모드", + "desc": [ + "【repeat】 : 반복 모드*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "이미지 부분 확대", + "desc": [ + "【centerSlice】 : 보존 영역 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json new file mode 100644 index 00000000..6b510140 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente de Imagem", + "info": "Usado para exibir uma imagem, pode ser carregada a partir de arquivos, memória, rede ou recursos. Pode especificar o modo de ajuste, estilo, modo de mistura de cores, modo de repetição, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode carregar imagens de arquivos de recursos e da rede", + "desc": [ + "Image.asset carrega imagens de recursos," + ] + }, + { + "file": "node2_fit.dart", + "name": "Modo de ajuste da imagem", + "desc": [ + "【fit】 : modo de ajuste*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modo de alinhamento da imagem", + "desc": [ + "【alignment】 : cor 【AlignmentGeometry】", + " Nove constantes estáticas comuns da classe Alignment, mas também pode personalizar a posição" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Cor e modo de mistura da imagem", + "desc": [ + "【color】 : cor 【Color】", + "【colorBlendMode】: modo de mistura*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modo de repetição da imagem", + "desc": [ + "【repeat】 : modo de repetição*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ampliação local da imagem", + "desc": [ + "【centerSlice】 : área retida 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json new file mode 100644 index 00000000..5c26b2c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Компонент изображения", + "info": "Используется для отображения изображения, которое можно загрузить из файла, памяти, сети или ресурсов. Можно указать режим адаптации, стиль, режим смешивания цветов, режим повторения и т.д.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Загрузка изображений из ресурсов и сети", + "desc": [ + "Image.asset загружает изображения из ресурсов," + ] + }, + { + "file": "node2_fit.dart", + "name": "Режим адаптации изображения", + "desc": [ + "【fit】 : режим адаптации*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Режим выравнивания изображения", + "desc": [ + "【alignment】 : цвет 【AlignmentGeometry】", + " Девять статических констант класса Alignment, но также можно настроить положение" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Цвет и режим смешивания изображения", + "desc": [ + "【color】 : цвет 【Color】", + "【colorBlendMode】: режим смешивания*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Режим повторения изображения", + "desc": [ + "【repeat】 : режим повторения*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Локальное увеличение изображения", + "desc": [ + "【centerSlice】 : сохраняемая область 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json new file mode 100644 index 00000000..1b2434ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "图片组件", + "info": "用于显示一张图片,可以从文件、内存、网络、资源里加载。可以指定适应方式、样式、颜色混合模式、重复模式等", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可从资源文件和网络加载图片", + "desc": [ + "Image.asset加载资源图片," + ] + }, + { + "file": "node2_fit.dart", + "name": "图片的适应模式", + "desc": [ + "【fit】 : 适应模式*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "图片对齐模式", + "desc": [ + "【alignment】 : 颜色 【AlignmentGeometry】", + " 常用Alignment类的九个静态常量,但也可定制位置" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "图片颜色及混合模式", + "desc": [ + "【color】 : 颜色 【Color】", + "【colorBlendMode】: 混合模式*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "图片重复模式", + "desc": [ + "【repeat】 : 重复模式*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "图片实现局部放大", + "desc": [ + "【centerSlice】 : 保留的区域 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart new file mode 100644 index 00000000..71530c45 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart @@ -0,0 +1,27 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class LoadImage extends StatelessWidget { + const LoadImage({Key? key}) : super(key: key); + + final String assetsImagePath = "assets/images/icon_head.webp"; + final String netImageUrl = "https://p9-juejin.byteimg.com/" + "/tos-cn-i-k3u1fbpfcp/36dee4e4dceb4c41a93df4a3603439fe~" + "tplv-k3u1fbpfcp-zoom-crop-mark:1304:1304:1304:734.awebp"; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: [ + Image.asset(assetsImagePath, height: 80, width: 80), + _loadFromNet(), + ], + ); + } + + Widget _loadFromNet() => Image.network(netImageUrl, height: 80); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart new file mode 100644 index 00000000..b61fb637 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class FitImage extends StatefulWidget { + const FitImage({Key? key}) : super(key: key); + + @override + _FitImageState createState() => _FitImageState(); +} + +class _FitImageState extends State { + bool _smallImage = false; + + @override + Widget build(BuildContext context) { + List imageLi = BoxFit.values + .toList() + .map((mode) => Column(children:[ + Container( + margin: const EdgeInsets.all(5), + width: 100, + height: 80, + color: Colors.grey.withAlpha(88), + child: Image( + image: AssetImage(!_smallImage + ? "assets/images/wy_300x200.webp" + : "assets/images/wy_30x20.webp"), + fit: mode)), + Text(mode.toString().split(".")[1]) + ])).toList(); + + return Wrap( + children: [...imageLi, _buildSwitch()], + ); + } + + Widget _buildSwitch() { + return Container( + alignment: Alignment.center, + width: 200, + height: 100, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text("使用小图"), + Switch( + value: _smallImage, + onChanged: (b) => setState(() => _smallImage = b)), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart new file mode 100644 index 00000000..a7885cee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +enum AlignmentType { + center(Alignment.center, 'center'), + centerLeft(Alignment.centerLeft, 'centerLeft'), + centerRight(Alignment.centerRight, 'centerRight'), + topCenter(Alignment.topCenter, 'topCenter'), + topLeft(Alignment.topLeft, 'topLeft'), + topRight(Alignment.topRight, 'topRight'), + bottomCenter(Alignment.bottomCenter, 'bottomCenter'), + bottomLeft(Alignment.bottomLeft, 'bottomLeft'), + bottomRight(Alignment.bottomRight, 'bottomRight'), + ; + + const AlignmentType(this.alignment, this.title); + + final Alignment alignment; + final String title; +} + +class AlignmentImage extends StatelessWidget { + const AlignmentImage({Key? key}) : super(key: key); + + //测试数组 + + @override + Widget build(BuildContext context) { + List imgLi = AlignmentType.values + .map((v) => //生成子Widget列表 + Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 90, + height: 60, + color: Colors.grey.withAlpha(88), + child: Image( + image: const AssetImage("assets/images/wy_30x20.webp"), + alignment: v.alignment, + )), + Text(v.title), + ])) + .toList(); + var imageAlignment = Wrap(children: imgLi); + return imageAlignment; + } +} diff --git a/packages/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart similarity index 76% rename from packages/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart index 530f5cef..8c251029 100644 --- a/packages/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片颜色及混合模式', -// "priority": 4, -// "subtitle": "【color】 : 颜色 【Color】\n" -// "【colorBlendMode】: 混合模式*29 【BlendMode】", -// }, + class BlendModeImage extends StatelessWidget { const BlendModeImage({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/StatefulWidget/Image/node5_repeat.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart similarity index 80% rename from packages/widgets/lib/StatefulWidget/Image/node5_repeat.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart index 59d36b6b..2048dc2e 100644 --- a/packages/widgets/lib/StatefulWidget/Image/node5_repeat.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart @@ -2,13 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片重复模式', -// "priority": 5, -// "subtitle": "【repeat】 : 重复模式*4 【ImageRepeat】", -// }, class RepeatImage extends StatelessWidget { const RepeatImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart new file mode 100644 index 00000000..d4f4364f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class CenterSliceImage extends StatelessWidget { + const CenterSliceImage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 300, + height: 80, + child: Image.asset( + "assets/images/right_chat.png", + centerSlice: const Rect.fromLTRB(9, 27, 60, 27 + 1.0), + fit: BoxFit.fill, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json new file mode 100644 index 00000000..86515655 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Wasserwelle", + "info": "Macht die Wasserwellen von InkWell und InkResponse effektiv, verwendet für das Zeichnen von Bildern oder anderen dekorativen Materialkomponenten.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Ink", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【decoration】 : Dekoration 【Decoration】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】", + "【color】 : Farbe 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image Bildwasserwelle", + "desc": [ + "Die Eigenschaften sind identisch mit der Image-Komponente, siehe Image-Komponente für Details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json new file mode 100644 index 00000000..36b89e1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Ripple", + "info": "Enables the ripple effect for InkWell and InkResponse, a Material component used to draw images or other decorations.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Ink", + "desc": [ + "【child】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【decoration】: Decoration 【Decoration】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image Ripple with Image", + "desc": [ + "The properties are consistent with the Image component, see the Image component for details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json new file mode 100644 index 00000000..9572e4f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda de agua", + "info": "Hace que las ondas de agua de InkWell e InkResponse sean efectivas, utilizadas para dibujar imágenes u otros componentes decorativos de Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Ink", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【decoration】 : Decoración 【Decoration】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Onda de agua con Ink.image", + "desc": [ + "Los atributos son consistentes con el componente Image, consulte el componente Image para más detalles" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json new file mode 100644 index 00000000..4a7cd29d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onde", + "info": "Active les ondulations d'eau pour InkWell et InkResponse, utilisé pour dessiner des images ou d'autres composants de décoration Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Ink", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【decoration】 : Décoration 【Decoration】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】", + "【color】 : Couleur 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Onde d'image avec Ink.image", + "desc": [ + "Les propriétés sont identiques à celles du composant Image, voir le composant Image pour plus de détails" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json new file mode 100644 index 00000000..918d13de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda d'acqua", + "info": "Rende efficace l'effetto ondulato dell'acqua di InkWell e InkResponse, utilizzato per disegnare immagini o altri componenti decorativi di Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Ink", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【decoration】 : Decorazione 【Decoration】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】", + "【color】 : Colore 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image effetto ondulato dell'immagine", + "desc": [ + "Le proprietà sono coerenti con il componente Image, vedi il componente Image per i dettagli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json new file mode 100644 index 00000000..95241704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "水波", + "info": "InkWellとInkResponseの水の波紋を有効にし、画像やその他の装飾を描画するためのMaterialコンポーネントです。", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Inkの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【decoration】 : 装飾 【Decoration】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】", + "【color】 : 色 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image画像の水波", + "desc": [ + "その属性はImageコンポーネントと一致し、詳細はImageコンポーネントを参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json new file mode 100644 index 00000000..c8d9d18f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "물결", + "info": "InkWell 및 InkResponse의 물결 효과를 활성화하고, 이미지 또는 기타 장식을 그리기 위한 Material 컴포넌트입니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ink 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】", + "【decoration】 : 장식 【Decoration】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】", + "【color】 : 색상 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image 이미지 물결", + "desc": [ + "속성은 Image 컴포넌트와 동일하며, 자세한 내용은 Image 컴포넌트를 참조하세요" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json new file mode 100644 index 00000000..aeb56447 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda", + "info": "Torna as ondulações de água do InkWell e InkResponse eficazes, usadas para desenhar imagens ou outros componentes decorativos do Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Ink", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【decoration】 : Decoração 【Decoration】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】", + "【color】 : Cor 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ondulação de água do Ink.image", + "desc": [ + "Os atributos são consistentes com o componente Image, consulte o componente Image para mais detalhes" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json new file mode 100644 index 00000000..0f674edc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Волна", + "info": "Делает водяные волны InkWell и InkResponse активными, используется для рисования изображений или других декоративных компонентов Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Ink", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】", + "【decoration】 : Декорация 【Decoration】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】", + "【color】 : Цвет 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Водяные волны Ink.image", + "desc": [ + "Свойства совпадают с компонентом Image, подробнее см. компонент Image" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json new file mode 100644 index 00000000..961f0dc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "水波", + "info": "使InkWell和InkResponse的水波纹有效,用于绘制图像或其他装饰的Material组件。", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ink基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【decoration】 : 装饰 【Decoration】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】", + "【color】 : 颜色 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image图片水波纹", + "desc": [ + "其中属性与Image组件一致,详见Image组件" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart new file mode 100644 index 00000000..fdc0a1d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomInk extends StatelessWidget { + const CustomInk({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.orangeAccent, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Ink( + padding: const EdgeInsets.all(10), + decoration: const BoxDecoration( + color: Colors.yellow, + borderRadius: BorderRadius.all(Radius.circular(20))), + width: 200.0, + height: 100.0, + child: InkWell( + onTap: () {}, + child: const Center(child: Text('Hello')), + ), + ), + ), + ), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart new file mode 100644 index 00000000..aceedd2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + + +class InkImage extends StatelessWidget { + const InkImage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.grey[800], + child: Center( + child: Ink.image( + image: const AssetImage('assets/images/sabar.webp'), + fit: BoxFit.cover, + width: 300.0, + height: 200.0, + child: InkWell( + onTap: () {}, + child: const Align( + alignment: Alignment.topLeft, + child: Padding( + padding: EdgeInsets.all(10.0), + child: Text('Chaos', + style: TextStyle( + fontWeight: FontWeight.w900, color: Colors.black)), + ), + )), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json new file mode 100644 index 00000000..aca10f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Wasserwellen-Reaktion", + "info": "Klickeffekt mit Wasserwellen, empfängt Ereignisse wie Klicken, Doppelklicken, Langdrücken, Abbrechen und Hervorhebungsänderungen. Kann Eigenschaften wie Wasserwellenfarbe, Radius, Hervorhebungsform usw. angeben.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse grundlegende Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onTapCancel】 : Klick abbrechen 【Function()】", + "【onLongPress】 : Langdrückereignis 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse andere Eigenschaften", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onHighlightChanged】 : Hervorhebungsänderungsrückruf 【Function(bool)】", + "【highlightColor】 : Hervorhebungsfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【radius】 : Wasserwellenradius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json new file mode 100644 index 00000000..b550baae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Ripple Response", + "info": "Ripple click effect, receiving click, double-click, long press, cancel, highlight change events, and can specify ripple color, radius, highlight shape and other properties.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of InkResponse", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Click event 【Function()】", + "【onDoubleTap】 : Double-click event 【Function()】", + "【onTapCancel】 : Click cancel 【Function()】", + "【onLongPress】 : Long press event 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Other Properties of InkResponse", + "desc": [ + "【child】 : Child component 【Widget】", + "【onHighlightChanged】 : Highlight change callback 【Function(bool)】", + "【highlightColor】 : Highlight color 【Color】", + "【splashColor】 : Ripple color 【Color】", + "【radius】 : Ripple radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json new file mode 100644 index 00000000..6301b0fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Respuesta de ondas", + "info": "Efecto de clic de ondas, recibe eventos de clic, doble clic, pulsación larga, cancelación y cambio de resaltado. Se pueden especificar propiedades como el color de las ondas, el radio, la forma de resaltado, etc.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de InkResponse", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onTapCancel】 : Cancelación de clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Otras propiedades de InkResponse", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】", + "【highlightColor】 : Color de resaltado 【Color】", + "【splashColor】 : Color de las ondas 【Color】", + "【radius】 : Radio de las ondas 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json new file mode 100644 index 00000000..7da358ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Réponse d'ondulation", + "info": "Effet de clic d'ondulation, reçoit les événements de clic, double-clic, appui long, annulation et changement de surbrillance. Peut spécifier la couleur de l'ondulation, le rayon, la forme de la surbrillance et d'autres propriétés.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base d'InkResponse", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【Function()】", + "【onTapCancel】 : Annulation de clic 【Function()】", + "【onLongPress】 : Événement d'appui long 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Autres propriétés d'InkResponse", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】", + "【highlightColor】 : Couleur de surbrillance 【Color】", + "【splashColor】 : Couleur de l'ondulation 【Color】", + "【radius】 : Rayon de l'ondulation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json new file mode 100644 index 00000000..9b01d305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Effetto Ripple", + "info": "Effetto di clic a ripple, riceve eventi di clic, doppio clic, pressione prolungata, annullamento e cambiamento di evidenziazione. È possibile specificare proprietà come il colore del ripple, il raggio e la forma dell'evidenziazione.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di InkResponse", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onTapCancel】 : Annullamento clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Altre proprietà di InkResponse", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onHighlightChanged】 : Callback di cambiamento di evidenziazione 【Function(bool)】", + "【highlightColor】 : Colore di evidenziazione 【Color】", + "【splashColor】 : Colore del ripple 【Color】", + "【radius】 : Raggio del ripple 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json new file mode 100644 index 00000000..fa333900 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "リップルレスポンス", + "info": "リップルのクリック効果。クリック、ダブルクリック、長押し、キャンセル、ハイライト変更イベントを受け取り、リップルの色、半径、ハイライト形状などの属性を指定できます。", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【Function()】", + "【onTapCancel】 : クリックキャンセル 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponseその他の属性", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】", + "【highlightColor】 : ハイライト色 【Color】", + "【splashColor】 : リップル色 【Color】", + "【radius】 : リップル半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json new file mode 100644 index 00000000..1b4ca2a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "물결 반응", + "info": "물결 클릭 효과, 클릭, 더블 클릭, 길게 누르기, 취소, 하이라이트 변경 이벤트를 수신하며, 물결 색상, 반경, 하이라이트 모양 등의 속성을 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【Function()】", + "【onTapCancel】 : 클릭 취소 【Function()】", + "【onLongPress】 : 길게 누르기 이벤트 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse 기타 속성", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】", + "【highlightColor】 : 하이라이트 색상 【Color】", + "【splashColor】 : 물결 색상 【Color】", + "【radius】 : 물결 반경 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json new file mode 100644 index 00000000..7f36fcd8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Resposta de Ondulação", + "info": "Efeito de clique de ondulação, recebe eventos de clique, duplo clique, pressionamento longo, cancelamento e mudança de destaque, podendo especificar a cor da ondulação, raio, forma de destaque, entre outros atributos.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do InkResponse", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onTapCancel】 : Cancelamento de clique 【Function()】", + "【onLongPress】 : Evento de pressionamento longo 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Outras Propriedades do InkResponse", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】", + "【highlightColor】 : Cor de destaque 【Color】", + "【splashColor】 : Cor da ondulação 【Color】", + "【radius】 : Raio da ondulação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json new file mode 100644 index 00000000..255ee434 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Эффект ряби", + "info": "Эффект нажатия с рябью, принимает события нажатия, двойного нажатия, долгого нажатия, отмены и изменения выделения. Можно указать цвет ряби, радиус, форму выделения и другие свойства.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события InkResponse", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onTapCancel】 : Отмена нажатия 【Function()】", + "【onLongPress】 : Событие долгого нажатия 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Другие свойства InkResponse", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onHighlightChanged】 : Обратный вызов изменения выделения 【Function(bool)】", + "【highlightColor】 : Цвет выделения 【Color】", + "【splashColor】 : Цвет ряби 【Color】", + "【radius】 : Радиус ряби 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json new file mode 100644 index 00000000..900fa0b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "水波纹响应", + "info": "水波纹的点击效果,接收点击、双击、长按、取消、高亮变化事件,可指定水波纹颜色、半径、高亮形状等属性。", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onTapCancel】 : 点击取消 【Function()】", + "【onLongPress】 : 长按事件 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse其他属性", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", + "【highlightColor】 : 高亮色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【radius】 : 水波半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart new file mode 100644 index 00000000..da42a370 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomInkResponse extends StatefulWidget { + const CustomInkResponse({Key? key}) : super(key: key); + + @override + _CustomInkResponseState createState() => _CustomInkResponseState(); +} + +class _CustomInkResponseState extends State { + String _info = 'Push'; + + @override + Widget build(BuildContext context) { + return InkResponse( + onTap: () => setState(() => _info = 'onTap'), + onDoubleTap: () => setState(() => _info = 'onDoubleTap'), + onLongPress: () => setState(() => _info = 'onLongPress'), + onTapCancel: () => setState(() => _info = 'onTapCancel'), + child: Container( + alignment: Alignment.center, + width: 200, + height: 100, + child: Text(_info), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart new file mode 100644 index 00000000..b9f45269 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class ColorInkResponse extends StatefulWidget { + const ColorInkResponse({Key? key}) : super(key: key); + + @override + _ColorInkResponseState createState() => _ColorInkResponseState(); +} + +class _ColorInkResponseState extends State { + String _info = 'Push'; + + @override + Widget build(BuildContext context) { + return InkResponse( + onTap: () => {}, + splashColor: Colors.blueAccent, + highlightColor: Colors.orange, + onHighlightChanged: (v) => + setState(() => _info = 'onHighlightChanged:$v'), + radius: 50, + child: Container( + alignment: Alignment.center, + width: 200, + height: 100, + child: Text(_info), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json new file mode 100644 index 00000000..d68bb899 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Wasserwelle", + "info": "Unterklasse von InkResponse, grundlegende Eigenschaften wie InkResponse. Eine rechteckige Wasserwelle, die den Radius der abgerundeten Ecken, die Form der Umrandung usw. kennt.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Ereignisse von InkWell", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onTapCancel】 : Klick abbrechen 【Function()】", + "【onLongPress】 : Langdrücken 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Weitere Eigenschaften von InkWell", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onHighlightChanged】 : Rückruf bei Hervorhebungsänderung 【Function(bool)】", + "【highlightColor】 : Hervorhebungsfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【radius】 : Wasserwellenradius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json new file mode 100644 index 00000000..4de7cf5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Ripple", + "info": "A subclass of InkResponse, with basic properties similar to InkResponse. A rectangular area with ripple effects, allowing customization of corner radius, border shape, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell Basic Events", + "desc": [ + "【child】: Child component 【Widget】", + "【onTap】: Tap event 【Function()】", + "【onDoubleTap】: Double tap event 【Function()】", + "【onTapCancel】: Tap cancel 【Function()】", + "【onLongPress】: Long press event 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell Other Properties", + "desc": [ + "【child】: Child component 【Widget】", + "【onHighlightChanged】: Highlight change callback 【Function(bool)】", + "【highlightColor】: Highlight color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【radius】: Ripple radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json new file mode 100644 index 00000000..8862b4a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Ondulación", + "info": "Subclase de InkResponse, con propiedades básicas similares a InkResponse. Una región rectangular de ondulación, que puede conocer el radio de las esquinas redondeadas, la forma del borde, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de InkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onTapCancel】 : Cancelación de clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Otras propiedades de InkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】", + "【highlightColor】 : Color de resaltado 【Color】", + "【splashColor】 : Color de la ondulación 【Color】", + "【radius】 : Radio de la ondulación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json new file mode 100644 index 00000000..8f623f9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Effet de vague", + "info": "Sous-classe de InkResponse, les propriétés de base sont les mêmes que InkResponse. Une zone rectangulaire avec un effet de vague, permet de connaître le rayon des coins arrondis, la forme de la bordure, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base d'InkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double clic 【Function()】", + "【onTapCancel】 : Annulation de clic 【Function()】", + "【onLongPress】 : Événement de pression longue 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Autres propriétés d'InkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】", + "【highlightColor】 : Couleur de surbrillance 【Color】", + "【splashColor】 : Couleur de l'effet de vague 【Color】", + "【radius】 : Rayon de l'effet de vague 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json new file mode 100644 index 00000000..19456853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Onda d'acqua", + "info": "Sottoclasse di InkResponse, le proprietà di base sono le stesse di InkResponse. Un'area rettangolare con un'effetto onda d'acqua, può conoscere il raggio degli angoli, la forma del bordo, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di InkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onTapCancel】 : Annullamento del clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Altre proprietà di InkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onHighlightChanged】 : Callback di cambiamento dell'evidenziazione 【Function(bool)】", + "【highlightColor】 : Colore di evidenziazione 【Color】", + "【splashColor】 : Colore dell'onda d'acqua 【Color】", + "【radius】 : Raggio dell'onda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json new file mode 100644 index 00000000..32ba38c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "波紋", + "info": "InkResponseのサブクラスで、基本属性はInkResponseと同じです。矩形領域の波紋で、角丸半径や辺の形状などを知ることができます。", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : タップイベント 【Function()】", + "【onDoubleTap】 : ダブルタップイベント 【Function()】", + "【onTapCancel】 : タップキャンセル 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWellその他の属性", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】", + "【highlightColor】 : ハイライト色 【Color】", + "【splashColor】 : 波紋色 【Color】", + "【radius】 : 波紋半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json new file mode 100644 index 00000000..7f5b712c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "물결무늬", + "info": "InkResponse의 하위 클래스로, 기본 속성은 InkResponse와 동일합니다. 둥근 모서리 반경, 테두리 모양 등을 알 수 있는 직사각형 영역의 물결무늬입니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 탭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 탭 이벤트 【Function()】", + "【onTapCancel】 : 탭 취소 【Function()】", + "【onLongPress】 : 롱 프레스 이벤트 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell 기타 속성", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】", + "【highlightColor】 : 하이라이트 색상 【Color】", + "【splashColor】 : 물결무늬 색상 【Color】", + "【radius】 : 물결 반경 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json new file mode 100644 index 00000000..2bc5f24a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Onda de Água", + "info": "Subclasse de InkResponse, com propriedades básicas semelhantes ao InkResponse. Uma área retangular de onda de água, que pode conhecer o raio de curvatura, a forma da borda, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do InkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onTapCancel】 : Cancelamento de clique 【Function()】", + "【onLongPress】 : Evento de pressionar longo 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Outras Propriedades do InkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】", + "【highlightColor】 : Cor de destaque 【Color】", + "【splashColor】 : Cor da onda de água 【Color】", + "【radius】 : Raio da onda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json new file mode 100644 index 00000000..bf0b487d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Водяные волны", + "info": "Подкласс InkResponse, основные свойства такие же, как у InkResponse. Прямоугольная область с водяными волнами, можно узнать радиус скругления, форму границы и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события InkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onTapCancel】 : Отмена нажатия 【Function()】", + "【onLongPress】 : Событие длительного нажатия 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Другие свойства InkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onHighlightChanged】 : Обратный вызов изменения подсветки 【Function(bool)】", + "【highlightColor】 : Цвет подсветки 【Color】", + "【splashColor】 : Цвет водяных волн 【Color】", + "【radius】 : Радиус волны 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json new file mode 100644 index 00000000..46a7480f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "水波纹", + "info": "InkResponse的子类,基本属性同InkResponse。一个矩形区域的水波纹,可以知道圆角半径,边线形状等。", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onTapCancel】 : 点击取消 【Function()】", + "【onLongPress】 : 长按事件 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell其他属性", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", + "【highlightColor】 : 高亮色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【radius】 : 水波半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart new file mode 100644 index 00000000..11d053a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomInkWell extends StatefulWidget { + const CustomInkWell({Key? key}) : super(key: key); + + @override + _CustomInkWellState createState() => _CustomInkWellState(); +} + +class _CustomInkWellState extends State { + String _info = 'Push'; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => setState(() => _info = 'onTap'), + onDoubleTap: () => setState(() => _info = 'onDoubleTap'), + onLongPress: () => setState(() => _info = 'onLongPress'), + onTapCancel: () => setState(() => _info = 'onTapCancel'), + child: Container( + alignment: Alignment.center, + width: 120, + height: 50, + child: Text(_info), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart new file mode 100644 index 00000000..f10b47a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class ColorInkWell extends StatefulWidget { + const ColorInkWell({Key? key}) : super(key: key); + + @override + _ColorInkWellState createState() => _ColorInkWellState(); +} + +class _ColorInkWellState extends State { + String _info = 'Push'; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => {}, + splashColor: Colors.blueAccent, + highlightColor: Colors.orange, + onHighlightChanged: (v) => + setState(() => _info = 'onHighlightChanged:$v'), + radius: 50, + child: Container( + alignment: Alignment.center, + width: 180, + height: 50, + child: Text(_info), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json new file mode 100644 index 00000000..37aa2970 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Eingabedekor", + "info": "Eine Dekoration, die die Eingabe umhüllt, ist eine der Kernkomponenten von TextField und wird normalerweise nicht alleine verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von InputDecorator", + "desc": [ + "【decoration】: Dekorationsobjekt 【InputDecoration】", + "【textAlign】: Textausrichtung 【TextAlign】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json new file mode 100644 index 00000000..b627a301 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Input Decorator", + "info": "A decorator that wraps around the input, one of the core components of TextField, generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of InputDecorator", + "desc": [ + "【decoration】: Decoration object 【InputDecoration】", + "【textAlign】: Text alignment 【TextAlign】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json new file mode 100644 index 00000000..e00e64b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decorador de entrada", + "info": "Un decorador que envuelve la entrada, es uno de los componentes centrales subyacentes de TextField, generalmente no se usa por separado.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de InputDecorator", + "desc": [ + "【decoration】 : Objeto de decoración 【InputDecoration】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json new file mode 100644 index 00000000..38949684 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Décorateur d'entrée", + "info": "Un décorateur qui enveloppe l'entrée, est l'un des composants de base de TextField, généralement pas utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'InputDecorator", + "desc": [ + "【decoration】 : Objet de décoration 【InputDecoration】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json new file mode 100644 index 00000000..34a56a08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decorazione di Input", + "info": "Una decorazione che avvolge l'input all'esterno, è uno dei componenti principali di TextField, generalmente non utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di Base di InputDecorator", + "desc": [ + "【decoration】 : Oggetto di decorazione 【InputDecoration】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json new file mode 100644 index 00000000..4e26de07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "入力デコレータ", + "info": "入力の外側を包むデコレーションで、TextFieldのコアコンポーネントの一つです。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecoratorの基本使用", + "desc": [ + "【decoration】 : デコレーションオブジェクト 【InputDecoration】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json new file mode 100644 index 00000000..94d452bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "입력 장식", + "info": "입력을 감싸는 외부 장식으로, TextField의 핵심 구성 요소 중 하나이며 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecorator 기본 사용", + "desc": [ + "【decoration】 : 장식 객체 【InputDecoration】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json new file mode 100644 index 00000000..f5f0cfcf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decoração de Entrada", + "info": "Decoração que envolve a entrada, é um dos componentes principais do TextField, geralmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do InputDecorator", + "desc": [ + "【decoration】 : Objeto de decoração 【InputDecoration】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json new file mode 100644 index 00000000..ce8ef099 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Декоратор ввода", + "info": "Декоратор, оборачивающий ввод, является одним из основных компонентов TextField и обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование InputDecorator", + "desc": [ + "【decoration】 : Объект декорации 【InputDecoration】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json new file mode 100644 index 00000000..629ece4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "输入装饰", + "info": "在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecorator基本使用", + "desc": [ + "【decoration】 : 装饰对象 【InputDecoration】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart new file mode 100644 index 00000000..8bac27f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class InputDecoratorDemo extends StatelessWidget { + const InputDecoratorDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: InputDecorator( + decoration: const InputDecoration(), + child: EditableText( + controller: TextEditingController(text:'hello'), + focusNode: FocusNode(), + style: const TextStyle(fontSize: 12,color: Colors.black), + cursorColor: Colors.blue, + backgroundCursorColor: Colors.orange, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json new file mode 100644 index 00000000..90c0b174 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Interaktiver Viewer", + "info": "Kapselt hauptsächlich Gesteninteraktionen wie Verschieben und Zoomen, vereinfacht die Verwendung und ermöglicht die Angabe von Verschiebegrenzen, Zoomverhältnissen, Gestenerkennung usw.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Entlang der Achse ziehen 【bool】", + "【boundaryMargin】 : Randabstand 【EdgeInsets】", + "【panEnabled】 : Verschiebung aktiviert 【bool】", + "【scaleEnabled】 : Skalierung aktiviert 【bool】", + "【maxScale】 : Maximale Vergrößerung 【double】", + "【minScale】 : Minimale Verkleinerung 【double】", + "【onInteractionEnd】 : Rückruf bei Interaktionsende 【GestureScaleEndCallback】", + "【onInteractionStart】 : Rückruf bei Interaktionsstart 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Rückruf bei Interaktionsaktualisierung 【GestureScaleUpdateCallback】", + "【child】 : Cursorfarbe 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test der constrained-Eigenschaft", + "desc": [ + "【constrained】 : Eingeschränkt 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Verwendung des Transformationscontrollers", + "desc": [ + "【transformationController】 : Transformationscontroller 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json new file mode 100644 index 00000000..d02fcc09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Interactive Viewer", + "info": "Mainly encapsulates gesture interactions such as moving and zooming, simplifies usage, and allows specifying movement boundaries, zoom ratios, gesture monitoring, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of InteractiveViewer", + "desc": [ + "【alignPanAxis】: Drag along the axis 【bool】", + "【boundaryMargin】: Boundary margin 【EdgeInsets】", + "【panEnabled】: Whether panning is enabled 【bool】", + "【scaleEnabled】: Whether scaling is enabled 【bool】", + "【maxScale】: Maximum zoom scale 【double】", + "【minScale】: Minimum zoom scale 【double】", + "【onInteractionEnd】: Interaction end callback 【GestureScaleEndCallback】", + "【onInteractionStart】: Interaction start callback 【GestureScaleStartCallback】", + "【onInteractionUpdate】: Interaction update callback 【GestureScaleUpdateCallback】", + "【child】: Cursor color 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Constrained Property Test", + "desc": [ + "【constrained】: Constrained 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Usage of Transformation Controller", + "desc": [ + "【transformationController】: Transformation controller 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json new file mode 100644 index 00000000..4c309f36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visor Interactivo", + "info": "Principalmente encapsula interacciones gestuales como mover y hacer zoom, simplificando su uso. Puede especificar límites de movimiento, proporciones de zoom, escucha de gestos, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Arrastrar a lo largo del eje 【bool】", + "【boundaryMargin】 : Margen del borde 【EdgeInsets】", + "【panEnabled】 : Si se puede desplazar 【bool】", + "【scaleEnabled】 : Si se puede hacer zoom 【bool】", + "【maxScale】 : Máximo aumento 【double】", + "【minScale】 : Mínima reducción 【double】", + "【onInteractionEnd】 : Callback al finalizar la interacción 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback al iniciar la interacción 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback al actualizar la interacción 【GestureScaleUpdateCallback】", + "【child】 : Color del cursor 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Prueba de la propiedad constrained", + "desc": [ + "【constrained】 : Restringido 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso del controlador de transformación", + "desc": [ + "【transformationController】 : Controlador de transformación 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json new file mode 100644 index 00000000..eb4de305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Vue interactive", + "info": "Principalement pour encapsuler les interactions gestuelles telles que le déplacement et le zoom, simplifier l'utilisation, et permettre de spécifier les limites de déplacement, les ratios de zoom, l'écoute des gestes, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Glisser le long de l'axe 【bool】", + "【boundaryMargin】 : Marge de la limite 【EdgeInsets】", + "【panEnabled】 : Peut être déplacé 【bool】", + "【scaleEnabled】 : Peut être zoomé 【bool】", + "【maxScale】 : Facteur de zoom maximum 【double】", + "【minScale】 : Facteur de zoom minimum 【double】", + "【onInteractionEnd】 : Rappel de fin d'interaction 【GestureScaleEndCallback】", + "【onInteractionStart】 : Rappel de début d'interaction 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Rappel de mise à jour d'interaction 【GestureScaleUpdateCallback】", + "【child】 : Couleur du curseur 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test de la propriété constrained", + "desc": [ + "【constrained】 : Contraint 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Utilisation du contrôleur de transformation", + "desc": [ + "【transformationController】 : Contrôleur de transformation 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json new file mode 100644 index 00000000..b182913e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visualizzatore Interattivo", + "info": "Principalmente incapsula le interazioni gestuali come lo spostamento e lo zoom, semplificando l'uso, è possibile specificare i limiti di movimento, la scala di zoom, il monitoraggio dei gesti, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Trascina lungo l'asse 【bool】", + "【boundaryMargin】 : Margine del bordo 【EdgeInsets】", + "【panEnabled】 : Se è possibile traslare 【bool】", + "【scaleEnabled】 : Se è possibile ridimensionare 【bool】", + "【maxScale】 : Fattore di ingrandimento massimo 【double】", + "【minScale】 : Fattore di riduzione minimo 【double】", + "【onInteractionEnd】 : Callback di fine interazione 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback di inizio interazione 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback di aggiornamento interazione 【GestureScaleUpdateCallback】", + "【child】 : Colore del cursore 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test della proprietà constrained", + "desc": [ + "【constrained】 : Vincolato 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso del controller di trasformazione", + "desc": [ + "【transformationController】 : Controller di trasformazione 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json new file mode 100644 index 00000000..3028d848 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "インタラクティブビュー", + "info": "主に移動、ズームなどのジェスチャー操作をカプセル化し、使用を簡素化します。移動の境界、ズーム比率、ジェスチャーリスナーなどを指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewerの基本使用", + "desc": [ + "【alignPanAxis】 : 軸に沿ってドラッグ 【bool】", + "【boundaryMargin】 : 境界マージン 【EdgeInsets】", + "【panEnabled】 : 平行移動可能かどうか 【bool】", + "【scaleEnabled】 : ズーム可能かどうか 【bool】", + "【maxScale】 : 最大ズーム倍率 【double】", + "【minScale】 : 最小ズーム倍率 【double】", + "【onInteractionEnd】 : インタラクション終了コールバック 【GestureScaleEndCallback】", + "【onInteractionStart】 : インタラクション開始コールバック 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : インタラクション更新コールバック 【GestureScaleUpdateCallback】", + "【child】 : カーソルカラー 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained属性のテスト", + "desc": [ + "【constrained】 : 制約付き 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "変換コントローラーの使用", + "desc": [ + "【transformationController】 : 変換コントローラー 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json new file mode 100644 index 00000000..76bf8581 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "인터랙티브 뷰어", + "info": "주로 이동, 확대/축소 등의 제스처 인터랙션을 캡슐화하여 사용을 단순화하며, 이동 경계, 확대/축소 비율, 제스처 리스너 등을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewer 기본 사용", + "desc": [ + "【alignPanAxis】 : 축을 따라 드래그 【bool】", + "【boundaryMargin】 : 경계 여백 【EdgeInsets】", + "【panEnabled】 : 이동 가능 여부 【bool】", + "【scaleEnabled】 : 확대/축소 가능 여부 【bool】", + "【maxScale】 : 최대 확대 배율 【double】", + "【minScale】 : 최소 축소 배율 【double】", + "【onInteractionEnd】 : 인터랙션 종료 콜백 【GestureScaleEndCallback】", + "【onInteractionStart】 : 인터랙션 시작 콜백 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : 인터랙션 업데이트 콜백 【GestureScaleUpdateCallback】", + "【child】 : 커서 색상 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained 속성 테스트", + "desc": [ + "【constrained】 : 제약이 있는 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "변환 컨트롤러 사용", + "desc": [ + "【transformationController】 : 변환 컨트롤러 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json new file mode 100644 index 00000000..be7b44f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visualizador Interativo", + "info": "Principalmente encapsula interações gestuais como movimento e zoom, simplificando o uso. Pode especificar limites de movimento, proporção de zoom, monitorização de gestos, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Arrastar ao longo do eixo 【bool】", + "【boundaryMargin】 : Margem da fronteira 【EdgeInsets】", + "【panEnabled】 : Se pode ser movido 【bool】", + "【scaleEnabled】 : Se pode ser ampliado 【bool】", + "【maxScale】 : Fator de ampliação máximo 【double】", + "【minScale】 : Fator de redução mínimo 【double】", + "【onInteractionEnd】 : Callback de fim de interação 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback de início de interação 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback de atualização de interação 【GestureScaleUpdateCallback】", + "【child】 : Cor do cursor 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Teste da Propriedade Constrained", + "desc": [ + "【constrained】 : Restrito 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso do Controlador de Transformação", + "desc": [ + "【transformationController】 : Controlador de transformação 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json new file mode 100644 index 00000000..cf059b7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Интерактивное представление", + "info": "Основная цель - инкапсуляция жестов, таких как перемещение и масштабирование, упрощение использования, возможность указания границ перемещения, масштабирования, прослушивания жестов и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Перетаскивание по оси 【bool】", + "【boundaryMargin】 : Отступ границы 【EdgeInsets】", + "【panEnabled】 : Возможность панорамирования 【bool】", + "【scaleEnabled】 : Возможность масштабирования 【bool】", + "【maxScale】 : Максимальный коэффициент увеличения 【double】", + "【minScale】 : Минимальный коэффициент уменьшения 【double】", + "【onInteractionEnd】 : Обратный вызов завершения взаимодействия 【GestureScaleEndCallback】", + "【onInteractionStart】 : Обратный вызов начала взаимодействия 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Обратный вызов обновления взаимодействия 【GestureScaleUpdateCallback】", + "【child】 : Цвет курсора 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Тестирование свойства constrained", + "desc": [ + "【constrained】 : Ограниченный 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Использование контроллера преобразования", + "desc": [ + "【transformationController】 : Контроллер преобразования 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json new file mode 100644 index 00000000..13775de2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "交互视图", + "info": "主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewer基本使用", + "desc": [ + "【alignPanAxis】 : 沿轴拖动 【bool】", + "【boundaryMargin】 : 边界边距 【EdgeInsets】", + "【panEnabled】 : 是否可平移 【bool】", + "【scaleEnabled】 : 是否可缩放 【bool】", + "【maxScale】 : 最大放大倍数 【double】", + "【minScale】 : 最小缩小倍数 【double】", + "【onInteractionEnd】 : 交互结束回调 【GestureScaleEndCallback】", + "【onInteractionStart】 : 交互开始回调 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : 交互更新回调 【GestureScaleUpdateCallback】", + "【child】 : 游标颜色 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained属性测试", + "desc": [ + "【constrained】 : 受约束的 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "变换控制器的使用", + "desc": [ + "【transformationController】 : 变换控制器 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart new file mode 100644 index 00000000..1a2bb795 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart @@ -0,0 +1,41 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class InteractiveViewerDemo extends StatelessWidget { + const InteractiveViewerDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 150, + color: Colors.grey.withAlpha(33), + child: InteractiveViewer( + boundaryMargin: const EdgeInsets.all(40.0), + maxScale: 2.5, + minScale: 0.3, + panEnabled: true, + scaleEnabled: true, + child: Image.asset('assets/images/caver.webp'), + onInteractionStart: _onInteractionStart, + onInteractionUpdate: _onInteractionUpdate, + onInteractionEnd: _onInteractionEnd, + ), + ); + } + + void _onInteractionStart(ScaleStartDetails details) { + print('onInteractionStart----' + details.toString()); + } + + void _onInteractionUpdate(ScaleUpdateDetails details) { + print('onInteractionUpdate----' + details.toString()); + } + + void _onInteractionEnd(ScaleEndDetails details) { + print('onInteractionEnd----' + details.toString()); + } +} diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart similarity index 90% rename from packages/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart index 18b915e1..75c85605 100644 --- a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 351, -// "name": "constrained属性测试", -// "priority": 2, -// "subtitle": "【constrained】 : 受约束的 【bool】", -// } + class InteractiveViewerDemo2 extends StatelessWidget { const InteractiveViewerDemo2({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart new file mode 100644 index 00000000..b6631fac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class InteractiveViewerDemo3 extends StatefulWidget { + const InteractiveViewerDemo3({Key? key}) : super(key: key); + + @override + _InteractiveViewerDemo3State createState() => _InteractiveViewerDemo3State(); +} + +class _InteractiveViewerDemo3State extends State + with SingleTickerProviderStateMixin { + final TransformationController _transformationController = + TransformationController(); + late Animation _animationReset; + late AnimationController _controllerReset; + + void _onAnimateReset() { + _transformationController.value = _animationReset.value; + if (!_controllerReset.isAnimating) { + _animationReset.removeListener(_onAnimateReset); + _controllerReset.reset(); + } + } + + void _animateResetInitialize() { + _controllerReset.reset(); + _animationReset = Matrix4Tween( + begin: _transformationController.value, + end: Matrix4.identity(), + ).animate(_controllerReset); + _animationReset.addListener(_onAnimateReset); + _controllerReset.forward(); + } + + void _animateResetStop() { + _controllerReset.stop(); + _animationReset.removeListener(_onAnimateReset); + _controllerReset.reset(); + } + + void _onInteractionStart(ScaleStartDetails details) { + if (_controllerReset.status == AnimationStatus.forward) { + _animateResetStop(); + } + } + + @override + void initState() { + super.initState(); + _controllerReset = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 400), + ); + } + + @override + void dispose() { + _controllerReset.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Wrap( + direction: Axis.vertical, + spacing: 10, + crossAxisAlignment: WrapCrossAlignment.center, + alignment: WrapAlignment.center, + children: [ + Container( + height: 150, + color: Colors.grey.withAlpha(33), + child: InteractiveViewer( + boundaryMargin: const EdgeInsets.all(40), + transformationController: _transformationController, + minScale: 0.1, + maxScale: 1.8, + onInteractionStart: _onInteractionStart, + child: Image.asset('assets/images/caver.webp'), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildButton(), + _buildButton2(), + _buildButton3(), + ], + ) + ], + ); + } + + Widget _buildButton() { + return MaterialButton( + child: const Icon( + Icons.refresh, + color: Colors.white, + ), + color: Colors.green, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onPressed: _animateResetInitialize); + } + + final double _x = 0.0; + + Widget _buildButton2() { + return MaterialButton( + child: const Icon( + Icons.navigate_before, + color: Colors.white, + ), + color: Colors.green, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onPressed: () { + var temp = _transformationController.value.clone(); + temp.translate(_x - 4); + _transformationController.value = temp; + }); + } + + Widget _buildButton3() { + return MaterialButton( + child: const Icon( + Icons.navigate_next, + color: Colors.white, + ), + color: Colors.green, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onPressed: () { + var temp = _transformationController.value.clone(); + temp.translate(_x + 4); + _transformationController.value = temp; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json new file mode 100644 index 00000000..dd140ea9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Tastatur-Listener", + "info": "Nachdem der Fokus erhalten wurde, wird über onKeyEvent das Tastaturereignis überwacht.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Tastaturereignisse überwachen", + "desc": [ + "Im Beispiel erhält der Bereich durch Klicken den Fokus, und durch Drücken der Tastatur können die ausgelösten Ereignisse angezeigt werden.", + "【focusNode】 : Fokus 【FocusNode】", + "【autofocus】 : Automatischer Fokus 【bool】", + "【includeSemantics】 : Semantik einschließen 【bool】", + "【onKeyEvent】 : Tastaturrückrufereignis 【ValueChanged?】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json new file mode 100644 index 00000000..7edfce71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Keyboard Listener", + "info": "After gaining focus, listen to keyboard key events through onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Listen to Keyboard Events", + "desc": [ + "In the example, click the area to gain focus, and then press the keyboard to see the event trigger information.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Whether to auto-focus 【bool】", + "【includeSemantics】 : Include semantics 【bool】", + "【onKeyEvent】 : Key callback event 【ValueChanged?】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json new file mode 100644 index 00000000..4a4e9250 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Escuchador de teclado", + "info": "Después de obtener el foco, escucha los eventos de teclado a través de onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar eventos de teclado", + "desc": [ + "En el ejemplo, al hacer clic en el área se obtiene el foco, y luego al presionar el teclado se pueden ver los mensajes de eventos activados.", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Si se enfoca automáticamente 【bool】", + "【includeSemantics】 : Incluir semántica 【bool】", + "【onKeyEvent】 : Evento de devolución de llamada de tecla 【ValueChanged?】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json new file mode 100644 index 00000000..02089c3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Écouteur de clavier", + "info": "Après avoir obtenu le focus, écoute les événements de touche du clavier via onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les événements du clavier", + "desc": [ + "Dans l'exemple, cliquez sur la zone pour obtenir le focus, puis tapez sur le clavier pour voir les informations de déclenchement de l'événement.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Mise au point automatique 【bool】", + "【includeSemantics】 : Inclure la sémantique 【bool】", + "【onKeyEvent】 : Événement de rappel de touche 【ValueChanged?】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json new file mode 100644 index 00000000..b8fa6f8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Ascoltatore Tastiera", + "info": "Dopo aver ottenuto il focus, ascolta gli eventi dei tasti della tastiera tramite onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta Eventi Tastiera", + "desc": [ + "Nell'esempio, clicca sull'area per ottenere il focus, quindi premi un tasto per vedere le informazioni sull'evento attivato.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Autofocus 【bool】", + "【includeSemantics】 : Includi Semantica 【bool】", + "【onKeyEvent】 : Evento di Richiamata Tasto 【ValueChanged?】", + "【child】 : Componente Figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json new file mode 100644 index 00000000..3b3fe543 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "キーボードリスナー", + "info": "フォーカスを取得した後、onKeyEventを通じてキーボードのキーイベントを監視します。", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "キーボードイベントの監視", + "desc": [ + "例では、領域をクリックしてフォーカスを取得し、キーボードを叩くとイベントのトリガー情報が表示されます。", + "【focusNode】 : フォーカス 【FocusNode】", + "【autofocus】 : 自動フォーカス 【bool】", + "【includeSemantics】 : セマンティクスを含む 【bool】", + "【onKeyEvent】 : キーコールバックイベント 【ValueChanged?】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json new file mode 100644 index 00000000..b385c917 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "키보드 리스너", + "info": "포커스를 얻은 후, onKeyEvent를 통해 키보드의 키 이벤트를 감지합니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "키보드 이벤트 감지", + "desc": [ + "예제에서 영역을 클릭하여 포커스를 얻은 후, 키보드를 누르면 이벤트 트리거 정보를 볼 수 있습니다.", + "【focusNode】 : 포커스 【FocusNode】", + "【autofocus】 : 자동 포커스 여부 【bool】", + "【includeSemantics】 : 의미 포함 여부 【bool】", + "【onKeyEvent】 : 키 이벤트 콜백 【ValueChanged?】", + "【child】 : 하위 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json new file mode 100644 index 00000000..b063905c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Ouvinte de Teclado", + "info": "Após obter o foco, monitora os eventos de teclas através de onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorar Eventos de Teclado", + "desc": [ + "No exemplo, clique na área para obter o foco e, em seguida, pressione as teclas para ver as informações de acionamento do evento.", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Foco automático 【bool】", + "【includeSemantics】 : Incluir semântica 【bool】", + "【onKeyEvent】 : Evento de retorno de tecla 【ValueChanged?】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json new file mode 100644 index 00000000..a64b7693 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Слушатель клавиатуры", + "info": "После получения фокуса, прослушивает события нажатия клавиш через onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Прослушивание событий клавиатуры", + "desc": [ + "В примере область получает фокус при нажатии, затем при нажатии клавиш можно увидеть информацию о срабатывании события.", + "【focusNode】 : Фокус 【FocusNode】", + "【autofocus】 : Автоматический фокус 【bool】", + "【includeSemantics】 : Включать семантику 【bool】", + "【onKeyEvent】 : Событие обратного вызова нажатия клавиши 【ValueChanged?】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json new file mode 100644 index 00000000..85ed9352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "键盘监听器", + "info": "在获取焦点后, 通过 onKeyEvent 监听键盘的按键事件。 ", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听键盘事件", + "desc": [ + "案例中区域点击获取焦点,然后敲击键盘可以看到事件触发信息。", + "【focusNode】 : 焦点 【FocusNode】", + "【autofocus】 : 是否自动聚焦 【bool】", + "【includeSemantics】 : 包含语义 【bool】", + "【onKeyEvent】 : 按键回调事件 【ValueChanged?】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart new file mode 100644 index 00000000..602cf0be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class KeyboardListenerDemo1 extends StatefulWidget { + const KeyboardListenerDemo1({super.key}); + + @override + State createState() => _KeyboardListenerDemo1State(); +} + +class _KeyboardListenerDemo1State extends State { + FocusNode focusNode = FocusNode(); + List events = []; + ScrollController _ctrl = ScrollController(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) { + focusNode.requestFocus(); + }, + onTapOutside: (_) { + focusNode.unfocus(); + }, + child: KeyboardListener( + autofocus: true, + focusNode: focusNode, + onKeyEvent: _onKeyEvent, + child: _buildDisplay(), + ), + ), + ); + } + + void _onKeyEvent(KeyEvent value) { + events.add(value); + setState(() {}); + _scrollToEnd(); + print('${value.runtimeType}:${value.logicalKey.keyLabel}'); + } + + void _onFocusChange() { + if (!focusNode.hasFocus) { + events.clear(); + } + setState(() {}); + } + + void _scrollToEnd() async { + if (_ctrl.hasClients) { + await Future.delayed(Duration(milliseconds: 200)); + _ctrl.animateTo(_ctrl.position.maxScrollExtent, + duration: Duration(milliseconds: 100), curve: Curves.ease); + } + } + + Widget _buildDisplay() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: events.isNotEmpty + ? SizedBox( + width: 460, + height: 60, + child: ListView.builder( + controller: _ctrl, + itemCount: events.length, + scrollDirection: Axis.horizontal, + itemBuilder: (_, index) => KeyBoardBox( + event: events[index], + )), + ) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class KeyBoardBox extends StatelessWidget { + final KeyEvent event; + + const KeyBoardBox({super.key, required this.event}); + + @override + Widget build(BuildContext context) { + Color? color; + if (event is KeyDownEvent) { + color = Colors.blue; + } + if (event is KeyRepeatEvent) { + color = Colors.green; + } + if (event is KeyUpEvent) { + color = Colors.grey; + } + return Center( + child: Container( + margin: EdgeInsets.only(right: 4), + width: 32, + height: 32, + decoration: BoxDecoration(color: color), + alignment: Alignment.center, + child: Text( + event.logicalKey.keyLabel, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 8, height: 1), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json new file mode 100644 index 00000000..f002e294 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Lizenzseite", + "info": "Die Lizenzseite der Anwendung, auf der Anwendungssymbol, Anwendungsname, Anwendungsversionsnummer usw. angegeben werden können, der Rest wird automatisch von Flutter generiert.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der LicensePage", + "desc": [ + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Rechtliche Hinweise der Anwendung 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json new file mode 100644 index 00000000..7eb9f3d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "License Page", + "info": "The license page of the application, where you can specify information such as the application icon, application name, application version number, etc. Other details are automatically generated by Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LicensePage", + "desc": [ + "【applicationIcon】: Top-left icon 【Widget】", + "【applicationVersion】: Version number 【String】", + "【applicationName】: Application name 【String】", + "【applicationLegalese】: Application legalese 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json new file mode 100644 index 00000000..eedee8de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Página de Licencia", + "info": "La página de licencia de la aplicación, donde se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión, etc., el resto es generado automáticamente por Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LicensePage", + "desc": [ + "【applicationIcon】 : Icono en la esquina superior izquierda 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Aspectos legales de la aplicación 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json new file mode 100644 index 00000000..47101fb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Page de licence", + "info": "Page de licence de l'application, permettant de spécifier l'icône de l'application, le nom de l'application, le numéro de version, etc. Le reste est généré automatiquement par Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LicensePage", + "desc": [ + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Législation de l'application 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json new file mode 100644 index 00000000..e0c737bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Pagina della Licenza", + "info": "Pagina della licenza dell'applicazione, dove è possibile specificare l'icona dell'applicazione, il nome dell'applicazione, il numero di versione dell'applicazione, ecc., il resto è generato automaticamente da Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di LicensePage", + "desc": [ + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Legale dell'applicazione 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json new file mode 100644 index 00000000..16e66bc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "ライセンスページ", + "info": "アプリのライセンスページ。アプリのアイコン、アプリ名、アプリのバージョン番号などを指定できます。その他はFlutterによって自動生成されます。", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePageの基本的な使用法", + "desc": [ + "【applicationIcon】 : 左上のアイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリ名 【String】", + "【applicationLegalese】 : アプリの法律文 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json new file mode 100644 index 00000000..1fb4a742 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "라이센스 페이지", + "info": "앱의 라이센스 페이지, 앱 아이콘, 앱 이름, 앱 버전 번호 등을 지정할 수 있으며, 나머지는 Flutter에서 자동으로 생성됩니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePage 기본 사용", + "desc": [ + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 앱 이름 【String】", + "【applicationLegalese】 : 앱 법률 문구 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json new file mode 100644 index 00000000..fcdce6a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Página de Licença", + "info": "Página de licença da aplicação, onde pode especificar o ícone da aplicação, o nome da aplicação, o número da versão da aplicação, entre outras informações, geradas automaticamente pelo Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico da LicensePage", + "desc": [ + "【applicationIcon】 : Ícone no canto superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legalidade da aplicação 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json new file mode 100644 index 00000000..069c22b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Страница лицензии", + "info": "Страница лицензии приложения, где можно указать значок приложения, имя приложения, версию приложения и другую информацию, остальное автоматически генерируется Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LicensePage", + "desc": [ + "【applicationIcon】 : Иконка в верхнем левом углу 【Widget】", + "【applicationVersion】 : Версия 【String】", + "【applicationName】 : Имя приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json new file mode 100644 index 00000000..56434b38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "证书页", + "info": "应用的证书页,可指定应用图标、应用名、应用版本号等信息,其他由Flutter自动生成。", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePage基本使用", + "desc": [ + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart new file mode 100644 index 00000000..90c27cc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomLicensePage extends StatelessWidget { + const CustomLicensePage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: 400, + child: const LicensePage( + applicationIcon: FlutterLogo(), + applicationVersion: 'v0.0.1', + applicationName: 'Flutter Unit', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json new file mode 100644 index 00000000..be736cf9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Horizontaler Fortschritt", + "info": "Eine lineare Fortschrittsanzeige, bei der Eigenschaften wie Farbe und Fortschritt angegeben werden können. Wenn der Wert null ist, dreht sie sich ununterbrochen.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LinearProgressIndicator", + "desc": [ + "【value】 : Fortschritt 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【valueColor】 : Fortschrittsfarbe 【Animation】", + " Wenn der Wert null ist, wird er kontinuierlich wiederholt" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json new file mode 100644 index 00000000..a8b73425 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Horizontal Progress", + "info": "A linear progress display that can specify properties such as color and progress. It will keep spinning when the value is null.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LinearProgressIndicator", + "desc": [ + "【value】: Progress 【double】", + "【backgroundColor】: Background Color 【Color】", + "【valueColor】: Progress Color 【Animation】", + " It will keep looping when the value is null" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json new file mode 100644 index 00000000..b1dc370c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progreso horizontal", + "info": "Indicador de progreso lineal, se pueden especificar propiedades como el color, el progreso, etc. Si el valor es nulo, girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LinearProgressIndicator", + "desc": [ + "【value】 : Progreso 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【valueColor】 : Color del progreso 【Animation】", + " Si el valor es nulo, girará continuamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json new file mode 100644 index 00000000..931656ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progression horizontale", + "info": "Affichage de progression linéaire, peut spécifier des propriétés telles que la couleur, la progression, etc. Tourne en continu lorsque la valeur est nulle.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LinearProgressIndicator", + "desc": [ + "【value】 : Progression 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【valueColor】 : Couleur de progression 【Animation】", + " Tourne en continu lorsque la valeur est nulle" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json new file mode 100644 index 00000000..49eb97e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progresso Orizzontale", + "info": "Visualizzazione del progresso in linea retta, è possibile specificare attributi come colore e progresso. Quando il valore è null, continua a ruotare.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di LinearProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【valueColor】 : Colore del progresso 【Animation】", + " Quando il valore è null, continua a ciclare" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json new file mode 100644 index 00000000..18b7db38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "水平プログレス", + "info": "直線型の進捗表示で、色や進捗などの属性を指定できます。valueがnullの場合は回転し続けます。", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicatorの基本使用", + "desc": [ + "【value】 : 進捗 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 進捗色 【Animation】", + " valueがnullの場合はループし続けます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json new file mode 100644 index 00000000..51efe73c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "수평 진행률", + "info": "직선형 진행률 표시, 색상, 진행률 등 속성을 지정할 수 있습니다. value가 null일 경우 계속 회전합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicator 기본 사용", + "desc": [ + "【value】 : 진행률 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【valueColor】 : 진행률 색상 【Animation】", + " value가 null일 경우 계속 반복" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json new file mode 100644 index 00000000..bebd5b71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progresso Horizontal", + "info": "Exibição de progresso em linha reta, pode especificar atributos como cor, progresso, etc. Quando o valor for null, ele girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LinearProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【valueColor】 : Cor do progresso 【Animation】", + " Quando o valor for null, ele girará continuamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json new file mode 100644 index 00000000..8adec3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Горизонтальный прогресс", + "info": "Линейный индикатор прогресса, можно указать цвет, прогресс и другие свойства. Если значение value равно null, индикатор будет вращаться бесконечно.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Базовое использование LinearProgressIndicator", + "desc": [ + "【value】 : Прогресс 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【valueColor】 : Цвет прогресса 【Animation】", + " Если значение value равно null, индикатор будет вращаться бесконечно" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json new file mode 100644 index 00000000..110a0878 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "水平进度", + "info": "直线型的进度显示,可指定颜色、进度等属性。value为null时会不停旋转。", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicator基本使用", + "desc": [ + "【value】 : 进度 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 进度颜色 【Animation】", + " value为null时会不停循环" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart new file mode 100644 index 00000000..c7d770f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomLinearProgressIndicator extends StatefulWidget { + const CustomLinearProgressIndicator({Key? key}) : super(key: key); + + @override + _CustomLinearProgressIndicatorState createState() => + _CustomLinearProgressIndicatorState(); +} + +class _CustomLinearProgressIndicatorState + extends State { + List data = [0.2, 0.4, 0.6, 0.8, null]; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: data + .map((e) => SizedBox( + width: 50, + height: 3, + child:LinearProgressIndicator( + value: e, + backgroundColor: Colors.grey.withAlpha(33), + valueColor: const AlwaysStoppedAnimation(Colors.orange), + ), + )) + .toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json new file mode 100644 index 00000000..3f8c2dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Radliste", + "info": "Hochwertige zylindrische Scroll-Liste, äußerst raffiniert, ermöglicht die Angabe von Eigenschaften wie Höhe, Perspektive, Kompression usw. und empfängt Ereignisse bei der Auswahl während des Scrollens.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListWheelScrollView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【perspective】 : Perspektive 【double】", + "【itemExtent】 : Höhe des Elements 【EdgeInsets】", + "【onSelectedItemChanged】 : Rückruf bei Auswahl 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json new file mode 100644 index 00000000..f9958d8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Wheel List", + "info": "A high-end cylindrical sliding list, exquisitely designed, allowing you to specify properties such as item height, perspective, and extrusion, and receive selection events during scrolling.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListWheelScrollView", + "desc": [ + "【children】: List of child components 【List】", + "【perspective】: Perspective 【double】", + "【itemExtent】: Item height 【EdgeInsets】", + "【onSelectedItemChanged】: Selection callback 【ValueChanged】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json new file mode 100644 index 00000000..740eaf9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista de rueda de desplazamiento", + "info": "Una lista de desplazamiento cilíndrica de alta gama, muy ingeniosa, permite especificar propiedades como la altura del ítem, la perspectiva, la compresión, etc., y recibe eventos de selección al deslizar.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListWheelScrollView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【perspective】 : Grado de perspectiva 【double】", + "【itemExtent】 : Altura del ítem 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback de selección 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json new file mode 100644 index 00000000..db5f6631 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Liste à roulette", + "info": "Une liste de défilement cylindrique haut de gamme, très ingénieuse, permettant de spécifier des propriétés telles que la hauteur des éléments, la perspective, la compression, etc., et recevant des événements de sélection lors du défilement.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListWheelScrollView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【perspective】 : Degré de perspective 【double】", + "【itemExtent】 : Hauteur de l'élément 【EdgeInsets】", + "【onSelectedItemChanged】 : Rappel de sélection 【ValueChanged】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json new file mode 100644 index 00000000..4ba379f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista a rotella", + "info": "Una lista di scorrimento cilindrica di alto livello, molto raffinata, con la possibilità di specificare proprietà come l'altezza degli item, la prospettiva, la compressione, e di ricevere eventi di selezione durante lo scorrimento.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListWheelScrollView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【perspective】 : Prospettiva 【double】", + "【itemExtent】 : Altezza dell'item 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback di selezione 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json new file mode 100644 index 00000000..225fb042 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "ホイールリスト", + "info": "高級感あふれる円柱状のスライドリストで、精巧な仕様です。アイテムの高さ、パースペクティブ、圧縮などの属性を指定でき、スライド時の選択イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【perspective】 : パースペクティブ 【double】", + "【itemExtent】 : アイテムの高さ 【EdgeInsets】", + "【onSelectedItemChanged】 : 選択コールバック 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json new file mode 100644 index 00000000..48a86a82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "휠 리스트", + "info": "고급스러운 원통형 슬라이드 리스트, 정교함이 가득하며, 아이템 높이, 원근감, 압축 등 속성을 지정할 수 있고, 슬라이드 시 선택 이벤트를 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollView 기본 사용", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【perspective】 : 원근감 【double】", + "【itemExtent】 : 아이템 높이 【EdgeInsets】", + "【onSelectedItemChanged】 : 선택 콜백 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json new file mode 100644 index 00000000..7755454f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista de Rolagem de Roda", + "info": "Uma lista de rolagem cilíndrica de alta classe, cheia de sofisticação, permite especificar propriedades como altura do item, perspetiva, esmagamento, e recebe eventos de seleção durante a rolagem.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ListWheelScrollView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【perspective】 : Grau de perspetiva 【double】", + "【itemExtent】 : Altura do item 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback de seleção 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json new file mode 100644 index 00000000..204c580c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Колесо списка", + "info": "Высококлассный цилиндрический список с прокруткой, изысканный и утонченный, позволяет задавать такие свойства, как высота элемента, перспектива, сжатие и т.д., принимает события выбора при прокрутке.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListWheelScrollView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【perspective】 : Перспектива 【double】", + "【itemExtent】 : Высота элемента 【EdgeInsets】", + "【onSelectedItemChanged】 : Обратный вызов при выборе 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json new file mode 100644 index 00000000..7b9117dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "滚轮列表", + "info": "高大上的柱面滑动列表,精妙十足,可指定item高度、透视、挤压等属性,接收滑动时选中事件。", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【perspective】 : 透视度 【double】", + "【itemExtent】 : item高 【EdgeInsets】", + "【onSelectedItemChanged】 : 选中回调 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart new file mode 100644 index 00000000..d3c253db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomListWheelScrollView extends StatefulWidget { + const CustomListWheelScrollView({Key? key}) : super(key: key); + + @override + _CustomListWheelScrollViewState createState() => + _CustomListWheelScrollViewState(); +} + +class _CustomListWheelScrollViewState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + Color _color = Colors.blue; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildCircle(), + SizedBox( + height: 150, + width: 300, + child: ListWheelScrollView( + perspective: 0.006, + itemExtent: 50, + onSelectedItemChanged: (index) { + print('onSelectedItemChanged:$index'); + setState(() => _color = data[index]); + }, + children: data.map((color) => _buildItem(color)).toList(), + ), + ), + ], + ); + } + + Widget _buildCircle() => Container( + margin: const EdgeInsets.only(bottom: 5), + width: 30, + height: 30, + decoration: BoxDecoration(color: _color, shape: BoxShape.circle), + ); + + Widget _buildItem(Color color) { + return Container( + key: ValueKey(color) , + alignment: Alignment.center, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json new file mode 100644 index 00000000..e76332fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalisierung", + "info": "Stellt internationalisierte Ressourcen für Teilbaumknoten bereit, basierend auf der Implementierung von InheritedWidget. MaterialApp integriert diese Komponente intern, deren locale- und delegates-Parameter letztendlich für diese Komponente verwendet werden.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Aktuelle Sprache abrufen", + "desc": [ + "Mit Localizations.localeOf(context) können die Locale-Dateninformationen der nächstgelegenen übergeordneten Localizations-Komponente basierend auf dem Kontext abgerufen werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json new file mode 100644 index 00000000..6836b478 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalization", + "info": "Provides internationalization resources for subtree nodes, implemented with the underlying dependency on InheritedWidget. The MaterialApp internally integrates this component, and its locale and delegates parameters are ultimately used for this component.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Get Current Language", + "desc": [ + "Through Localizations.localeOf(context), you can retrieve the Locale data information stored in the nearest upper-level Localizations component based on the context." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json new file mode 100644 index 00000000..60f1de63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internacionalización", + "info": "Proporciona recursos de internacionalización para los nodos del subárbol, implementado en el fondo con InheritedWidget. MaterialApp ya integra este componente internamente, y sus parámetros locale y delegates se utilizan finalmente en este componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obtener el idioma actual", + "desc": [ + "A través de Localizations.localeOf(context) se puede obtener la información de Locale almacenada en el componente Localizations más cercano en el contexto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json new file mode 100644 index 00000000..ede44826 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalisation", + "info": "Fournit des ressources d'internationalisation pour les nœuds de sous-arbre, implémenté en s'appuyant sur InheritedWidget. MaterialApp intègre déjà ce composant en interne, ses paramètres locale et delegates sont finalement utilisés pour ce composant.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obtenir la langue actuelle", + "desc": [ + "Avec Localizations.localeOf(context), vous pouvez obtenir les informations de Locale stockées dans le composant Localizations le plus proche en fonction du contexte." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json new file mode 100644 index 00000000..753b5da4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internazionalizzazione", + "info": "Fornisce risorse di internazionalizzazione per i nodi del sottoalbero, implementato tramite InheritedWidget. Questo componente è già integrato all'interno di MaterialApp, e i parametri locale e delegates vengono utilizzati per questo componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ottieni la lingua corrente", + "desc": [ + "Utilizzando Localizations.localeOf(context), è possibile ottenere le informazioni di Locale memorizzate nel componente Localizations più vicino in base al contesto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json new file mode 100644 index 00000000..ab2dee74 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "国際化", + "info": "サブツリーノードに国際化リソースを提供し、内部では InheritedWidget に依存して実装されています。MaterialApp 内部ではこのコンポーネントが統合されており、その locale と delegates パラメータは最終的にこのコンポーネントに使用されます。", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "現在の言語を取得", + "desc": [ + "Localizations.localeOf(context) を使用して、コンテキストに基づいて最も近い上位の Localizations コンポーネントに保存されている Locale データ情報を取得できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json new file mode 100644 index 00000000..046365c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "국제화", + "info": "하위 트리 노드에 국제화 리소스를 제공하며, 내부적으로 InheritedWidget에 의존하여 구현됩니다. MaterialApp 내부에 이 컴포넌트가 통합되어 있으며, locale 및 delegates 매개변수는 최종적으로 이 컴포넌트에 사용됩니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "현재 언어 가져오기", + "desc": [ + "Localizations.localeOf(context)를 통해 컨텍스트에서 가장 가까운 상위 Localizations 컴포넌트에 저장된 Locale 데이터 정보를 가져올 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json new file mode 100644 index 00000000..dc911f17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internacionalização", + "info": "Fornece recursos de internacionalização para os nós da subárvore, dependendo da implementação do InheritedWidget. O MaterialApp já integra este componente internamente, e os parâmetros locale e delegates são usados ​​finalmente para este componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obter idioma atual", + "desc": [ + "Através de Localizations.localeOf(context), é possível obter as informações de Locale armazenadas no componente Localizations mais próximo com base no contexto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json new file mode 100644 index 00000000..2f1d22db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Интернационализация", + "info": "Предоставляет ресурсы интернационализации для поддеревьев, реализовано на основе InheritedWidget. MaterialApp уже интегрирует этот компонент, его параметры locale и delegates в конечном итоге используются этим компонентом.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Получить текущий язык", + "desc": [ + "С помощью Localizations.localeOf(context) можно получить данные Locale, хранящиеся в ближайшем верхнем компоненте Localizations, на основе контекста." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json new file mode 100644 index 00000000..c61848f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "国际化", + "info": "为子树节点提供国际化资源,底层依赖 InheritedWidget 实现。 MaterialApp 内部已集成该组件,其 locale 和 delegates 参数最终用于该组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "获取当前语言", + "desc": [ + "通过 Localizations.localeOf(context) 可以根据上下文获取最近上层的 Localizations 组件存储的 Locale 数据信息。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart new file mode 100644 index 00000000..16c98c8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class LocalizationsDemo1 extends StatelessWidget { + const LocalizationsDemo1({super.key}); + + @override + Widget build(BuildContext context) { + Locale locale = Localizations.localeOf(context); + return Text('Locale: ${locale.toString()}'); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json new file mode 100644 index 00000000..a20e742e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Ziel ziehen", + "info": "Lassen Sie die Komponente bei langem Drücken auf der Oberfläche frei ziehen, und speichern Sie Daten eines generischen Typs T. Wird normalerweise in Kombination mit DragTarget verwendet, um den Zieheffekt zu erzielen.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable mit DragTarget kombinieren", + "desc": [ + "【child】 : Kind 【Widget】", + "【feedback】 : Kind beim Ziehen 【Widget】", + "【axis】 : Achse ziehen 【Axis】", + "【data】 : Daten 【T】", + "【onDragStarted】 : Ziehen beginnen 【Function()】", + "【onDragEnd】 : Ziehen beenden 【Function(DraggableDetails)】", + "【onDragCompleted】 : Ziehen abgeschlossen 【Function()】", + "【onDraggableCanceled】 : Ziehen abbrechen 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json new file mode 100644 index 00000000..7119db04 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Drag Target", + "info": "Allows the component to be dragged anywhere on the interface when long-pressed, and can store data of a generic type T. It is usually used in combination with DragTarget to achieve the drag effect.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable used with DragTarget", + "desc": [ + "【child】 : child 【Widget】", + "【feedback】 : child during drag 【Widget】", + "【axis】 : axis of drag 【Axis】", + "【data】 : data 【T】", + "【onDragStarted】 : start drag 【Function()】", + "【onDragEnd】 : end drag 【Function(DraggableDetails)】", + "【onDragCompleted】 : drag completed 【Function()】", + "【onDraggableCanceled】 : drag canceled 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json new file mode 100644 index 00000000..b1d47365 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Objetivo de arrastre", + "info": "Permite que el componente se arrastre libremente en la interfaz cuando se mantiene presionado, y puede almacenar datos de un tipo genérico T. Generalmente se usa en combinación con DragTarget para completar el efecto de arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso combinado de LongPressDraggable y DragTarget", + "desc": [ + "【child】 : Hijo 【Widget】", + "【feedback】 : Hijo durante el arrastre 【Widget】", + "【axis】 : Eje de arrastre 【Axis】", + "【data】 : Datos 【T】", + "【onDragStarted】 : Inicio del arrastre 【Function()】", + "【onDragEnd】 : Fin del arrastre 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrastre completado 【Function()】", + "【onDraggableCanceled】 : Arrastre cancelado 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json new file mode 100644 index 00000000..4a4e46ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Cible de glissement", + "info": "Permet à un composant d'être glissé n'importe où sur l'interface lorsqu'il est pressé longuement, peut contenir une donnée de type générique T. Généralement utilisé en combinaison avec DragTarget pour réaliser l'effet de glissement.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation conjointe de LongPressDraggable et DragTarget", + "desc": [ + "【child】 : Enfant 【Widget】", + "【feedback】 : Enfant pendant le glissement 【Widget】", + "【axis】 : Axe de glissement 【Axis】", + "【data】 : Données 【T】", + "【onDragStarted】 : Début du glissement 【Function()】", + "【onDragEnd】 : Fin du glissement 【Function(DraggableDetails)】", + "【onDragCompleted】 : Glissement terminé 【Function()】", + "【onDraggableCanceled】 : Glissement annulé 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json new file mode 100644 index 00000000..a8a08abf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Obiettivo trascinabile", + "info": "Permette di trascinare il componente sull'interfaccia quando viene premuto a lungo, può contenere un dato di tipo generico T. Solitamente utilizzato in combinazione con DragTarget per completare l'effetto di trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso combinato di LongPressDraggable e DragTarget", + "desc": [ + "【child】 : figlio 【Widget】", + "【feedback】 : figlio durante il trascinamento 【Widget】", + "【axis】 : asse di trascinamento 【Axis】", + "【data】 : dati 【T】", + "【onDragStarted】 : inizio trascinamento 【Function()】", + "【onDragEnd】 : fine trascinamento 【Function(DraggableDetails)】", + "【onDragCompleted】 : trascinamento completato 【Function()】", + "【onDraggableCanceled】 : trascinamento annullato 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json new file mode 100644 index 00000000..facd28a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "ドラッグターゲット", + "info": "長押しでコンポーネントをインターフェース上で自由にドラッグできるようにし、ジェネリック型Tのデータを格納できます。通常、DragTargetと組み合わせてドラッグ効果を実現します。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggableとDragTargetの連携", + "desc": [ + "【child】 : 子 【Widget】", + "【feedback】 : ドラッグ時の子 【Widget】", + "【axis】 : ドラッグ軸 【Axis】", + "【data】 : データ 【T】", + "【onDragStarted】 : ドラッグ開始 【Function()】", + "【onDragEnd】 : ドラッグ終了 【Function(DraggableDetails)】", + "【onDragCompleted】 : ドラッグ完了 【Function()】", + "【onDraggableCanceled】 : ドラッグキャンセル 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json new file mode 100644 index 00000000..4294fc42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "드래그 대상", + "info": "길게 누르면 컴포넌트를 화면에서 자유롭게 드래그할 수 있으며, 제네릭 T 타입의 데이터를 저장할 수 있습니다. 일반적으로 DragTarget과 조합하여 드래그 효과를 완성합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable과 DragTarget 함께 사용", + "desc": [ + "【child】 : 자식 【Widget】", + "【feedback】 : 드래그 시 자식 【Widget】", + "【axis】 : 드래그 축 【Axis】", + "【data】 : 데이터 【T】", + "【onDragStarted】 : 드래그 시작 【Function()】", + "【onDragEnd】 : 드래그 종료 【Function(DraggableDetails)】", + "【onDragCompleted】 : 드래그 완료 【Function()】", + "【onDraggableCanceled】 : 드래그 취소 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json new file mode 100644 index 00000000..818aee01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Alvo de Arrastar", + "info": "Permite que um componente seja arrastado livremente na interface quando pressionado por um longo tempo, podendo armazenar um dado do tipo genérico T. Geralmente usado em combinação com DragTarget para completar o efeito de arrastar.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Conjunto de LongPressDraggable e DragTarget", + "desc": [ + "【child】 : Filho 【Widget】", + "【feedback】 : Filho durante o arrasto 【Widget】", + "【axis】 : Eixo de arrasto 【Axis】", + "【data】 : Dados 【T】", + "【onDragStarted】 : Início do arrasto 【Function()】", + "【onDragEnd】 : Fim do arrasto 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrasto concluído 【Function()】", + "【onDraggableCanceled】 : Arrasto cancelado 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json new file mode 100644 index 00000000..611d49af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Цель для перетаскивания", + "info": "Позволяет компоненту перетаскиваться по интерфейсу при длительном нажатии, может хранить данные типа T. Обычно используется в сочетании с DragTarget для достижения эффекта перетаскивания.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование LongPressDraggable с DragTarget", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【feedback】 : Дочерний элемент при перетаскивании 【Widget】", + "【axis】 : Ось перетаскивания 【Axis】", + "【data】 : Данные 【T】", + "【onDragStarted】 : Начало перетаскивания 【Function()】", + "【onDragEnd】 : Конец перетаскивания 【Function(DraggableDetails)】", + "【onDragCompleted】 : Перетаскивание завершено 【Function()】", + "【onDraggableCanceled】 : Перетаскивание отменено 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json new file mode 100644 index 00000000..8f9210ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "拖拽目标", + "info": "长按时让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable与DragTarget联用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【feedback】 : 拖拽时的孩子 【Widget】", + "【axis】 : 拖动的轴 【Axis】", + "【data】 : 数据 【T】", + "【onDragStarted】 : 开始拖拽 【Function()】", + "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】", + "【onDragCompleted】 : 拖拽完成 【Function()】", + "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart new file mode 100644 index 00000000..c969744a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomLongPressDraggable extends StatefulWidget { + const CustomLongPressDraggable({Key? key}) : super(key: key); + + @override + _CustomLongPressDraggableState createState() => + _CustomLongPressDraggableState(); +} + +class _CustomLongPressDraggableState extends State { + Color _color = Colors.grey; + String _info = 'DragTarget'; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Wrap( + children: _buildColors(), + spacing: 10, + ), + const SizedBox(height: 20), + _buildDragTarget() + ], + ); + } + + final List colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.purple, + Colors.cyanAccent + ]; + + List _buildColors() => colors + .map( + (e) => LongPressDraggable( + onDragStarted: () => setState(() => _info = '开始拖拽'), + onDragEnd: (d) => setState(() => _info = '结束拖拽'), + onDragCompleted: () => _info = '拖拽完成', + onDraggableCanceled: (v, o) => _info = '拖拽取消', + child: Container( + width: 30, + height: 30, + alignment: Alignment.center, + child: Text( + colors.indexOf(e).toString(), + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), + ), + decoration: BoxDecoration(color: e, shape: BoxShape.circle), + ), + data: e, + feedback: Container( + width: 25, + height: 25, + decoration: BoxDecoration(color: e, shape: BoxShape.circle), + )), + ) + .toList(); + + Widget _buildDragTarget() { + return DragTarget( + onAccept: (data) => setState(() { + _info='onAccept'; + _color = data; + }), + builder: (context, candidateData, rejectedData) => Container( + width: 150.0, + height: 50.0, + color: _color, + child: Center( + child: Text( + _info, + style: const TextStyle(color: Colors.white), + ), + ))); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json new file mode 100644 index 00000000..c6036f68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Materialkomponente", + "info": "Der führende Vertreter von Material-Stil-Komponenten, das Herzstück. Kann Attribute wie Farbe, Schattentiefe, Typ, Schattenfarbe, Form usw. festlegen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Material", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【type】 : Typ 【MaterialType】", + "【elevation】 : Schattentiefe 【double】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【color】 : Farbe 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Shape-Attribut von Material", + "desc": [ + "【shape】 : Form 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json new file mode 100644 index 00000000..13bbe4f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Material Component", + "info": "The leader and core of Material style components. You can specify properties such as color, elevation, type, shadow color, shape, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Material", + "desc": [ + "【child】 : Child Component 【Widget】", + "【type】 : Type 【MaterialType】", + "【elevation】 : Elevation 【double】", + "【shadowColor】 : Shadow Color 【Color】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Shape Property of Material", + "desc": [ + "【shape】 : Shape 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json new file mode 100644 index 00000000..06f9ae7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente de Material", + "info": "El líder y núcleo espiritual de los componentes de estilo Material. Puede especificar atributos como color, profundidad de sombra, tipo, color de sombra, forma, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Material", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profundidad de sombra 【double】", + "【shadowColor】 : Color de sombra 【Color】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Propiedad shape de Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json new file mode 100644 index 00000000..b5694ce2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Composant Matériel", + "info": "Le leader des composants de style Material, l'âme centrale. Peut spécifier des attributs tels que la couleur, la profondeur de l'ombre, le type, la couleur de l'ombre, la forme, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Material", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【type】 : Type 【MaterialType】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【color】 : Couleur 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Attribut de forme de Material", + "desc": [ + "【shape】 : Forme 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json new file mode 100644 index 00000000..695b1f79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente Material", + "info": "Leader dei componenti in stile Material, cuore e anima. Puoi specificare attributi come colore, profondità dell'ombra, tipo, colore dell'ombra, forma, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Material", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【color】 : Colore 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Attributo shape di Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json new file mode 100644 index 00000000..1e988e45 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "材料コンポーネント", + "info": "Materialスタイルコンポーネントのリーダー、コアとなる存在。色、影の深さ、タイプ、影の色、形状などの属性を指定できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Materialの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【type】 : タイプ 【MaterialType】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【color】 : 色 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Materialのshape属性", + "desc": [ + "【shape】 : 形状 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json new file mode 100644 index 00000000..9b9337d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "재료 컴포넌트", + "info": "Material 스타일 컴포넌트의 선두주자, 핵심 요소. 색상, 그림자 깊이, 유형, 그림자 색상, 모양 등 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Material 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【type】 : 유형 【MaterialType】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【color】 : 색상 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Material의 shape 속성", + "desc": [ + "【shape】 : 모양 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json new file mode 100644 index 00000000..d4379be6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente de Material", + "info": "O líder e núcleo espiritual dos componentes de estilo Material. Pode especificar atributos como cor, profundidade de sombra, tipo, cor da sombra, forma, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Material", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profundidade de sombra 【double】", + "【shadowColor】 : Cor da sombra 【Color】", + "【color】 : Cor 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Propriedade shape do Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json new file mode 100644 index 00000000..c047f3f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Компонент материала", + "info": "Лидер компонентов в стиле Material, ядро и душа. Можно указать такие атрибуты, как цвет, глубина тени, тип, цвет тени, форма и другие.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Material", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【type】 : Тип 【MaterialType】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【color】 : Цвет 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Атрибут shape Material", + "desc": [ + "【shape】 : Форма 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json new file mode 100644 index 00000000..9c232cab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "材料组件", + "info": "Material风格组件的领军人物,灵魂核心。可指定颜色、影深、类型、阴影颜色、形状等属性。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Material基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【type】 : 类型 【MaterialType】", + "【elevation】 : 影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【color】 : 颜色 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Material的shape属性", + "desc": [ + "【shape】 : 形状 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart new file mode 100644 index 00000000..3dec9b67 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomMaterial extends StatelessWidget { + const CustomMaterial({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + runSpacing: 10, + children: MaterialType.values.map((e) => _buildMaterial(e)).toList()); + } + + Material _buildMaterial(MaterialType type) => Material( + shadowColor: Colors.blue, + type: type, + color: Colors.orange, + elevation: 3, + child: Container( + alignment: Alignment.center, + width: 100, + height: 60, + child: Text( + type.toString().split('.')[1], + style: const TextStyle(color: Colors.black), + ), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart new file mode 100644 index 00000000..d31d3c2c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class ShapeMaterial extends StatelessWidget { + const ShapeMaterial({Key? key}) : super(key: key); + + final Map shapeMap = const { + 'BorderDirectional': BorderDirectional( + top: BorderSide( + color: Colors.white, + ), + start: BorderSide(color: Colors.black, width: 15), + bottom: BorderSide( + color: Colors.white, + )), + 'Border': Border( + top: BorderSide(width: 5.0, color: Color(0xFFDFDFDF)), + left: BorderSide(width: 5.0, color: Color(0xFFDFDFDF)), + right: BorderSide(width: 5.0, color: Color(0xFF7F7F7F)), + bottom: BorderSide(width: 5.0, color: Color(0xFF7F7F7F)), + ), + 'Circle': CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + 'RoundedRectangleBorder': RoundedRectangleBorder( + side: BorderSide(width: 1.0, color: Colors.black), + borderRadius: BorderRadius.all(Radius.circular(15))), + 'ContinuousRectangleBorder': ContinuousRectangleBorder( + side: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(40.0)), + ) + }; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + runSpacing: 10, + children: shapeMap.keys.map((e) => _buildMaterial(e)).toList(), + ); + } + + Material _buildMaterial(String type) => Material( + shadowColor: Colors.blue, + shape: shapeMap[type], + color: Colors.orange, + elevation: 3, + textStyle: const TextStyle(color: Colors.white), + child: Container( + alignment: Alignment.center, + width: 300, + height: 60, + child: Text( + type, + ), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json new file mode 100644 index 00000000..54c45913 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material-Anwendung", + "info": "Die oberste Komponente der Material-Anwendung, enthält Eigenschaften wie Routengenerator, Thema, Sprache, Startseite usw.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MaterialApp", + "desc": [ + "【theme】 : Thema 【ThemeData】", + "【title】 : Titel in der Taskleiste 【String】", + "【debugShowCheckedModeBanner】 : Badge aktivieren 【bool】", + "【showPerformanceOverlay】 : Leistungsüberlagerung aktivieren 【bool】", + "【debugShowMaterialGrid】 : Raster aktivieren 【bool】", + "【onGenerateRoute】 : Routengenerator 【RouteFactory】", + "【home】 : Startseite 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json new file mode 100644 index 00000000..94a88732 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material Application", + "info": "The top-level component of a Material application, including properties such as route generator, theme, language, home page, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MaterialApp", + "desc": [ + "【theme】 : Theme 【ThemeData】", + "【title】 : Taskbar Title 【String】", + "【debugShowCheckedModeBanner】 : Enable Badge 【bool】", + "【showPerformanceOverlay】 : Enable Performance Overlay 【bool】", + "【debugShowMaterialGrid】 : Enable Grid 【bool】", + "【onGenerateRoute】 : Route Generator 【RouteFactory】", + "【home】 : Home Page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json new file mode 100644 index 00000000..b994d6c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Aplicación Material", + "info": "Componente de nivel superior de la aplicación Material, que incluye propiedades como el generador de rutas, tema, idioma, página de inicio, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título de la barra de tareas 【String】", + "【debugShowCheckedModeBanner】 : Activar insignia 【bool】", + "【showPerformanceOverlay】 : Activar superposición de rendimiento 【bool】", + "【debugShowMaterialGrid】 : Activar cuadrícula 【bool】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【home】 : Página de inicio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json new file mode 100644 index 00000000..dae6e1a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Application Material", + "info": "Le composant de niveau supérieur de l'application Material, incluant des propriétés telles que le générateur de routes, le thème, la langue, la page d'accueil, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MaterialApp", + "desc": [ + "【theme】 : Thème 【ThemeData】", + "【title】 : Titre de la barre des tâches 【String】", + "【debugShowCheckedModeBanner】 : Activer le badge 【bool】", + "【showPerformanceOverlay】 : Activer la superposition de performance 【bool】", + "【debugShowMaterialGrid】 : Activer la grille 【bool】", + "【onGenerateRoute】 : Générateur de routes 【RouteFactory】", + "【home】 : Page d'accueil 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json new file mode 100644 index 00000000..0c824a8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Applicazione Material", + "info": "Componente di primo livello per applicazioni Material, include proprietà come generatore di route, tema, lingua, homepage, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Titolo della barra delle applicazioni 【String】", + "【debugShowCheckedModeBanner】 : Attiva badge 【bool】", + "【showPerformanceOverlay】 : Attiva overlay delle prestazioni 【bool】", + "【debugShowMaterialGrid】 : Attiva griglia 【bool】", + "【onGenerateRoute】 : Generatore di route 【RouteFactory】", + "【home】 : Homepage 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json new file mode 100644 index 00000000..207e1de5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Materialアプリ", + "info": "Materialアプリのトップレベルのコンポーネントで、ルートジェネレータ、テーマ、言語、ホームページなどの属性を含みます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialAppの基本使い方", + "desc": [ + "【theme】 : テーマ 【ThemeData】", + "【title】 : タスクバーのタイトル 【String】", + "【debugShowCheckedModeBanner】 : バッジを表示する 【bool】", + "【showPerformanceOverlay】 : パフォーマンスオーバーレイを表示する 【bool】", + "【debugShowMaterialGrid】 : グリッドを表示する 【bool】", + "【onGenerateRoute】 : ルートジェネレータ 【RouteFactory】", + "【home】 : ホームページ 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json new file mode 100644 index 00000000..420abe91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material 앱", + "info": "Material 앱의 최상위 컴포넌트로, 라우트 생성기, 테마, 언어, 홈페이지 등의 속성을 포함합니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialApp 기본 사용법", + "desc": [ + "【theme】 : 테마 【ThemeData】", + "【title】 : 작업 표시줄 제목 【String】", + "【debugShowCheckedModeBanner】 : 배지 활성화 【bool】", + "【showPerformanceOverlay】 : 성능 오버레이 활성화 【bool】", + "【debugShowMaterialGrid】 : 그리드 활성화 【bool】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【home】 : 홈페이지 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json new file mode 100644 index 00000000..faa15650 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Aplicação Material", + "info": "Componente de topo da aplicação Material, que inclui gerador de rotas, tema, idioma, página inicial, entre outros atributos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título da barra de tarefas 【String】", + "【debugShowCheckedModeBanner】 : Ativar insígnia 【bool】", + "【showPerformanceOverlay】 : Ativar sobreposição de desempenho 【bool】", + "【debugShowMaterialGrid】 : Ativar grelha 【bool】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【home】 : Página inicial 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json new file mode 100644 index 00000000..43e5975c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material приложение", + "info": "Верхний компонент Material приложения, включающий генератор маршрутов, тему, язык, домашнюю страницу и другие атрибуты.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MaterialApp", + "desc": [ + "【theme】 : Тема 【ThemeData】", + "【title】 : Заголовок в панели задач 【String】", + "【debugShowCheckedModeBanner】 : Включить значок 【bool】", + "【showPerformanceOverlay】 : Включить наложение производительности 【bool】", + "【debugShowMaterialGrid】 : Включить сетку 【bool】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【home】 : Домашняя страница 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json new file mode 100644 index 00000000..57ba7ea5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material应用", + "info": "Material应用的顶级组件,包含路由生成器、主题、语言、主页等属性。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialApp基本用法", + "desc": [ + "【theme】 : 主题 【ThemeData】", + "【title】 : 任务栏标题 【String】", + "【debugShowCheckedModeBanner】 : 开启角标 【bool】", + "【showPerformanceOverlay】 : 开启性能浮层 【bool】", + "【debugShowMaterialGrid】 : 开启网格 【bool】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【home】 : 主页 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart new file mode 100644 index 00000000..c7c61e55 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-17 +/// contact me by email 1981462002@qq.com + +class MaterialAppDemo extends StatefulWidget { + const MaterialAppDemo({Key? key}) : super(key: key); + + @override + _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); +} + +class _WidgetsAppDemoState extends State { + bool _debugShowCheckedModeBanner = false; + bool _showPerformanceOverlay = false; + bool _debugShowMaterialGrid = false; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildSwitchers(), + SizedBox( + height: 250, + child: MaterialApp( + debugShowCheckedModeBanner: _debugShowCheckedModeBanner, + showPerformanceOverlay: _showPerformanceOverlay, + debugShowMaterialGrid: _debugShowMaterialGrid, + home: const HomePage(), + ), + ), + ], + ); + } + + Widget _buildSwitchers() { + return DefaultTextStyle( + style: const TextStyle(color: Colors.blue), + child: Wrap( + spacing: 10, + children: [ + Column( + children: [ + Switch( + value: _showPerformanceOverlay, + onChanged: (v) { + setState(() { + _showPerformanceOverlay = v; + }); + }, + ), + const Text('性能浮层') + ], + ), + Column( + children: [ + Switch( + value: _debugShowCheckedModeBanner, + onChanged: (v) { + setState(() { + _debugShowCheckedModeBanner = v; + }); + }, + ), + const Text('开启角标') + ], + ), + Column( + children: [ + Switch( + value: _debugShowMaterialGrid, + onChanged: (v) { + setState(() { + _debugShowMaterialGrid = v; + }); + }, + ), + const Text('开启网格') + ], + ) + ], + ), + ); + } +} + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + var _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: const Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json new file mode 100644 index 00000000..c6265925 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Kombinierbares Material", + "info": "Wird verwendet, um eine Liste von MergeableMaterialItem anzuzeigen, einschließlich MaterialSlice (Hauptteil) und MaterialGap (Trennlinie).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MergeableMaterial", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【hasDividers】 : Gibt es Trennlinien 【bool】", + "【dividerColor】 : Farbe der Trennlinie 【Color】", + "【mainAxis】 : Achse 【Axis】", + "【children】 : Sammlung von Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json new file mode 100644 index 00000000..8c6e9e0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Mergeable Material", + "info": "Used to display a list of MergeableMaterialItem, including MaterialSlice (main body) and MaterialGap (separator).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MergeableMaterial", + "desc": [ + "【elevation】 : Shadow depth 【double】", + "【hasDividers】 : Whether there are dividers 【bool】", + "【dividerColor】 : Divider color 【Color】", + "【mainAxis】 : Axis direction 【Axis】", + "【children】 : Child components collection 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json new file mode 100644 index 00000000..871630a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Material Fusionable", + "info": "Utilizado para mostrar una lista de MergeableMaterialItem, incluyendo MaterialSlice (cuerpo) y MaterialGap (separador).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MergeableMaterial", + "desc": [ + "【elevation】 : Profundidad de la sombra 【double】", + "【hasDividers】 : Si tiene líneas divisorias 【bool】", + "【dividerColor】 : Color de la línea divisoria 【Color】", + "【mainAxis】 : Eje principal 【Axis】", + "【children】 : Conjunto de componentes hijos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json new file mode 100644 index 00000000..005e06ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Matériau Fusionnable", + "info": "Utilisé pour afficher une liste de MergeableMaterialItem, comprenant MaterialSlice (corps principal) et MaterialGap (séparateur).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MergeableMaterial", + "desc": [ + "【elevation】 : Profondeur d'ombre 【double】", + "【hasDividers】 : Présence de lignes de séparation 【bool】", + "【dividerColor】 : Couleur de la ligne de séparation 【Color】", + "【mainAxis】 : Axe principal 【Axis】", + "【children】 : Ensemble de composants enfants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json new file mode 100644 index 00000000..32e9b9d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Materiale Unificabile", + "info": "Utilizzato per visualizzare una lista di MergeableMaterialItem, inclusi MaterialSlice (corpo) e MaterialGap (separazione).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di MergeableMaterial", + "desc": [ + "【elevation】 : Profondità dell'ombra 【double】", + "【hasDividers】 : Presenza di linee divisorie 【bool】", + "【dividerColor】 : Colore della linea divisoria 【Color】", + "【mainAxis】 : Asse principale 【Axis】", + "【children】 : Insieme di componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json new file mode 100644 index 00000000..d62c71e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "マージ可能な材料", + "info": "MergeableMaterialItemのリストを表示するために使用され、MaterialSlice(本体)とMaterialGap(区切り)を含みます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterialの基本使用", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【hasDividers】 : 区切り線があるかどうか 【bool】", + "【dividerColor】 : 区切り線の色 【Color】", + "【mainAxis】 : 軸方向 【Axis】", + "【children】 : 子コンポーネントセット 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json new file mode 100644 index 00000000..3a511350 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "병합 가능한 재료", + "info": "MergeableMaterialItem의 목록을 표시하는 데 사용되며, MaterialSlice(본체)와 MaterialGap(구분자)를 포함합니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterial 기본 사용법", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【hasDividers】 : 구분선 여부 【bool】", + "【dividerColor】 : 구분선 색상 【Color】", + "【mainAxis】 : 축 방향 【Axis】", + "【children】 : 하위 컴포넌트 집합 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json new file mode 100644 index 00000000..a0f50e44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Material Fundível", + "info": "Usado para exibir uma lista de MergeableMaterialItem, incluindo MaterialSlice (corpo) e MaterialGap (separador).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MergeableMaterial", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【hasDividers】 : Se tem linhas divisórias 【bool】", + "【dividerColor】 : Cor da linha divisória 【Color】", + "【mainAxis】 : Eixo 【Axis】", + "【children】 : Conjunto de componentes filhos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json new file mode 100644 index 00000000..6190e65d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Объединяемый материал", + "info": "Используется для отображения списка MergeableMaterialItem, включая MaterialSlice (основная часть) и MaterialGap (разделитель).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MergeableMaterial", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【hasDividers】 : Наличие разделителей 【bool】", + "【dividerColor】 : Цвет разделителя 【Color】", + "【mainAxis】 : Ось 【Axis】", + "【children】 : Набор дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json new file mode 100644 index 00000000..67f725fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "可合并材料", + "info": "用于展示 MergeableMaterialItem 的列表,包括 MaterialSlice(主体) 和 MaterialGap(分隔) 。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterial基本使用", + "desc": [ + "【elevation】 : 影深 【double】", + "【hasDividers】 : 是否有分隔线 【bool】", + "【dividerColor】 : 分隔线颜色 【Color】", + "【mainAxis】 : 轴向 【Axis】", + "【children】 : 子组件集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart new file mode 100644 index 00000000..8c51e075 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart @@ -0,0 +1,72 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class MergeableMaterialDemo extends StatefulWidget { + const MergeableMaterialDemo({Key? key}) : super(key: key); + + @override + _MergeableMaterialDemoState createState() => _MergeableMaterialDemoState(); +} + +class _MergeableMaterialDemoState extends State { + List items=[]; + + @override + void initState() { + super.initState(); + _init(20); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: SingleChildScrollView( + child: MergeableMaterial( + elevation: 1, + hasDividers: true, + dividerColor: Colors.red, + children: items, + ), + ), + ); + } + + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]! + ]; + + void _init(int count) { + for (int i = 0; i < count; i++) { + items.add(MaterialSlice( + key: ValueKey(i), + child: Container( + alignment: Alignment.center, + height: 60, + color: data[i % data.length], + child: Text(colorString(data[i % data.length])), + ))); + if(i!=count-1){ + items.add(MaterialGap( + key: ValueKey(i), + size: 5)); + } + } + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json new file mode 100644 index 00000000..a98eb3c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Monatsauswahl", + "info": "Komponente zur Auswahl eines Monats mit integrierter Überwachung für den Wechsel zwischen den Monaten. Ermöglicht die Angabe des auszuwählenden Datumsbereichs, des ausgewählten Datums usw. und empfängt Ereignisse bei der Datumsauswahl.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MonthPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【onChanged】 : Rückruf bei Klick 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, die Monatsauswahl, wurde mit Flutter 3.0 aus dem Verkehr gezogen. Der Ersatz ist der CalendarDatePicker, der Kalenderauswahl.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json new file mode 100644 index 00000000..ef72e4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Month Picker", + "info": "A component for selecting months, with built-in listeners for switching between previous and next months. Allows specifying the date range, selected date, and receives date selection events.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MonthPicker", + "desc": [ + "【selectedDate】: Selected date 【DateTime】", + "【firstDate】: Earliest date limit 【DateTime】", + "【lastDate】: Latest date limit 【DateTime】", + "【onChanged】: Click callback 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, the month selector, has been phased out in Flutter 3.0. It is replaced by the CalendarDatePicker, the calendar selector.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json new file mode 100644 index 00000000..0c2e6c0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Selector de Mes", + "info": "Componente de selección de mes con escucha incorporada para cambiar entre meses. Permite especificar rangos de fechas seleccionables, fechas seleccionadas, y recibe eventos de selección de fecha.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de MonthPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【firstDate】 : Límite de la primera fecha 【DateTime】", + "【lastDate】 : Límite de la última fecha 【DateTime】", + "【onChanged】 : Callback al hacer clic 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, el selector de mes, dejó de usarse en Flutter 3.0. Fue reemplazado por CalendarDatePicker, el selector de calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json new file mode 100644 index 00000000..02ed6122 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Sélecteur de mois", + "info": "Composant de sélection de mois avec écouteur intégré pour passer au mois précédent ou suivant. Peut spécifier la plage de dates sélectionnables, la date sélectionnée, etc., et reçoit les événements de sélection de date.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MonthPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【onChanged】 : Rappel au clic 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, le sélecteur de mois, a quitté la scène historique avec Flutter 3.0. Il est remplacé par CalendarDatePicker, le sélecteur de calendrier.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json new file mode 100644 index 00000000..c5d648dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Selettore del mese", + "info": "Componente di selezione del mese, con monitoraggio integrato per il passaggio al mese precedente o successivo. È possibile specificare l'intervallo di date selezionabile, la data selezionata, ecc., e ricevere eventi di selezione della data.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MonthPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【firstDate】 : Limite della data più recente 【DateTime】", + "【lastDate】 : Limite della data più lontana 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, il selettore del mese, è stato ritirato in Flutter 3.0. Il suo sostituto è il CalendarDatePicker, il selettore del calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json new file mode 100644 index 00000000..46d81212 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "月選択器", + "info": "月の選択コンポーネントで、前後の月への切り替えを監視します。選択可能な日付範囲や選択された日付を指定でき、日付選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPickerの基本使用", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 月選択器は Flutter3.0 で歴史の舞台から退場しました。代替として CalendarDatePicker カレンダー選択器が登場しました。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json new file mode 100644 index 00000000..9299152b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "월 선택기", + "info": "월을 선택하는 컴포넌트로, 상하월 전환을 자동으로 감지합니다. 선택 가능한 날짜 범위, 선택된 날짜 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPicker 기본 사용법", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【firstDate】 : 최초 날짜 제한 【DateTime】", + "【lastDate】 : 마지막 날짜 제한 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 월 선택기는 Flutter3.0에서 역사 속으로 사라졌습니다. 이를 대체하는 것은 CalendarDatePicker 달력 선택기입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json new file mode 100644 index 00000000..0ff589c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Seletor de Mês", + "info": "Componente de seleção de mês, com monitoramento integrado para mudança de mês. Pode especificar o intervalo de datas selecionado, a data selecionada, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MonthPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'O MonthPicker, o seletor de mês, foi retirado do palco histórico no Flutter 3.0. O substituto é o CalendarDatePicker, o seletor de calendário.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json new file mode 100644 index 00000000..baa15739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Выбор месяца", + "info": "Компонент выбора месяца с встроенным прослушиванием переключения на предыдущий и следующий месяц. Можно указать диапазон выбора дат, выбранную дату и т.д., принимает событие выбора даты.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MonthPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【onChanged】 : Обратный вызов при клике 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, компонент выбора месяца, ушел в историю с выходом Flutter 3.0. Его заменил CalendarDatePicker, компонент выбора даты.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json new file mode 100644 index 00000000..816c09a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "月份选择器", + "info": "月份的选择组件,自带上下月切换的监听。可指定选择的日期范围、选中日期等,接收日期选中事件。", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 月份期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart new file mode 100644 index 00000000..b7f9668b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomMonthPicker extends StatelessWidget{ + const CustomMonthPicker({Key? key}) : super(key: key); + + final String info = + 'MonthPicker 月份期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json new file mode 100644 index 00000000..246a4c82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Mausbereich", + "info": "Eine Komponente zur Überwachung von Mausereignissen, wird normalerweise für Desktop- und Webplattformen verwendet und kann Mausbewegungen, Eintritts- und Austrittsereignisse überwachen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MouseRegion", + "desc": [ + "【onEnter】: Eintrittsereignis 【PointerEnterEventListener】", + "【onHover】: Bewegungsereignis 【PointerHoverEventListener】", + "【onExit】: Austrittsereignis 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json new file mode 100644 index 00000000..858d3001 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Mouse Region", + "info": "A component for mouse event listening, typically used on desktop and web platforms, can listen to mouse enter, exit, and move events.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MouseRegion", + "desc": [ + "【onEnter】: Enter event 【PointerEnterEventListener】", + "【onHover】: Move event 【PointerHoverEventListener】", + "【onExit】: Exit event 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json new file mode 100644 index 00000000..8aaf2d68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Región del Ratón", + "info": "Componente utilizado para la escucha de eventos del ratón, comúnmente utilizado en plataformas de escritorio y web, puede escuchar eventos de entrada, salida y movimiento del ratón.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MouseRegion", + "desc": [ + "【onEnter】 : Evento de entrada 【PointerEnterEventListener】", + "【onHover】: Evento de movimiento 【PointerHoverEventListener】", + "【onExit】: Evento de salida 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json new file mode 100644 index 00000000..e58a9d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Région de souris", + "info": "Composant utilisé pour la surveillance des événements de souris, généralement utilisé sur les plateformes de bureau et Web, peut surveiller les événements d'entrée, de sortie et de déplacement de la souris.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MouseRegion", + "desc": [ + "【onEnter】 : Événement d'entrée 【PointerEnterEventListener】", + "【onHover】: Événement de déplacement 【PointerHoverEventListener】", + "【onExit】: Événement de sortie 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json new file mode 100644 index 00000000..82062799 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Area del Mouse", + "info": "Componente per il monitoraggio degli eventi del mouse, comunemente utilizzato su piattaforme desktop e web, in grado di monitorare eventi di entrata, uscita e movimento del mouse.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MouseRegion", + "desc": [ + "【onEnter】: Evento di entrata 【PointerEnterEventListener】", + "【onHover】: Evento di movimento 【PointerHoverEventListener】", + "【onExit】: Evento di uscita 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json new file mode 100644 index 00000000..8984d5db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "マウス領域", + "info": "マウスイベントを監視するためのコンポーネントで、通常はデスクトップおよびWebプラットフォームで使用され、マウスの入場、退出、移動イベントを監視できます。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegionの基本使用", + "desc": [ + "【onEnter】 : 入場イベント 【PointerEnterEventListener】", + "【onHover】: 移動イベント 【PointerHoverEventListener】", + "【onExit】: 退出イベント 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json new file mode 100644 index 00000000..56709993 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "마우스 영역", + "info": "마우스 이벤트를 감지하는 컴포넌트로, 주로 데스크톱 및 웹 플랫폼에서 사용되며, 마우스 진입, 이동, 이탈 이벤트를 감지할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegion 기본 사용", + "desc": [ + "【onEnter】 : 진입 이벤트 【PointerEnterEventListener】", + "【onHover】: 이동 이벤트 【PointerHoverEventListener】", + "【onExit】: 이탈 이벤트 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json new file mode 100644 index 00000000..cf3097e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Região do Rato", + "info": "Componente para monitorização de eventos do rato, geralmente utilizado em plataformas de desktop e web, pode monitorizar eventos de entrada, saída e movimento do rato.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MouseRegion", + "desc": [ + "【onEnter】 : Evento de entrada 【PointerEnterEventListener】", + "【onHover】: Evento de movimento 【PointerHoverEventListener】", + "【onExit】: Evento de saída 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json new file mode 100644 index 00000000..fbde4efe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Область мыши", + "info": "Компонент для отслеживания событий мыши, обычно используется на платформах для настольных компьютеров и веб-платформах, может отслеживать события входа, выхода и перемещения мыши.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MouseRegion", + "desc": [ + "【onEnter】: Событие входа 【PointerEnterEventListener】", + "【onHover】: Событие перемещения 【PointerHoverEventListener】", + "【onExit】: Событие выхода 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json new file mode 100644 index 00000000..194a6654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "鼠标区域", + "info": "用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegion基本使用", + "desc": [ + "【onEnter】 : 移入事件 【PointerEnterEventListener】", + "【onHover】: 移动事件 【PointerHoverEventListener】", + "【onExit】: 移出事件 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart new file mode 100644 index 00000000..2d77a327 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart @@ -0,0 +1,63 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class MouseRegionDemo extends StatefulWidget { + const MouseRegionDemo({Key? key}) : super(key: key); + + @override + _MouseRegionDemoState createState() => _MouseRegionDemoState(); +} + +class _MouseRegionDemoState extends State { + int _enterCounter = 0; + int _exitCounter = 0; + double x = 0.0; + double y = 0.0; + void _incrementEnter(PointerEvent details) { + setState(() { + _enterCounter++; + }); + } + void _incrementExit(PointerEvent details) { + setState(() { + _exitCounter++; + }); + } + void _updateLocation(PointerEvent details) { + setState(() { + x = details.position.dx; + y = details.position.dy; + }); + } + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: BoxConstraints.tight(const Size(300.0, 200.0)), + child: MouseRegion( + onEnter: _incrementEnter, + onHover: _updateLocation, + onExit: _incrementExit, + child: Container( + color: Colors.lightBlueAccent, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('你的鼠标移入移除信息:'), + Text( + '$_enterCounter Entries\n$_exitCounter Exits', + style: Theme.of(context).textTheme.headlineMedium, + ), + Text( + 'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})', + ), + ], + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json new file mode 100644 index 00000000..74f4b8e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Seitennavigation", + "info": "Seitennavigationsleiste, wird im Allgemeinen für Desktop-Navigationsmenüs verwendet. Unterstützt erweiterbare und reduzierbare Bereiche, kann Komponenten für die Anfangsposition und Endposition angeben.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail Grundlegende Verwendung", + "desc": [ + "【destinations】 : Menüdatenliste 【List】", + "【selectedIndex】: Aktivierter Index 【int】", + "【labelType】: Label-Stil 【NavigationRailLabelType?】", + "【onDestinationSelected】: Menü-Klick-Ereignis 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail Falt-Effekt", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【leading】: Startkomponente 【Widget?】", + "【trailing】: Endkomponente 【Widget?】", + "【extended】: Ob erweitert 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail Stil", + "desc": [ + "【useIndicator】 : Ob Indikator angezeigt wird 【bool】", + "【indicatorColor】: Indikatorfarbe 【Color?】", + "【backgroundColor】: Hintergrundfarbe 【Color?】", + "【labelType】: Label-Stil 【NavigationRailLabelType?】", + "【selectedIconTheme】: Ausgewähltes Icon-Thema 【IconThemeData?】", + "【unselectedIconTheme】: Nicht ausgewähltes Icon-Thema 【IconThemeData?】", + "【selectedLabelTextStyle】: Ausgewählter Textstil 【TextStyle?】", + "【unselectedLabelTextStyle】: Nicht ausgewählter Textstil 【TextStyle?】", + "【minExtendedWidth】: Erweiterte Breite 【double?】", + "【minWidth】: Nicht erweiterte Breite 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json new file mode 100644 index 00000000..e9853927 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Side Navigation Bar", + "info": "Side navigation bar, generally used for desktop navigation menus. Supports expanding and collapsing areas, and can specify components at the beginning and end positions.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NavigationRail", + "desc": [ + "【destinations】 : Menu data list 【List】", + "【selectedIndex】: Active index 【int】", + "【labelType】: Label style 【NavigationRailLabelType?】", + "【onDestinationSelected】: Menu click event 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Collapse Effect of NavigationRail", + "desc": [ + "【elevation】 : Shadow depth 【double】", + "【leading】: Leading component 【Widget?】", + "【trailing】: Trailing component 【Widget?】", + "【extended】: Whether to expand 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail Style", + "desc": [ + "【useIndicator】 : Whether to show the indicator 【bool】", + "【indicatorColor】: Indicator color 【Color?】", + "【backgroundColor】: Background color 【Color?】", + "【labelType】: Label style 【NavigationRailLabelType?】", + "【selectedIconTheme】: Selected icon style 【IconThemeData?】", + "【unselectedIconTheme】: Unselected icon style 【IconThemeData?】", + "【selectedLabelTextStyle】: Selected text style 【TextStyle?】", + "【unselectedLabelTextStyle】: Unselected text style 【TextStyle?】", + "【minExtendedWidth】: Expanded width 【double?】", + "【minWidth】: Unexpanded width 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json new file mode 100644 index 00000000..ed04f669 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Navegación lateral", + "info": "Barra de navegación lateral, generalmente utilizada para menús de navegación de escritorio. Admite áreas expandibles y contraíbles, y permite especificar componentes en la posición inicial y final.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NavigationRail", + "desc": [ + "【destinations】 : Lista de datos del menú 【List】", + "【selectedIndex】: Índice activo 【int】", + "【labelType】: Estilo de la etiqueta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento de clic en el menú 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Efecto de plegado de NavigationRail", + "desc": [ + "【elevation】 : Profundidad de la sombra 【double】", + "【leading】: Componente inicial 【Widget?】", + "【trailing】: Componente final 【Widget?】", + "【extended】: Si está expandido 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Estilo de NavigationRail", + "desc": [ + "【useIndicator】 : Si se muestra el indicador 【bool】", + "【indicatorColor】: Color del indicador 【Color?】", + "【backgroundColor】: Color de fondo 【Color?】", + "【labelType】: Estilo de la etiqueta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Estilo del icono seleccionado 【IconThemeData?】", + "【unselectedIconTheme】: Estilo del icono no seleccionado 【IconThemeData?】", + "【selectedLabelTextStyle】: Estilo del texto seleccionado 【TextStyle?】", + "【unselectedLabelTextStyle】: Estilo del texto no seleccionado 【TextStyle?】", + "【minExtendedWidth】: Ancho expandido 【double?】", + "【minWidth】: Ancho no expandido 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json new file mode 100644 index 00000000..8203bb85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Barre de navigation latérale", + "info": "Barre de navigation latérale, généralement utilisée pour les menus de navigation sur ordinateur. Prend en charge l'expansion et la contraction des zones, et permet de spécifier les composants en position de début et de fin.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NavigationRail", + "desc": [ + "【destinations】 : Liste des données du menu 【List】", + "【selectedIndex】: Index actif 【int】", + "【labelType】: Style de l'étiquette 【NavigationRailLabelType?】", + "【onDestinationSelected】: Événement de clic sur le menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Effet de pliage de NavigationRail", + "desc": [ + "【elevation】 : Profondeur de l'ombre 【double】", + "【leading】: Composant de début 【Widget?】", + "【trailing】: Composant de fin 【Widget?】", + "【extended】: Est-ce étendu 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Style de NavigationRail", + "desc": [ + "【useIndicator】 : Afficher l'indicateur 【bool】", + "【indicatorColor】: Couleur de l'indicateur 【Color?】", + "【backgroundColor】: Couleur de fond 【Color?】", + "【labelType】: Style de l'étiquette 【NavigationRailLabelType?】", + "【selectedIconTheme】: Style de l'icône sélectionnée 【IconThemeData?】", + "【unselectedIconTheme】: Style de l'icône non sélectionnée 【IconThemeData?】", + "【selectedLabelTextStyle】: Style du texte sélectionné 【TextStyle?】", + "【unselectedLabelTextStyle】: Style du texte non sélectionné 【TextStyle?】", + "【minExtendedWidth】: Largeur étendue 【double?】", + "【minWidth】: Largeur non étendue 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json new file mode 100644 index 00000000..6e44bddf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Navigazione laterale", + "info": "Barra di navigazione laterale, generalmente utilizzata per il menu di navigazione desktop. Supporta l'espansione e la contrazione delle aree, e consente di specificare i componenti nelle posizioni iniziali e finali.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di NavigationRail", + "desc": [ + "【destinations】 : Lista dei dati del menu 【List】", + "【selectedIndex】: Indice attivo 【int】", + "【labelType】: Stile dell'etichetta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento di clic sul menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Effetto di collasso di NavigationRail", + "desc": [ + "【elevation】 : Profondità dell'ombra 【double】", + "【leading】: Componente iniziale 【Widget?】", + "【trailing】: Componente finale 【Widget?】", + "【extended】: Se espanso 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Stile di NavigationRail", + "desc": [ + "【useIndicator】 : Se mostrare l'indicatore 【bool】", + "【indicatorColor】: Colore dell'indicatore 【Color?】", + "【backgroundColor】: Colore di sfondo 【Color?】", + "【labelType】: Stile dell'etichetta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Stile dell'icona selezionata 【IconThemeData?】", + "【unselectedIconTheme】: Stile dell'icona non selezionata 【IconThemeData?】", + "【selectedLabelTextStyle】: Stile del testo selezionato 【TextStyle?】", + "【unselectedLabelTextStyle】: Stile del testo non selezionato 【TextStyle?】", + "【minExtendedWidth】: Larghezza espansa 【double?】", + "【minWidth】: Larghezza non espansa 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json new file mode 100644 index 00000000..81addefb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "サイドバーナビゲーション", + "info": "サイドナビゲーションバーは、通常デスクトップのナビゲーションメニューに使用されます。展開と収縮の領域をサポートし、最初と最後の位置のコンポーネントを指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 基本使用", + "desc": [ + "【destinations】 : メニューデータリスト 【List】", + "【selectedIndex】: アクティブインデックス 【int】", + "【labelType】: ラベルスタイル 【NavigationRailLabelType?】", + "【onDestinationSelected】: メニュークリックイベント 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 折りたたみ効果", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【leading】: 最初のコンポーネント 【Widget?】", + "【trailing】: 最後のコンポーネント 【Widget?】", + "【extended】: 展開するかどうか 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail スタイル", + "desc": [ + "【useIndicator】 : インジケーターを表示するかどうか 【bool】", + "【indicatorColor】: インジケーターの色 【Color?】", + "【backgroundColor】: 背景色 【Color?】", + "【labelType】: ラベルスタイル 【NavigationRailLabelType?】", + "【selectedIconTheme】: 選択されたアイコンのスタイル 【IconThemeData?】", + "【unselectedIconTheme】: 選択されていないアイコンのスタイル 【IconThemeData?】", + "【selectedLabelTextStyle】: 選択されたテキストのスタイル 【TextStyle?】", + "【unselectedLabelTextStyle】: 選択されていないテキストのスタイル 【TextStyle?】", + "【minExtendedWidth】: 展開幅 【double?】", + "【minWidth】: 未展開幅 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json new file mode 100644 index 00000000..351ea2c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "사이드바 내비게이션", + "info": "사이드 내비게이션 바, 일반적으로 데스크톱 내비게이션 메뉴에 사용됩니다. 확장 및 축소 영역을 지원하며, 처음과 끝 위치 컴포넌트를 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 기본 사용법", + "desc": [ + "【destinations】 : 메뉴 데이터 리스트 【List】", + "【selectedIndex】: 활성화 인덱스 【int】", + "【labelType】: 라벨 스타일 【NavigationRailLabelType?】", + "【onDestinationSelected】: 메뉴 클릭 이벤트 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 접힘 효과", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【leading】: 처음 컴포넌트 【Widget?】", + "【trailing】: 끝 컴포넌트 【Widget?】", + "【extended】: 확장 여부 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail 스타일", + "desc": [ + "【useIndicator】 : 인디케이터 표시 여부 【bool】", + "【indicatorColor】: 인디케이터 색상 【Color?】", + "【backgroundColor】: 배경색 【Color?】", + "【labelType】: 라벨 스타일 【NavigationRailLabelType?】", + "【selectedIconTheme】: 선택된 아이콘 스타일 【IconThemeData?】", + "【unselectedIconTheme】: 선택되지 않은 아이콘 스타일 【IconThemeData?】", + "【selectedLabelTextStyle】: 선택된 텍스트 스타일 【TextStyle?】", + "【unselectedLabelTextStyle】: 선택되지 않은 텍스트 스타일 【TextStyle?】", + "【minExtendedWidth】: 확장된 너비 【double?】", + "【minWidth】: 확장되지 않은 너비 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json new file mode 100644 index 00000000..ae772d91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Barra de Navegação Lateral", + "info": "Barra de navegação lateral, geralmente usada para menus de navegação em desktop. Suporta áreas expansíveis e retráteis, com componentes especificáveis nas posições inicial e final.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NavigationRail", + "desc": [ + "【destinations】 : Lista de dados do menu 【List】", + "【selectedIndex】: Índice ativo 【int】", + "【labelType】: Estilo da etiqueta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento de clique no menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Efeito de Recolhimento do NavigationRail", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【leading】: Componente inicial 【Widget?】", + "【trailing】: Componente final 【Widget?】", + "【extended】: Expandido 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Estilo do NavigationRail", + "desc": [ + "【useIndicator】 : Mostrar indicador 【bool】", + "【indicatorColor】: Cor do indicador 【Color?】", + "【backgroundColor】: Cor de fundo 【Color?】", + "【labelType】: Estilo da etiqueta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Estilo do ícone selecionado 【IconThemeData?】", + "【unselectedIconTheme】: Estilo do ícone não selecionado 【IconThemeData?】", + "【selectedLabelTextStyle】: Estilo do texto selecionado 【TextStyle?】", + "【unselectedLabelTextStyle】: Estilo do texto não selecionado 【TextStyle?】", + "【minExtendedWidth】: Largura expandida 【double?】", + "【minWidth】: Largura não expandida 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json new file mode 100644 index 00000000..e9889ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Боковая навигация", + "info": "Боковая панель навигации, обычно используется для навигационного меню на рабочем столе. Поддерживает расширение и сворачивание области, можно указать компоненты в начале и конце.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NavigationRail", + "desc": [ + "【destinations】 : Список данных меню 【List】", + "【selectedIndex】: Активный индекс 【int】", + "【labelType】: Стиль метки 【NavigationRailLabelType?】", + "【onDestinationSelected】: Событие клика по меню 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Эффект сворачивания NavigationRail", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【leading】: Начальный компонент 【Widget?】", + "【trailing】: Конечный компонент 【Widget?】", + "【extended】: Развернуто ли 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Стиль NavigationRail", + "desc": [ + "【useIndicator】 : Показывать ли индикатор 【bool】", + "【indicatorColor】: Цвет индикатора 【Color?】", + "【backgroundColor】: Цвет фона 【Color?】", + "【labelType】: Стиль метки 【NavigationRailLabelType?】", + "【selectedIconTheme】: Стиль выбранной иконки 【IconThemeData?】", + "【unselectedIconTheme】: Стиль невыбранной иконки 【IconThemeData?】", + "【selectedLabelTextStyle】: Стиль выбранного текста 【TextStyle?】", + "【unselectedLabelTextStyle】: Стиль невыбранного текста 【TextStyle?】", + "【minExtendedWidth】: Ширина в развернутом состоянии 【double?】", + "【minWidth】: Ширина в свернутом состоянии 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json new file mode 100644 index 00000000..92520a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "侧栏导航", + "info": "侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 基本使用", + "desc": [ + "【destinations】 : 菜单数据列表 【List】", + "【selectedIndex】: 激活索引 【int】", + "【labelType】: 标签样式 【NavigationRailLabelType?】", + "【onDestinationSelected】: 菜单点击事件 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 折叠效果", + "desc": [ + "【elevation】 : 影深 【double】", + "【leading】: 首组件 【Widget?】", + "【trailing】: 尾组件 【Widget?】", + "【extended】: 是否展开 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail 样式", + "desc": [ + "【useIndicator】 : 是否显示指示器 【bool】", + "【indicatorColor】: 指示器颜色 【Color?】", + "【backgroundColor】: 背景色 【Color?】", + "【labelType】: 标签样式 【NavigationRailLabelType?】", + "【selectedIconTheme】: 选中图标样式 【IconThemeData?】", + "【unselectedIconTheme】: 未选中图标样式 【IconThemeData?】", + "【selectedLabelTextStyle】: 选中文字样式 【TextStyle?】", + "【unselectedLabelTextStyle】: 未选中文字样式 【TextStyle?】", + "【minExtendedWidth】: 展开宽度 【double?】", + "【minWidth】: 未展开宽度 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart new file mode 100644 index 00000000..b5c73260 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2022/7/23 +/// contact me by email 1981462002@qq.com + +class CustomNavigationRail extends StatefulWidget { + const CustomNavigationRail({Key? key}) : super(key: key); + + @override + State createState() => _CustomNavigationRailState(); +} + +class _CustomNavigationRailState extends State { + final PageController _controller = PageController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + _NavigationRailDemo( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), + ], + )) + ], + ), + ); + } + + void _onDestinationSelected(int value) { + _controller.jumpToPage(value); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} + +class _TestContent extends StatelessWidget { + final String content; + + const _TestContent({Key? key, required this.content}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + content, + style: const TextStyle(fontSize: 26), + )); + } +} + +class _NavigationRailDemo extends StatefulWidget { + final ValueChanged? onDestinationSelected; + + const _NavigationRailDemo({Key? key, this.onDestinationSelected}) + : super(key: key); + + @override + State<_NavigationRailDemo> createState() => _NavigationRailDemoState(); +} + +class _NavigationRailDemoState extends State<_NavigationRailDemo> { + int _selectIndex = 0; + + final List destinations = const [ + NavigationRailDestination( + icon: Icon(Icons.message_outlined), label: Text("消息")), + NavigationRailDestination( + icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), + NavigationRailDestination( + icon: Icon(Icons.book_outlined), label: Text("通讯录")), + NavigationRailDestination( + icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), + NavigationRailDestination( + icon: Icon(Icons.games_sharp), label: Text("工作台")), + NavigationRailDestination( + icon: Icon(Icons.calendar_month), label: Text("日历")) + ]; + + @override + Widget build(BuildContext context) { + return NavigationRail( + onDestinationSelected: _onDestinationSelected, + labelType: NavigationRailLabelType.all, + destinations: destinations, + selectedIndex: _selectIndex, + ); + } + + void _onDestinationSelected(int value) { + _selectIndex = value; + setState(() {}); + widget.onDestinationSelected?.call(value); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart new file mode 100644 index 00000000..0f3d350f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2022/7/23 +/// contact me by email 1981462002@qq.com + +class ExtendableNavigationRail extends StatefulWidget { + const ExtendableNavigationRail({Key? key}) : super(key: key); + + @override + State createState() => + _ExtendableNavigationRailState(); +} + +class _ExtendableNavigationRailState extends State { + final PageController _controller = PageController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + ExtendableNavigation( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), + ], + )) + ], + ), + ); + } + + void _onDestinationSelected(int value) { + _controller.jumpToPage(value); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} + +class _TestContent extends StatelessWidget { + final String content; + + const _TestContent({Key? key, required this.content}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + content, + style: const TextStyle(fontSize: 26), + )); + } +} + +class ExtendableNavigation extends StatefulWidget { + final ValueChanged? onDestinationSelected; + + const ExtendableNavigation({Key? key, this.onDestinationSelected}) + : super(key: key); + + @override + State createState() => _ExtendableNavigationState(); +} + +class _ExtendableNavigationState extends State { + int _selectIndex = 0; + bool _extended = false; + + final List destinations = const [ + NavigationRailDestination( + icon: Icon(Icons.message_outlined), label: Text("消息")), + NavigationRailDestination( + icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), + NavigationRailDestination( + icon: Icon(Icons.book_outlined), label: Text("通讯录")), + NavigationRailDestination( + icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), + NavigationRailDestination( + icon: Icon(Icons.games_sharp), label: Text("工作台")), + NavigationRailDestination( + icon: Icon(Icons.calendar_month), label: Text("日历")) + ]; + + Widget buildLeading() { + return GestureDetector( + onTap: _toggleExtended, + child: const Icon( + Icons.menu_open, + color: Colors.grey, + )); + } + + @override + Widget build(BuildContext context) { + return NavigationRail( + leading: buildLeading(), + extended: _extended, + elevation: 1, + trailing: const Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(bottom: 20.0), + child: FlutterLogo(), + ), + ), + ), + onDestinationSelected: _onDestinationSelected, + destinations: destinations, + selectedIndex: _selectIndex, + ); + } + + void _onDestinationSelected(int value) { + _selectIndex = value; + setState(() {}); + widget.onDestinationSelected?.call(value); + } + + void _toggleExtended() { + setState(() { + _extended = !_extended; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart new file mode 100644 index 00000000..fe234ed5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; + +// minWidth: 72, +// minExtendedWidth: 200 , +// unselectedIconTheme: const IconThemeData(color: textColor) , +// selectedIconTheme: const IconThemeData(color: activeColor) , +// unselectedLabelTextStyle: labelStyle, +// selectedLabelTextStyle: labelStyle, + +/// create by 张风捷特烈 on 2022/7/23 +/// contact me by email 1981462002@qq.com + +class DarkNavigationRail extends StatefulWidget { + const DarkNavigationRail({Key? key}) : super(key: key); + + @override + State createState() => _DarkNavigationRailState(); +} + +class _DarkNavigationRailState extends State { + final PageController _controller = PageController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + DarkExtendableNavigation( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), + ], + )) + ], + ), + ); + } + + void _onDestinationSelected(int value) { + _controller.jumpToPage(value); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } +} + +class _TestContent extends StatelessWidget { + final String content; + + const _TestContent({Key? key, required this.content}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + content, + style: const TextStyle(fontSize: 26), + )); + } +} + +class DarkExtendableNavigation extends StatefulWidget { + final ValueChanged? onDestinationSelected; + + const DarkExtendableNavigation({Key? key, this.onDestinationSelected}) + : super(key: key); + + @override + State createState() => + _DarkExtendableNavigationState(); +} + +class _DarkExtendableNavigationState extends State { + int _selectIndex = 0; + bool _extended = false; + + final List destinations = const [ + NavigationRailDestination( + icon: Icon(Icons.message_outlined), label: Text("消息")), + NavigationRailDestination( + icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), + NavigationRailDestination( + icon: Icon(Icons.book_outlined), label: Text("通讯录")), + NavigationRailDestination( + icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), + NavigationRailDestination( + icon: Icon(Icons.games_sharp), label: Text("工作台")), + NavigationRailDestination( + icon: Icon(Icons.calendar_month), label: Text("日历")) + ]; + + Widget buildLeading() { + return GestureDetector( + onTap: _toggleExtended, + child: const Icon( + Icons.menu_open, + color: Colors.grey, + )); + } + + @override + Widget build(BuildContext context) { + const Color textColor = Color(0xffcfd1d7); + const Color activeColor = Colors.white; + const TextStyle labelStyle = TextStyle(color: textColor, fontSize: 11); + + return NavigationRail( + leading: buildLeading(), + extended: _extended, + labelType: NavigationRailLabelType.none, + useIndicator: true, + indicatorColor: Colors.blue, + elevation: 1, + backgroundColor: const Color(0xff324465), + minWidth: 72, + minExtendedWidth: 200, + unselectedIconTheme: const IconThemeData(color: textColor), + selectedIconTheme: const IconThemeData(color: activeColor), + unselectedLabelTextStyle: labelStyle, + selectedLabelTextStyle: labelStyle, + trailing: const Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(bottom: 20.0), + child: FlutterLogo(), + ), + ), + ), + onDestinationSelected: _onDestinationSelected, + destinations: destinations, + selectedIndex: _selectIndex, + ); + } + + void _onDestinationSelected(int value) { + _selectIndex = value; + setState(() {}); + widget.onDestinationSelected?.call(value); + } + + void _toggleExtended() { + setState(() { + _extended = !_extended; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json new file mode 100644 index 00000000..3f97142a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigator", + "info": "Der Navigator verwaltet eine Gruppe von Unterkomponenten nach Stack-Regeln, kann Unterkomponenten ein- und ausblenden und Ereignisse beim Ein- und Ausstapeln überwachen. Die Routenverwaltung von MaterialApp basiert auf dem Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Navigators", + "desc": [ + "【initialRoute】: Anfangsroute 【String】", + "【onGenerateRoute】: Routengenerator 【RouteFactory】", + "【observers】: Routenbeobachter 【List】", + "【onPopPage】: Rückruf beim Entfernen aus dem Stack 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json new file mode 100644 index 00000000..b36e3220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigator", + "info": "The Navigator manages a group of child components using stack rules, allowing child components to be pushed and popped, and listening to stack events. The origin of MaterialApp's route management is the use of Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Navigator", + "desc": [ + "【initialRoute】: Initial display route 【String】", + "【onGenerateRoute】: Route generator 【RouteFactory】", + "【observers】: Route observers 【List】", + "【onPopPage】: Pop page callback 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json new file mode 100644 index 00000000..d3006b1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navegador", + "info": "Navigator gestiona un grupo de componentes secundarios utilizando reglas de pila, permitiendo empujar y sacar componentes secundarios, así como escuchar eventos de entrada y salida de la pila. La gestión de rutas de MaterialApp se basa en el uso de Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Navigator", + "desc": [ + "【initialRoute】 : Ruta inicial 【String】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【observers】 : Observador de rutas 【List】", + "【onPopPage】 : Callback de salida de pila 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json new file mode 100644 index 00000000..86704356 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigateur", + "info": "Navigator gère un ensemble de composants enfants en utilisant des règles de pile, permettant de pousser et de retirer des composants enfants ainsi que d'écouter les événements d'entrée et de sortie de la pile. La gestion des routes de MaterialApp est fondamentalement basée sur l'utilisation de Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Navigator", + "desc": [ + "【initialRoute】 : Route initiale 【String】", + "【onGenerateRoute】 : Générateur de route 【RouteFactory】", + "【observers】 : Observateur de route 【List】", + "【onPopPage】 : Rappel de sortie de pile 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json new file mode 100644 index 00000000..713fe080 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigatore", + "info": "Navigator gestisce un gruppo di componenti figli utilizzando regole di stack, può spingere e rimuovere componenti figli e monitorare gli eventi di entrata e uscita dallo stack. La gestione delle route di MaterialApp si basa sull'uso di Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Navigator", + "desc": [ + "【initialRoute】 : Route iniziale 【String】", + "【onGenerateRoute】 : Generatore di route 【RouteFactory】", + "【observers】 : Osservatori di route 【List】", + "【onPopPage】 : Callback di rimozione dallo stack 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json new file mode 100644 index 00000000..8d9747e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "ナビゲーター", + "info": "Navigatorはスタックルールを使用して一連の子コンポーネントを管理し、子コンポーネントを切り替えたり、スタックの出入りイベントを監視したりすることができます。MaterialAppのルート管理の根源はNavigatorを使用しています。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigatorの基本使用方法", + "desc": [ + "【initialRoute】 : 最初に表示されるルート 【String】", + "【onGenerateRoute】 : ルートジェネレーター 【RouteFactory】", + "【observers】 : ルートオブザーバー 【List】", + "【onPopPage】 : スタックから出るコールバック 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json new file mode 100644 index 00000000..b84707be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "네비게이터", + "info": "Navigator는 스택 규칙을 사용하여 자식 위젯 그룹을 관리하며, 자식 위젯을 푸시하고 팝하며 스택 이벤트를 수신할 수 있습니다. MaterialApp의 라우팅 관리의 근원은 Navigator를 사용한 것입니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigator 기본 사용법", + "desc": [ + "【initialRoute】 : 초기 표시 라우트 【String】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【observers】 : 라우트 리스너 【List】", + "【onPopPage】 : 팝 콜백 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json new file mode 100644 index 00000000..16934999 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navegador", + "info": "O Navigator gere um grupo de componentes filhos usando regras de pilha, podendo empurrar e retirar componentes filhos, bem como monitorar eventos de entrada e saída da pilha. A gestão de rotas do MaterialApp baseia-se no uso do Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Navigator", + "desc": [ + "【initialRoute】 : Rota inicial 【String】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【observers】 : Observador de rotas 【List】", + "【onPopPage】 : Callback de saída da pilha 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json new file mode 100644 index 00000000..fcf4be64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Навигатор", + "info": "Navigator управляет группой дочерних компонентов по правилам стека, может добавлять и удалять дочерние компоненты, а также отслеживать события входа и выхода из стека. Источник управления маршрутами MaterialApp использует Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Navigator", + "desc": [ + "【initialRoute】 : Первоначальный маршрут отображения 【String】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【observers】 : Наблюдатели маршрутов 【List】", + "【onPopPage】 : Обратный вызов выхода из стека 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json new file mode 100644 index 00000000..f350eeb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "导航器", + "info": "Navigator用堆栈规则管理一组子组件,可以将子组件切入弹出及监听出入栈事件。MaterialApp路由管理的本源就是使用了Navigator。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigator基本用法", + "desc": [ + "【initialRoute】 : 最初显示路由 【String】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【observers】 : 路由监听器 【List】", + "【onPopPage】 : 出栈回调 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart new file mode 100644 index 00000000..eb000b4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart @@ -0,0 +1,185 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/19 +/// contact me by email 1981462002@qq.com + +class NavigatorDemo extends StatelessWidget { + const NavigatorDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + width: 300, + child: Navigator( + onPopPage: _onPopPage, + initialRoute: '/home-content', + onGenerateRoute: _onGenerateRoute, + observers: [TolyNavigatorObservers()], + ), + ); + } + + Route _onGenerateRoute(RouteSettings settings) { + switch (settings.name) { + case '/home-content': + return MaterialPageRoute( + builder: (_) => const HomeContent(), settings: settings); + case "/red": + return MaterialPageRoute(builder: (_) => const RedPage(), settings: settings); + case "/yellow": + return MaterialPageRoute( + builder: (_) => const YellowPage(), settings: settings); + case "/green": + return MaterialPageRoute( + builder: (_) => const GreenPage(), settings: settings); + default: + return MaterialPageRoute( + builder: (_) => const HomeContent(), settings: settings); + } + } + + bool _onPopPage(Route route, result) { + print('----_onPopPage-----'); + return true; + } +} + +//路由监听器 +class TolyNavigatorObservers extends NavigatorObserver { + @override + void didPush(Route route, Route? previousRoute) { + print( + '--didPush:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); + } + + @override + void didStopUserGesture() { + print('--didStopUserGesture:--'); + } + + @override + void didStartUserGesture(Route route, Route? previousRoute) { + print( + '--didStartUserGesture:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); + } + + @override + void didReplace({Route? newRoute, Route? oldRoute}) { + print( + '--didReplace:--newRoute:--${newRoute?.settings}--oldRoute:--${oldRoute?.settings}'); + } + + @override + void didRemove(Route? route, Route? previousRoute) { + print( + '--didRemove:--route:--${route?.settings}--previousRoute:--${previousRoute?.settings}'); + } + + @override + void didPop(Route route, Route? previousRoute) { + print( + '--didPop:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); + } +} + +class HomeContent extends StatelessWidget { + const HomeContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.red, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + ), + child: const Text('to red'), + onPressed: () { + Navigator.pushNamed(context, '/red'); + }, + ), + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.yellow, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + ), + child: const Text('to yellow'), + onPressed: () { + Navigator.pushNamed(context, '/yellow'); + }, + ), + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.green, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + ), + child: const Text('to yellow'), + onPressed: () { + Navigator.pushNamed(context, '/green'); + }, + ) + ], + ), + ], + ); + } +} + +class RedPage extends StatelessWidget { + const RedPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("RedPage"), + ), + body: Container( + color: Colors.red, + ), + ); + } +} + +class YellowPage extends StatelessWidget { + const YellowPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("YellowPage"), + ), + body: Container( + color: Colors.yellow, + ), + ); + } +} + +class GreenPage extends StatelessWidget { + const GreenPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("GreenPage"), + ), + body: Container( + color: Colors.green, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json new file mode 100644 index 00000000..d0a10392 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Verschachtelte Scrollansicht", + "info": "Wird zur Behandlung des verschachtelten Scrollens mehrerer Ansichten verwendet. Es können Kopf, Scroll-Controller, Scrollrichtung usw. angegeben werden. Dabei muss der Körper eine scrollbare Komponente sein.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von NestedScrollView", + "desc": [ + "【controller】 : Scroll-Controller 【ScrollController】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Umgekehrt 【bool】", + "【physics】 : Scrollstil 【ScrollPhysics】", + "【dragStartBehavior】 : Startverhalten beim Ziehen 【DragStartBehavior】", + "【headerSliverBuilder】 : *Kopfkonstruktor 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Inhalt 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json new file mode 100644 index 00000000..e2f92a4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Nested Scroll View", + "info": "Used for handling nested scrolling of multiple views, can specify the header, scroll controller, scroll direction, etc., where the body must be a scrollable type of component.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NestedScrollView", + "desc": [ + "【controller】 : Scroll Controller 【ScrollController】", + "【scrollDirection】 : Scroll Direction 【Axis】", + "【reverse】 : Whether to Reverse 【bool】", + "【physics】 : Scroll Physics 【ScrollPhysics】", + "【dragStartBehavior】 : Drag Start Behavior 【DragStartBehavior】", + "【headerSliverBuilder】 : *Header Builder 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Content 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json new file mode 100644 index 00000000..3650d963 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vista de desplazamiento anidada", + "info": "Utilizado para manejar el desplazamiento anidado de múltiples vistas, se puede especificar la cabecera, el controlador de desplazamiento, la dirección de desplazamiento, etc., donde el cuerpo debe ser un componente de tipo desplazable.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NestedScrollView", + "desc": [ + "【controller】 : Controlador de desplazamiento 【ScrollController】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Invertir 【bool】", + "【physics】 : Estilo de desplazamiento 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamiento de inicio de arrastre 【DragStartBehavior】", + "【headerSliverBuilder】 : *Constructor de cabecera 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenido 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json new file mode 100644 index 00000000..b2956b13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vue de défilement imbriquée", + "info": "Utilisé pour gérer le défilement imbriqué de plusieurs vues, peut spécifier l'en-tête, le contrôleur de défilement, la direction de défilement, etc., où le corps doit être un composant de type défilable.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NestedScrollView", + "desc": [ + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inverser 【bool】", + "【physics】 : Style de défilement 【ScrollPhysics】", + "【dragStartBehavior】 : Comportement de début de glissement 【DragStartBehavior】", + "【headerSliverBuilder】 : *Constructeur d'en-tête 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenu 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json new file mode 100644 index 00000000..ad1bc771 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vista di scorrimento annidata", + "info": "Utilizzato per gestire lo scorrimento annidato di più viste, è possibile specificare l'intestazione, il controller di scorrimento, la direzione di scorrimento, ecc., dove il corpo deve essere un componente di tipo scorrevole.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di NestedScrollView", + "desc": [ + "【controller】 : Controller di scorrimento 【ScrollController】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】", + "【physics】 : Stile di scorrimento 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamento di inizio trascinamento 【DragStartBehavior】", + "【headerSliverBuilder】 : *Costruttore di intestazione 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenuto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json new file mode 100644 index 00000000..73f25d98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "ネストされたスクロールビュー", + "info": "複数のビューのスクロールネスト処理に使用されます。ヘッダー、スクロールコントローラー、スクロール方向などを指定できます。bodyはスクロール可能なタイプのコンポーネントでなければなりません。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewの基本使い方", + "desc": [ + "【controller】 : スクロールコントローラー 【ScrollController】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向かどうか 【bool】", + "【physics】 : スクロールスタイル 【ScrollPhysics】", + "【dragStartBehavior】 : ドラッグ開始動作 【DragStartBehavior】", + "【headerSliverBuilder】 : *ヘッダービルダー 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *コンテンツ 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json new file mode 100644 index 00000000..de4bdc44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "중첩 스크롤 뷰", + "info": "여러 뷰의 스크롤 중첩 처리를 위해 사용되며, 헤더, 스크롤 컨트롤러, 스크롤 방향 등을 지정할 수 있습니다. 이때 body는 반드시 스크롤 가능한 타입의 컴포넌트여야 합니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollView 기본 사용법", + "desc": [ + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 역방향 여부 【bool】", + "【physics】 : 스크롤 스타일 【ScrollPhysics】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【headerSliverBuilder】 : *헤더 빌더 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *내용 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json new file mode 100644 index 00000000..183b3307 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Visão de Rolagem Aninhada", + "info": "Usado para o tratamento de rolagem aninhada de várias visualizações, pode especificar o cabeçalho, controlador de rolagem, direção de rolagem, etc., onde o corpo deve ser um componente do tipo rolável.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NestedScrollView", + "desc": [ + "【controller】 : Controlador de Rolagem 【ScrollController】", + "【scrollDirection】 : Direção de Rolagem 【Axis】", + "【reverse】 : Inverter 【bool】", + "【physics】 : Estilo de Rolagem 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamento de Início de Arrasto 【DragStartBehavior】", + "【headerSliverBuilder】 : *Construtor de Cabeçalho 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Conteúdo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json new file mode 100644 index 00000000..10f3aa2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Вложенное прокручиваемое представление", + "info": "Используется для обработки вложенной прокрутки нескольких представлений, можно указать заголовок, контроллер прокрутки, направление прокрутки и т.д., где тело должно быть компонентом с возможностью прокрутки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NestedScrollView", + "desc": [ + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【bool】", + "【physics】 : Стиль прокрутки 【ScrollPhysics】", + "【dragStartBehavior】 : Поведение начала перетаскивания 【DragStartBehavior】", + "【headerSliverBuilder】 : *Конструктор заголовка 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Содержимое 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json new file mode 100644 index 00000000..30e70e89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "嵌套滑动视图", + "info": "用于多个视图滑动嵌套处理,可以指定头部、滑动控制器、滑动方向等,其中body必须是可滑动类型的组件。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollView基本用法", + "desc": [ + "【controller】 : 滑动控制器 【ScrollController】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】", + "【physics】 : 滑顶样式 【ScrollPhysics】", + "【dragStartBehavior】 : 开始拖动行为 【DragStartBehavior】", + "【headerSliverBuilder】 : *头部构造器 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *内容 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart new file mode 100644 index 00000000..d49d94ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/6/16 +/// contact me by email 1981462002@qq.com + + +class NestedScrollViewDemo extends StatelessWidget { + final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; + + const NestedScrollViewDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 200, + child: Scaffold( + body: DefaultTabController( + length: _tabs.length, + child: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar( + title: const Text('旷古奇书'), + pinned: true, + elevation: 6, //影深 + expandedHeight: 220.0, + forceElevated: innerBoxIsScrolled, //为true时展开有阴影 + flexibleSpace: FlexibleSpaceBar( + background: Image.asset( + "assets/images/wy_300x200_filter.webp", + fit: BoxFit.cover, + ), + ), + bottom: TabBar( + tabs: _tabs + .map((String name) => Tab(text: name,)) + .toList(), + ), + ), + ), + ]; + }, + body: _buildTabBarView(), + ), + ), + )); + } + + Widget _buildTabBarView() { + return TabBarView( + children: _tabs.map((String name) { + return SafeArea( + top: false, + bottom: false, + child: Builder( + builder: (BuildContext context) { + return CustomScrollView( + key: PageStorageKey(name), + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + ), + SliverPadding( + padding: const EdgeInsets.all(8.0), + sliver: SliverFixedExtentList( + itemExtent: 48.0, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + title: Text('《$name》 第 $index章'), + ); + }, + childCount: 50, + ), + ), + ), + ], + ); + }, + ), + ); + }).toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json new file mode 100644 index 00000000..26c0e4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Umrandeter Button", + "info": "Material-stilisiertes Schaltflächenelement mit Rahmen, ähnlich wie OutlineButton. Attribute wie Rahmen, Farbe, Schatten usw. können über Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OutlinedButton", + "desc": [ + "【child】 : Schaltflächeninhalt 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langdrückereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil von OutlinedButton", + "desc": [ + "【style】 : Schaltflächenstil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json new file mode 100644 index 00000000..01a2b1ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Outlined Button", + "info": "A Material-style outlined button, similar in behavior to OutlineButton. Properties such as border, color, and shadow can be changed through styling.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OutlinedButton", + "desc": [ + "【child】: Button content 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onLongPress】: Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton Style", + "desc": [ + "【style】: Button style 【ButtonStyle】", + "【focusNode】: Focus 【FocusNode】", + "【clipBehavior】: Clip behavior 【Clip】", + "【autofocus】: Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json new file mode 100644 index 00000000..567b7f31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Botón con borde", + "info": "Botón de estilo Material con borde, similar a OutlineButton. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., mediante estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OutlinedButton", + "desc": [ + "【child】 : Contenido del botón 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación prolongada 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de OutlinedButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json new file mode 100644 index 00000000..143ee767 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Bouton bordé", + "info": "Bouton de style Material avec bordure, similaire à OutlineButton. Les propriétés telles que la bordure, la couleur, l'ombre, etc., peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de OutlinedButton", + "desc": [ + "【child】 : Contenu du bouton 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de pression longue 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style de OutlinedButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json new file mode 100644 index 00000000..e0e9e975 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Pulsante con bordo", + "info": "Pulsante in stile Material con bordo, simile a OutlineButton. È possibile modificare proprietà come il bordo, il colore, l'ombra, ecc. tramite lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di OutlinedButton", + "desc": [ + "【child】 : Contenuto del pulsante 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di OutlinedButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json new file mode 100644 index 00000000..04a4e01d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "枠線ボタン", + "info": "Materialスタイルの枠線ボタンで、OutlineButtonと同様の動作をします。スタイルを変更して、枠線、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButtonの基本使用", + "desc": [ + "【child】 : ボタンの内容 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json new file mode 100644 index 00000000..08ef6379 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "테두리 버튼", + "info": "Material 스타일의 테두리 버튼으로, OutlineButton과 유사하게 동작합니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButton 기본 사용법", + "desc": [ + "【child】 : 버튼 내용 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json new file mode 100644 index 00000000..c744c26f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Botão com Contorno", + "info": "Botão com contorno no estilo Material, semelhante ao OutlineButton. Pode alterar propriedades como contorno, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do OutlinedButton", + "desc": [ + "【child】 : Conteúdo do botão 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressionar longo 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do OutlinedButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json new file mode 100644 index 00000000..c6dbfa19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Кнопка с контуром", + "info": "Кнопка в стиле Material с контуром, аналогичная OutlineButton. Свойства, такие как контур, цвет, тень, могут быть изменены через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OutlinedButton", + "desc": [ + "【child】 : Содержимое кнопки 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие длительного нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль OutlinedButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json new file mode 100644 index 00000000..6c10b7c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "边框按钮", + "info": "Material风格的边线按钮,表现和 OutlineButton 类似。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButton基本使用", + "desc": [ + "【child】 : 按钮内容 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart new file mode 100644 index 00000000..01e46cec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class OutlinedButtonDemo extends StatelessWidget { + const OutlinedButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + height: 60, + child: Wrap( + spacing: 20, + children: [ + OutlinedButton( + child: const Text('OutlinedButton'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + const OutlinedButton( + child: Text('禁用按钮'), + onPressed: null, + onLongPress: null, + ), + ], + )); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart new file mode 100644 index 00000000..3564a741 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class OutlinedButtonStyleDemo extends StatelessWidget { + const OutlinedButtonStyleDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + child: Wrap( + spacing: 10, + children: [ + OutlinedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.orange, + foregroundColor: Colors.white, + elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('ElevatedButton样式'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + OutlinedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + side: const BorderSide(color: Colors.blue,width: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)) + ), + // elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('ElevatedButton边线'), + autofocus: false, + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + ], + ), + ); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json new file mode 100644 index 00000000..4a34c1f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Schwebende Komponente", + "info": "Ermöglicht die schwebende Anzeige von Komponenten in der gesamten Anwendung, Komponenten können hinzugefügt oder entfernt werden, sie haben einen unabhängig verwalteten Stack.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Overlay", + "desc": [ + "Overlay.of(context).insert fügt eine globale Komponente ein" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json new file mode 100644 index 00000000..57430ba3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Floating Component", + "info": "Can display components in a floating manner across the entire application, allowing components to be added or removed, with an independently managed stack.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Overlay", + "desc": [ + "Overlay.of(context).insert inserts a global component" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json new file mode 100644 index 00000000..61645ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Flotante", + "info": "Permite mostrar componentes de forma flotante en toda la aplicación, se pueden agregar o eliminar componentes, tienen una pila gestionada de forma independiente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de Overlay", + "desc": [ + "Overlay.of(context).insert inserta un componente global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json new file mode 100644 index 00000000..811e9797 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Composant flottant", + "info": "Permet d'afficher un composant en mode flottant dans toute l'application, peut ajouter ou supprimer des composants, ils ont une pile gérée indépendamment.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Overlay", + "desc": [ + "Overlay.of(context).insert insère un composant global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json new file mode 100644 index 00000000..8cd793ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Sovrapposto", + "info": "Consente di visualizzare i componenti in sovrapposizione su tutta l'applicazione, aggiungere o rimuovere componenti, che hanno una pila gestita in modo indipendente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Overlay", + "desc": [ + "Overlay.of(context).insert inserisce un componente globale" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json new file mode 100644 index 00000000..8aa728b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "フローティングコンポーネント", + "info": "コンポーネントをアプリ全体でフローティング表示することができ、コンポーネントを追加または削除することができます。これらは独立して管理されるスタックを持っています。", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlayの基本使用", + "desc": [ + "Overlay.of(context).insertでグローバルコンポーネントを挿入" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json new file mode 100644 index 00000000..9fd065af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "플로팅 컴포넌트", + "info": "컴포넌트를 전체 애플리케이션에서 플로팅으로 표시할 수 있으며, 컴포넌트를 추가하거나 제거할 수 있고, 독립적으로 관리되는 스택을 가집니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlay 기본 사용법", + "desc": [ + "Overlay.of(context).insert로 전역 컴포넌트 삽입" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json new file mode 100644 index 00000000..0c59436b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Flutuante", + "info": "Permite exibir componentes de forma flutuante em toda a aplicação, podendo adicionar ou remover componentes, eles têm uma pilha de gerenciamento independente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Overlay", + "desc": [ + "Overlay.of(context).insert insere um componente global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json new file mode 100644 index 00000000..6e3895e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Плавающий компонент", + "info": "Позволяет отображать компоненты поверх всего приложения, добавлять или удалять компоненты, они имеют независимо управляемый стек.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Overlay", + "desc": [ + "Overlay.of(context).insert вставляет глобальный компонент" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json new file mode 100644 index 00000000..a582e71e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "悬浮组件", + "info": "可以将组件在全应用中进行悬浮显示,能够添加或移除组件,它们有独立管理的栈。", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlay基本使用", + "desc": [ + "Overlay.of(context).insert插入全局组件" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart new file mode 100644 index 00000000..54d8d481 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + + +class CustomOverlay extends StatelessWidget { + const CustomOverlay({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + SizedBox( + height: 50, + child: RawMaterialButton( + elevation: 2, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + fillColor: Colors.blue, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + child: const Icon(Icons.add), + onPressed: ()=>showFloating(context), + ), + ), + const SizedBox( + height: 50, + child: RawMaterialButton( + elevation: 2, + shape: CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + fillColor: Colors.red, + splashColor: Colors.orange, + textStyle: TextStyle(color: Colors.white), + child: Icon(Icons.remove), + onPressed: hideFloating, + ), + ), + ], + ); + } +} + +bool show = false; +Offset offset = const Offset(200, 200); + +const double radius = 60; + +var entry = OverlayEntry( + builder: (context) => Stack( + children: [ + Positioned( + left: offset.dx, + top: offset.dy, + child: _buildFloating(), + ), + ], + )); + +///绘制悬浮控件 +_buildFloating() => GestureDetector( + onPanDown: (details) { + offset = details.globalPosition - const Offset(radius / 2, radius / 2); + entry.markNeedsBuild(); + }, + onPanUpdate: (DragUpdateDetails details) { + offset = offset + details.delta; + entry.markNeedsBuild(); + }, + onLongPress: hideFloating, + child: Material( + color: Colors.transparent, + child: Container( + height: radius, + width: radius, + alignment: Alignment.center, + decoration: const BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: AssetImage('assets/images/icon_head.webp')), + ), + ), + )); + +showFloating(BuildContext context) { + if (!show) { + Overlay.of(context)?.insert(entry); + show = true; + } +} + +hideFloating() { + if (show) { + entry.remove(); + show = false; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json new file mode 100644 index 00000000..3199650a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Swipe-Seite", + "info": "Enthält mehrere Komponentenseiten, zwischen denen durch Wischen gewechselt werden kann. Es können Attribute wie Wischrichtung, ob umgekehrt, Wischcontroller usw. angegeben werden.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PageView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【onPageChanged】 : Klickereignis 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Wischrichtung von PageView", + "desc": [ + "【scrollDirection】 : Wischrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Einfache Verwendung des PageView-Controllers", + "desc": [ + "【controller】 : Seitencontroller 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json new file mode 100644 index 00000000..f886e9db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Swipe Page", + "info": "It can accommodate multiple component pages, and you can swipe to switch between them. You can specify properties such as the direction of the swipe, whether it is reversed, and the swipe controller.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PageView", + "desc": [ + "【children】 : List of child components 【List】", + "【onPageChanged】 : Click event 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Swipe Direction of PageView", + "desc": [ + "【scrollDirection】 : Swipe direction 【Axis】", + "【reverse】 : Whether to reverse 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Simple Use of PageView Controller", + "desc": [ + "【controller】 : Page controller 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json new file mode 100644 index 00000000..a1c21840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Deslizar página", + "info": "Contiene múltiples páginas de componentes, permite cambiar entre ellas deslizando, y se pueden especificar propiedades como la dirección del deslizamiento, si es inverso, el controlador de deslizamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PageView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【onPageChanged】 : Evento de clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de deslizamiento de PageView", + "desc": [ + "【scrollDirection】 : Dirección de deslizamiento 【Axis】", + "【reverse】 : Si es inverso 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso simple del controlador de PageView", + "desc": [ + "【controller】 : Controlador de página 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json new file mode 100644 index 00000000..3463d157 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Glissement de page", + "info": "Contient plusieurs pages de composants, permet de les faire glisser pour les changer, et permet de spécifier la direction du glissement, l'inversion, le contrôleur de glissement, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PageView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【onPageChanged】 : Événement de clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de glissement de PageView", + "desc": [ + "【scrollDirection】 : Direction de glissement 【Axis】", + "【reverse】 : Inversion 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Utilisation simple du contrôleur de PageView", + "desc": [ + "【controller】 : Contrôleur de page 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json new file mode 100644 index 00000000..385a3183 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Scorrimento Pagina", + "info": "Contiene più componenti di pagina, consente di scorrere tra di essi, è possibile specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PageView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【onPageChanged】 : Evento di clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di PageView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso semplice del controller di PageView", + "desc": [ + "【controller】 : Controller della pagina 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json new file mode 100644 index 00000000..7741210a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "スワイプページ", + "info": "複数のコンポーネントページを収容し、それらをスワイプして切り替えることができます。スワイプの方向、逆方向にするかどうか、スワイプコントローラーなどの属性を指定できます。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【onPageChanged】 : クリックイベント 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageViewのスワイプ方向", + "desc": [ + "【scrollDirection】 : スワイプ方向 【Axis】", + "【reverse】 : 逆方向にするかどうか 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageViewコントローラーの簡単な使用", + "desc": [ + "【controller】 : ページコントローラー 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json new file mode 100644 index 00000000..345c08ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "스와이프 페이지", + "info": "여러 컴포넌트 페이지를 수용하며, 슬라이딩 전환을 할 수 있습니다. 슬라이딩 방향, 역방향 여부, 슬라이딩 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageView 기본 사용법", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【List】", + "【onPageChanged】 : 클릭 이벤트 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageView 슬라이딩 방향", + "desc": [ + "【scrollDirection】 : 슬라이딩 방향 【Axis】", + "【reverse】 : 역방향 여부 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageView 컨트롤러 간단 사용법", + "desc": [ + "【controller】 : 페이지 컨트롤러 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json new file mode 100644 index 00000000..e9da0fde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Deslizar Página", + "info": "Acomoda várias páginas de componentes, permite alternar entre elas deslizando, pode especificar a direção do deslize, se é reverso, controlador de deslize e outras propriedades.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do PageView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【onPageChanged】 : Evento de clique 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de deslize do PageView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se é reverso 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso simples do controlador do PageView", + "desc": [ + "【controller】 : Controlador de página 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json new file mode 100644 index 00000000..521e3d14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Скользящая страница", + "info": "Содержит несколько компонентов страниц, позволяет переключаться между ними с помощью скольжения, можно указать направление скольжения, обратное направление, контроллер скольжения и другие свойства.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PageView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【onPageChanged】 : Событие клика 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление скольжения PageView", + "desc": [ + "【scrollDirection】 : Направление скольжения 【Axis】", + "【reverse】 : Обратное направление 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Простое использование контроллера PageView", + "desc": [ + "【controller】 : Контроллер страницы 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json new file mode 100644 index 00000000..de89d037 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "滑页", + "info": "容纳多个组件页面,可对它们进行滑动切换,可指定滑动的方向、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【onPageChanged】 : 点击事件 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageView控制器简单实用", + "desc": [ + "【controller】 : 页面控制器 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart new file mode 100644 index 00000000..8d046efa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-28 +/// contact me by email 1981462002@qq.com + +class CustomPageView extends StatelessWidget { + const CustomPageView({super.key}); + + List get data => [ + Colors.green[50]!, + Colors.green[100]!, + Colors.green[200]!, + Colors.green[300]!, + Colors.green[400]!, + Colors.green[500]!, + Colors.green[600]!, + Colors.green[700]!, + Colors.green[800]!, + Colors.green[900]!, + ]; + + TextStyle get textStyle => + const TextStyle(color: Colors.white, fontSize: 24, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ), + ]); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 150, + child: PageView( + onPageChanged: (position) => print(position), + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 90, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart new file mode 100644 index 00000000..95139a7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-28 +/// contact me by email 1981462002@qq.com + +class DirectionPageView extends StatelessWidget { + const DirectionPageView({super.key}); + + List get data => [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + TextStyle get textStyle => + const TextStyle(color: Colors.white, fontSize: 24, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ), + ]); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 150, + child: PageView( + scrollDirection: Axis.vertical, + reverse: true, + onPageChanged: (position) { + print(position); + }, + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 90, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart new file mode 100644 index 00000000..c7e0d62a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-28 +/// contact me by email 1981462002@qq.com + +class CtrlPageView extends StatefulWidget { + const CtrlPageView({Key? key}) : super(key: key); + + @override + _CtrlPageViewState createState() => _CtrlPageViewState(); +} + +class _CtrlPageViewState extends State { + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + ]; + + late PageController _controller; + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + _controller=PageController( + viewportFraction: 0.8, + initialPage: (data.length/2).round() + ); + } + TextStyle get textStyle => + const TextStyle(color: Colors.white, fontSize: 24, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ), + ]); + @override + Widget build(BuildContext context) { + return SizedBox( + height: 150, + child: PageView( + controller: _controller, + onPageChanged: (position) { + print(position); + }, + children: data + .map((color) => + Container( + alignment: Alignment.center, + width: 90, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json new file mode 100644 index 00000000..9f7f1ee8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Seitenweise Tabelle", + "info": "Eine funktionsreiche, seitenweise Tabellenkomponente, die die Seitenzahl, Sortierung und das Wechseln zwischen den Seiten ermöglicht.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von PaginatedDataTable", + "desc": [ + "【header】 : Tabellenname 【Widget】", + "【rowsPerPage】 : Anzahl der Datensätze pro Seite 【int】", + "【actions】 : Aktionskomponenten 【List】", + "【columns】 : Datenspalten 【List】", + "【sortColumnIndex】 : Index der Sortierspalte 【int】", + "【sortAscending】 : Aufsteigend sortieren 【bool】", + "【onSelectAll】 : Rückruf für Alle auswählen 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener für Seitenänderungen 【ValueChanged】", + "【availableRowsPerPage】 : Verfügbare Seitenlisten 【List】", + "【source】 : Datenquelle 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json new file mode 100644 index 00000000..add38363 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Paginated Table", + "info": "A feature-rich paginated table component that allows specifying the number of pages, sorting, and switching between pages.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable Usage", + "desc": [ + "【header】 : Table Name 【Widget】", + "【rowsPerPage】 : Number of records per page 【int】", + "【actions】 : Action components 【List】", + "【columns】 : Data columns 【List】", + "【sortColumnIndex】 : Sort column index 【int】", + "【sortAscending】 : Whether ascending 【bool】", + "【onSelectAll】 : Select all callback 【ValueSetter】", + "【onRowsPerPageChanged】 : Page change listener 【ValueChanged】", + "【availableRowsPerPage】 : Available page list 【List】", + "【source】 : Data source 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json new file mode 100644 index 00000000..96607e25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabla Paginada", + "info": "Un componente de tabla paginada rico en funciones, que permite especificar el número de páginas, el orden, y la navegación entre páginas.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de PaginatedDataTable", + "desc": [ + "【header】 : Nombre de la tabla 【Widget】", + "【rowsPerPage】 : Número de registros por página 【int】", + "【actions】 : Componentes de acción 【List】", + "【columns】 : Columnas de datos 【List】", + "【sortColumnIndex】 : Índice de la columna de ordenación 【int】", + "【sortAscending】 : Orden ascendente 【bool】", + "【onSelectAll】 : Callback de selección total 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener de cambio de paginación 【ValueChanged】", + "【availableRowsPerPage】 : Lista de paginación disponible 【List】", + "【source】 : Fuente de datos 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json new file mode 100644 index 00000000..43e77c18 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tableau paginé", + "info": "Un composant de tableau paginé riche en fonctionnalités, permettant de spécifier le nombre de pages, le tri, et la navigation entre les pages.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de PaginatedDataTable", + "desc": [ + "【header】 : Nom du tableau 【Widget】", + "【rowsPerPage】 : Nombre d'enregistrements par page 【int】", + "【actions】 : Composants d'action 【List】", + "【columns】 : Colonnes de données 【List】", + "【sortColumnIndex】 : Index de la colonne de tri 【int】", + "【sortAscending】 : Ordre croissant 【bool】", + "【onSelectAll】 : Rappel de sélection totale 【ValueSetter】", + "【onRowsPerPageChanged】 : Écouteur de changement de pagination 【ValueChanged】", + "【availableRowsPerPage】 : Liste des paginations disponibles 【List】", + "【source】 : Source de données 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json new file mode 100644 index 00000000..47a368e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabella Paginabile", + "info": "Un componente di tabella ricco di funzionalità, con paginazione, ordinamento e navigazione tra le pagine.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di PaginatedDataTable", + "desc": [ + "【header】 : Nome della tabella 【Widget】", + "【rowsPerPage】 : Numero di record per pagina 【int】", + "【actions】 : Componenti di azione 【List】", + "【columns】 : Colonne dei dati 【List】", + "【sortColumnIndex】 : Indice della colonna di ordinamento 【int】", + "【sortAscending】 : Ordinamento crescente 【bool】", + "【onSelectAll】 : Callback per la selezione di tutti 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener per il cambio della paginazione 【ValueChanged】", + "【availableRowsPerPage】 : Lista delle paginazioni disponibili 【List】", + "【source】 : Fonte dei dati 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json new file mode 100644 index 00000000..4485ba4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "ページネーション可能なテーブル", + "info": "ページネーション数、並び替え、ページの前後切り替えを指定できる機能豊富なページネーション可能なテーブルコンポーネント。", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable の使用", + "desc": [ + "【header】 : テーブル名 【Widget】", + "【rowsPerPage】 : 1ページあたりのレコード数 【int】", + "【actions】 : 操作コンポーネント 【List】", + "【columns】 : データ列 【List】", + "【sortColumnIndex】 : 並び替え列のインデックス 【int】", + "【sortAscending】 : 昇順かどうか 【bool】", + "【onSelectAll】 : 全選択コールバック 【ValueSetter】", + "【onRowsPerPageChanged】 : ページネーション変更リスナー 【ValueChanged】", + "【availableRowsPerPage】 : 利用可能なページネーションリスト 【List】", + "【source】 : データソース 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json new file mode 100644 index 00000000..ce3edafc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "페이지네이션 테이블", + "info": "기능이 풍부한 페이지네이션 테이블 컴포넌트로, 페이지 수, 정렬, 페이지 전환 등을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable 사용", + "desc": [ + "【header】 : 테이블 이름 【Widget】", + "【rowsPerPage】 : 페이지당 레코드 수 【int】", + "【actions】 : 액션 컴포넌트 【List】", + "【columns】 : 데이터 열 【List】", + "【sortColumnIndex】 : 정렬 열 인덱스 【int】", + "【sortAscending】 : 오름차순 여부 【bool】", + "【onSelectAll】 : 전체 선택 콜백 【ValueSetter】", + "【onRowsPerPageChanged】 : 페이지 변경 리스너 【ValueChanged】", + "【availableRowsPerPage】 : 사용 가능한 페이지 목록 【List】", + "【source】 : 데이터 소스 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json new file mode 100644 index 00000000..a3d105d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabela Paginada", + "info": "Um componente de tabela paginada rico em funcionalidades, que permite especificar o número de páginas, ordenação, e navegação entre páginas.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do PaginatedDataTable", + "desc": [ + "【header】 : Nome da tabela 【Widget】", + "【rowsPerPage】 : Número de registros por página 【int】", + "【actions】 : Componentes de ação 【List】", + "【columns】 : Colunas de dados 【List】", + "【sortColumnIndex】 : Índice da coluna de ordenação 【int】", + "【sortAscending】 : Ordenação ascendente 【bool】", + "【onSelectAll】 : Callback de seleção total 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener de mudança de paginação 【ValueChanged】", + "【availableRowsPerPage】 : Lista de paginação disponível 【List】", + "【source】 : Fonte de dados 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json new file mode 100644 index 00000000..c64937f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Таблица с постраничной навигацией", + "info": "Многофункциональный компонент таблицы с постраничной навигацией, позволяющий указать количество страниц, сортировку и переключение между страницами.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование PaginatedDataTable", + "desc": [ + "【header】 : Название таблицы 【Widget】", + "【rowsPerPage】 : Количество записей на странице 【int】", + "【actions】 : Компоненты действий 【List】", + "【columns】 : Столбцы данных 【List】", + "【sortColumnIndex】 : Индекс столбца сортировки 【int】", + "【sortAscending】 : Сортировка по возрастанию 【bool】", + "【onSelectAll】 : Обратный вызов для выбора всех 【ValueSetter】", + "【onRowsPerPageChanged】 : Слушатель изменения страницы 【ValueChanged】", + "【availableRowsPerPage】 : Список доступных страниц 【List】", + "【source】 : Источник данных 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json new file mode 100644 index 00000000..2eeb0cf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "可分页表格", + "info": "一个功能丰富的可分页表格组件,可指定分页数、排列、页码前后切换。", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable 使用", + "desc": [ + "【header】 : 表名 【Widget】", + "【rowsPerPage】 : 每页记录数 【int】", + "【actions】 : 操作组件 【List】", + "【columns】 : 数据列 【List】", + "【sortColumnIndex】 : 排序列索引 【int】", + "【sortAscending】 : 是否升序 【bool】", + "【onSelectAll】 : 全选回调 【ValueSetter】", + "【onRowsPerPageChanged】 : 分页改变监听 【ValueChanged】", + "【availableRowsPerPage】 : 可用分页列表 【List】", + "【source】 : 数据源 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart new file mode 100644 index 00000000..622c38e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart @@ -0,0 +1,207 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class PaginatedDataTableDemo extends StatefulWidget { + const PaginatedDataTableDemo({Key? key}) : super(key: key); + + @override + State createState() => _PaginatedDataTableDemoState(); +} + +class _PaginatedDataTableDemoState extends State { + int _rowsPerPage = 5; + + int _sortColumnIndex = 0; + bool _sortAscending = true; + + final DessertDataSource _dessertsDataSource = DessertDataSource(); + + void sort( + Comparable Function(HeroInfo d) getField, + int columnIndex, + bool ascending, + ) { + _dessertsDataSource.sort(getField, ascending); + setState(() { + _sortColumnIndex = columnIndex; + _sortAscending = ascending; + }); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + width: 350, + child: SingleChildScrollView( + child: PaginatedDataTable( + actions: const [ + IconButton(icon: Icon(Icons.add), onPressed: null), + ], + header: const Text( + '《旷古奇书》-角色预设', + style: TextStyle(color: Colors.blue), + ), + rowsPerPage: _rowsPerPage, + availableRowsPerPage: const [5, 8, 10, 15], + onRowsPerPageChanged: (int? value) { + setState(() { + _rowsPerPage = value ?? 0; + }); + }, + sortColumnIndex: _sortColumnIndex, + sortAscending: _sortAscending, + onSelectAll: _dessertsDataSource._selectAll, + columns: [ + DataColumn( + label: const Text('角色名称'), + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.name, columnIndex, ascending)), + DataColumn( + label: const Text('主场卷部'), + tooltip: '人物主要出场的作品.', + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.calories, columnIndex, ascending)), + DataColumn( + label: const Text('种族'), + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.fat, columnIndex, ascending)), + DataColumn( + label: const Text('性别'), + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.carbs, columnIndex, ascending)), + ], + source: _dessertsDataSource), + )); + } +} + +class HeroInfo { + HeroInfo(this.name, this.calories, this.fat, this.carbs); + + final String name; + final String calories; + final String fat; + final String carbs; + bool selected = false; +} + +class DessertDataSource extends DataTableSource { + final List _desserts = [ + HeroInfo('捷特', '《幻将录》', "人族", "男"), + HeroInfo('龙少', '《幻将录》', "人族", "男"), + HeroInfo('巫缨', '《幻将录》', "人族", "女"), + HeroInfo('林兮', '《幻将录》', "人族", "男"), + HeroInfo('九方玄玉', '《风神传》', "神族", "男"), + HeroInfo('七日洪荒', '《风神传》', "魔族", "男"), + HeroInfo('林昔瑶', '《封妖志》', "鬼族", "女"), + HeroInfo('林兮鬼帝', '《封妖志》', "鬼族", "男"), + HeroInfo('艾隆', '《封妖志》', "鬼族", "男"), + HeroInfo('语熙华', '《风神传》', "道族", "男"), + HeroInfo('雪玉宛如', '《幻将录》', "人族", "女"), + HeroInfo('破千', '《幻将录》', "人族", "男"), + HeroInfo('浪封', '《幻将录》', "人族", "男"), + HeroInfo('虎翼穷奇', '《封妖志》', "妖族", "男"), + HeroInfo('凯', '《幻将录》', "人族", "男"), + HeroInfo('荆棘', '《幻将录》', "人族", "女"), + HeroInfo('龙右', '《幻将录》', "人族", "男"), + HeroInfo('梦千', '《幻将录》', "人族", "男"), + HeroInfo('梦小梦', '《幻将录》', "人族", "女"), + HeroInfo('梦瞳', '《幻将录》', "人族", "男"), + HeroInfo('十戈', '《幻将录》', "人族", "男"), + HeroInfo('计画天', '《幻将录》', "人族", "女"), + HeroInfo('士方', '《幻将录》', "人族", "男"), + HeroInfo('巫妻孋', '《幻将录》', "人族", "女"), + HeroInfo('木时黎', '《永恒传说》', "人族", "男"), + HeroInfo('木艾奇', '《永恒传说》', "人族", "男"), + HeroInfo('张风', '《永恒传说》', "人族", "男"), + HeroInfo('薛剑儿', '《永恒传说》', "人族", "男"), + HeroInfo('李月', '《永恒传说》', "人族", "女"), + HeroInfo('刘雪', '《永恒传说》', "人族", "女"), + HeroInfo('葛心', '《永恒传说》', "人族", "女"), + HeroInfo('步映容', '《幻将录》', "人族", "女"), + HeroInfo('莫慈良', '《幻将录》', "人族", "男"), + HeroInfo('莫向阳', '《幻将录》', "人族", "男"), + HeroInfo('莫子薇', '《永恒传说》', "人族", "女"), + HeroInfo('藏凯阳', '《永恒传说》', "人族", "男"), + HeroInfo('奇雨歆', '《永恒传说》', "人族", "女"), + HeroInfo('林天蕊', '《永恒传说》', "人族", "女"), + HeroInfo('吴灏然', '《永恒传说》', "人族", "男"), + HeroInfo('何解连', '《永恒传说》', "人族", "男"), + HeroInfo('步络尘', '《幻将录》', "人族", "男"), + HeroInfo('拓雷', '《幻将录》', "人族", "男"), + HeroInfo('炽阳骑', '《幻将录》', "人族", "男"), + HeroInfo('正构', '《幻将录》', "人族", "男"), + HeroInfo('烈', '《幻将录》', "人族", "男"), + HeroInfo('梦华君', '《幻将录》', "人族", "男"), + HeroInfo('初星', '《幻将录》', "人族", "男"), + HeroInfo('梦飞烟', '《幻将录》', "人族", "男"), + HeroInfo('武落英', '《幻将录》', "人族", "女"), + HeroInfo('古千缘', '《幻将录》', "人族", "男"), + ]; + + void sort( + Comparable Function(HeroInfo d) getField, + bool ascending, + ) { + _desserts.sort((HeroInfo a, HeroInfo b) { + if (!ascending) { + final HeroInfo c = a; + a = b; + b = c; + } + final Comparable aValue = getField(a); + final Comparable bValue = getField(b); + return Comparable.compare(aValue, bValue); + }); + notifyListeners(); + } + + int _selectedCount = 0; + + @override + DataRow? getRow(int index) { + if (index >= _desserts.length) return null; + final HeroInfo dessert = _desserts[index]; + return DataRow.byIndex( + index: index, + selected: dessert.selected, + onSelectChanged: (bool? value) { + if (dessert.selected != value && value != null) { + _selectedCount += value ? 1 : -1; + assert(_selectedCount >= 0); + dessert.selected = value; + notifyListeners(); + } + }, + cells: [ + DataCell(Center(child: Text(dessert.name))), + DataCell(Center(child: Text(dessert.calories))), + DataCell(Center(child: Text(dessert.fat))), + DataCell(Center(child: Text(dessert.carbs))), + ]); + } + + @override + bool get isRowCountApproximate => false; + + @override + int get rowCount => _desserts.length; + + @override + int get selectedRowCount => _selectedCount; + + void _selectAll(bool? checked) { + if (checked == null) return; + for (HeroInfo dessert in _desserts) { + dessert.selected = checked; + } + _selectedCount = checked ? _desserts.length : 0; + notifyListeners(); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json new file mode 100644 index 00000000..27b13dcc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Menüschaltfläche", + "info": "Zeigt ein Popup-Menü an, kann Attribute wie Versatz, Farbe, Schattentiefe, Form usw. angeben. Empfängt Ereignisse für die Auswahl von Elementen und die Abwahl.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuButton", + "desc": [ + "【itemBuilder】 : Builder 【PopupMenuItemBuilder】", + "【offset】 : Versatz 【Offset】", + "【color】 : Hintergrundfarbe 【Color】", + "【shape】 : Form 【ShapeBorder】", + "【elevation】 : Schattentiefe 【double】", + "【onCanceled】 : Abwahlereignis 【Function()】", + "【onSelected】 : Auswahlereignis 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json new file mode 100644 index 00000000..9946a4c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Menu Button", + "info": "A pop-up menu bar that can specify attributes such as offset, color, elevation, and shape. Receives item selection and deselection events.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuButton", + "desc": [ + "【itemBuilder】: Constructor 【PopupMenuItemBuilder】", + "【offset】: Offset 【Offset】", + "【color】: Background Color 【Color】", + "【shape】: Shape 【ShapeBorder】", + "【elevation】: Elevation 【double】", + "【onCanceled】: Cancel Event 【Function()】", + "【onSelected】: Selection Event 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json new file mode 100644 index 00000000..4ea4d72d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Botón de menú", + "info": "Menú emergente, se pueden especificar propiedades como desplazamiento, color, profundidad de sombra, forma, etc. Recibe eventos de selección de ítem y eventos de cancelación.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuButton", + "desc": [ + "【itemBuilder】 : Constructor 【PopupMenuItemBuilder】", + "【offset】 : Desplazamiento 【Offset】", + "【color】 : Color de fondo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profundidad de sombra 【double】", + "【onCanceled】 : Evento de cancelación 【Function()】", + "【onSelected】 : Evento de selección 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json new file mode 100644 index 00000000..b7aac68c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Bouton de menu", + "info": "Affiche un menu contextuel, permettant de spécifier des propriétés telles que le décalage, la couleur, la profondeur d'ombre, la forme, etc. Reçoit les événements de sélection et de désélection des éléments.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuButton", + "desc": [ + "【itemBuilder】 : Constructeur 【PopupMenuItemBuilder】", + "【offset】 : Décalage 【Offset】", + "【color】 : Couleur de fond 【Color】", + "【shape】 : Forme 【ShapeBorder】", + "【elevation】 : Profondeur d'ombre 【double】", + "【onCanceled】 : Événement d'annulation 【Function()】", + "【onSelected】 : Événement de sélection 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json new file mode 100644 index 00000000..3f7896f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Pulsante del menu", + "info": "Apre un menu a comparsa, con la possibilità di specificare proprietà come offset, colore, profondità dell'ombra, forma, ecc. Riceve eventi di selezione e annullamento degli elementi.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuButton", + "desc": [ + "【itemBuilder】 : Costruttore 【PopupMenuItemBuilder】", + "【offset】 : Offset 【Offset】", + "【color】 : Colore di sfondo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profondità dell'ombra 【double】", + "【onCanceled】 : Evento di annullamento 【Function()】", + "【onSelected】 : Evento di selezione 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json new file mode 100644 index 00000000..66ccb830 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "メニューボタン", + "info": "ポップアップメニューバーを表示し、オフセット、色、影の深さ、形状などの属性を指定できます。アイテムの選択イベントと選択解除イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButtonの基本使用", + "desc": [ + "【itemBuilder】 : ビルダー 【PopupMenuItemBuilder】", + "【offset】 : オフセット 【Offset】", + "【color】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】", + "【elevation】 : 影の深さ 【double】", + "【onCanceled】 : キャンセルイベント 【Function()】", + "【onSelected】 : 選択イベント 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json new file mode 100644 index 00000000..77a05c34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "메뉴 버튼", + "info": "팝업 메뉴 바를 표시하며, 오프셋, 색상, 그림자 깊이, 모양 등의 속성을 지정할 수 있습니다. 아이템 선택 이벤트와 선택 취소 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButton 기본 사용", + "desc": [ + "【itemBuilder】 : 생성자 【PopupMenuItemBuilder】", + "【offset】 : 오프셋 【Offset】", + "【color】 : 배경색 【Color】", + "【shape】 : 모양 【ShapeBorder】", + "【elevation】 : 그림자 깊이 【double】", + "【onCanceled】 : 취소 이벤트 【Function()】", + "【onSelected】 : 선택 이벤트 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json new file mode 100644 index 00000000..946e108f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Botão de Menu", + "info": "Exibe um menu pop-up, podendo especificar atributos como deslocamento, cor, profundidade de sombra, forma, etc. Recebe eventos de seleção e cancelamento de itens.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuButton", + "desc": [ + "【itemBuilder】 : Construtor 【PopupMenuItemBuilder】", + "【offset】 : Deslocamento 【Offset】", + "【color】 : Cor de fundo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profundidade de sombra 【double】", + "【onCanceled】 : Evento de cancelamento 【Function()】", + "【onSelected】 : Evento de seleção 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json new file mode 100644 index 00000000..58a6e396 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Кнопка меню", + "info": "Всплывающее меню, можно указать смещение, цвет, глубину тени, форму и другие атрибуты. Принимает события выбора элемента и отмены выбора.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuButton", + "desc": [ + "【itemBuilder】 : Конструктор 【PopupMenuItemBuilder】", + "【offset】 : Смещение 【Offset】", + "【color】 : Цвет фона 【Color】", + "【shape】 : Форма 【ShapeBorder】", + "【elevation】 : Глубина тени 【double】", + "【onCanceled】 : Событие отмены 【Function()】", + "【onSelected】 : Событие выбора 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json new file mode 100644 index 00000000..d2559105 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "菜单按钮", + "info": "弹出菜单栏,可指定偏移、颜色、影深、形状等属性。接收item选中的事件和取消选择事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButton基本使用", + "desc": [ + "【itemBuilder】 : 构造器 【PopupMenuItemBuilder】", + "【offset】 : 偏移 【Offset】", + "【color】 : 背景颜色 【Color】", + "【shape】 : 形状 【ShapeBorder】", + "【elevation】 : 影深 【double】", + "【onCanceled】 : 取消事件 【Function()】", + "【onSelected】 : 选择事件 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart new file mode 100644 index 00000000..03fe4f20 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com + +class CustomPopupMenuButton extends StatefulWidget { + const CustomPopupMenuButton({Key? key}) : super(key: key); + + @override + _CustomPopupMenuButtonState createState() => _CustomPopupMenuButtonState(); +} + +class _CustomPopupMenuButtonState extends State { + final Map map = const { + "关于": Icons.info_outline, + "帮助": Icons.help_outline, + "问题反馈": Icons.add_comment, + }; + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + itemBuilder: (context) => buildItems(), + offset: const Offset(0, 50), + color: const Color(0xffF4FFFA), + elevation: 1, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + topRight: Radius.circular(5), + bottomLeft: Radius.circular(5), + )), + onSelected: (e) { + print(e); + if (e == '关于') { + DialogAbout.show(context); + } + }, + onCanceled: () => print('onCanceled'), + ); + } + + List> buildItems() { + return map.keys + .toList() + .map((e) => PopupMenuItem( + value: e, + child: Wrap( + spacing: 10, + children: [ + Icon(map[e], color: Colors.blue), + Text(e), + ], + ))) + .toList(); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json new file mode 100644 index 00000000..7a5dba89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Popup-Menü-Trennlinie", + "info": "Die Trennlinie des PopupMenuButton, wird normalerweise nicht allein verwendet und kann in der Höhe angegeben werden.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuDivider", + "desc": [ + "【height】 : Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json new file mode 100644 index 00000000..728542b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Popup Menu Divider", + "info": "The divider of PopupMenuButton, generally not used alone, the height can be specified.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuDivider", + "desc": [ + "【height】 : height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json new file mode 100644 index 00000000..9c126922 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Divisor de menú emergente", + "info": "Divisor de PopupMenuButton, generalmente no se usa por separado, se puede especificar la altura.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuDivider", + "desc": [ + "【height】 : altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json new file mode 100644 index 00000000..f928156a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Ligne de séparation du menu contextuel", + "info": "Ligne de séparation pour PopupMenuButton, généralement pas utilisée seule, peut spécifier la hauteur.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuDivider", + "desc": [ + "【height】 : hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json new file mode 100644 index 00000000..925e2b30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Linea di divisione del menu a comparsa", + "info": "Linea di divisione per PopupMenuButton, generalmente non utilizzata da sola, può essere specificata l'altezza.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuDivider", + "desc": [ + "【height】 : Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json new file mode 100644 index 00000000..1de2e6ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "ポップアップメニュー区切り線", + "info": "PopupMenuButtonの区切り線で、通常は単独で使用されず、高さを指定できます。", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDividerの基本使用", + "desc": [ + "【height】 : 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json new file mode 100644 index 00000000..831ee380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "팝업 메뉴 구분선", + "info": "PopupMenuButton의 구분선, 일반적으로 단독으로 사용되지 않으며, 높이를 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDivider 기본 사용", + "desc": [ + "【height】 : 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json new file mode 100644 index 00000000..2b66764a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Divisor de Menu Pop-up", + "info": "Divisor do PopupMenuButton, geralmente não é usado sozinho, pode ser especificada a altura.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuDivider", + "desc": [ + "【height】 : altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json new file mode 100644 index 00000000..3a81af8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Разделитель всплывающего меню", + "info": "Разделитель для PopupMenuButton, обычно не используется отдельно, можно указать высоту.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuDivider", + "desc": [ + "【height】 : Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json new file mode 100644 index 00000000..40ed06d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "弹出菜单分割线", + "info": "PopupMenuButton的分割线,一般不单独使用,可指定高度。", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDivider基本使用", + "desc": [ + "【height】 : 高度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart new file mode 100644 index 00000000..b72d5538 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomPopupMenuDivider extends StatelessWidget { + const CustomPopupMenuDivider({Key? key}) : super(key: key); + + final Map map = const { + "关于": Icons.info_outline, + "帮助": Icons.help_outline, + "问题反馈": Icons.add_comment, + }; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildPopupMenuButton(context), + const PopupMenuDivider(), + ], + ); + } + + PopupMenuButton _buildPopupMenuButton(BuildContext context) { + return PopupMenuButton( + itemBuilder: (context) => [ + ...buildItems().sublist(0, 2), + const PopupMenuDivider(), + ...buildItems().sublist(2, 3) + ], + offset: const Offset(0, 50), + color: const Color(0xffF4FFFA), + elevation: 1, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + topRight: Radius.circular(5), + bottomLeft: Radius.circular(5), + )), + onSelected: (e) { + print(e); + if (e == '关于') { + DialogAbout.show(context); + } + }, + onCanceled: () => print('onCanceled'), + ); + } + + List> buildItems() { + return map.keys + .toList() + .map((e) => PopupMenuItem( + value: e, + child: Wrap( + spacing: 10, + children: [ + Icon(map[e], color: Colors.blue), + Text(e), + ], + ))) + .toList(); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json new file mode 100644 index 00000000..190ea222 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Positionsübergang", + "info": "Kann nur in einem Stack verwendet werden, kann ein Kindelement enthalten und lässt es eine Positionsanimation zwischen zwei Rechtecken durchführen, erfordert einen Animator rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PositionedTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【rect】 : Animation 【Animation】", + " PositionedTransition-Komponente kann nur innerhalb eines Stacks funktionieren" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json new file mode 100644 index 00000000..c9b298bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Position Transition", + "info": "Can only be used in a Stack, can contain one child component, allowing it to animate between two rectangles, requires an animator rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PositionedTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【rect】 : Animation 【Animation】", + " The PositionedTransition component only works within a Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json new file mode 100644 index 00000000..af3c0d42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transición de Posición", + "info": "Solo se puede usar en Stack, puede contener un componente hijo y permite que realice una animación de posición entre dos rectángulos, se requiere proporcionar un animador rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PositionedTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【rect】 : Animación 【Animation】", + " El componente PositionedTransition solo funciona dentro de Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json new file mode 100644 index 00000000..aa494ce6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transition de position", + "info": "Ne peut être utilisé que dans une Stack, peut contenir un seul composant enfant, permettant une animation de position entre deux rectangles, nécessite un animateur rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PositionedTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【rect】 : Animation 【Animation】", + " Le composant PositionedTransition ne fonctionne que dans une Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json new file mode 100644 index 00000000..d503ee47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transizione di posizione", + "info": "Può essere utilizzato solo in uno Stack, può contenere un componente figlio e permette di animare la posizione tra due rettangoli, è necessario fornire un animatore rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PositionedTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【rect】 : Animazione 【Animation】", + " Il componente PositionedTransition funziona solo all'interno di uno Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json new file mode 100644 index 00000000..a7eb3d4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "位置変換", + "info": "Stack内でのみ使用可能で、1つの子コンポーネントを収容し、2つの矩形間で位置アニメーションを行わせることができます。アニメーターrectを提供する必要があります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransitionの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【rect】 : アニメーション 【Animation】", + " PositionedTransitionコンポーネントはStack内でのみ機能します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json new file mode 100644 index 00000000..1b7674db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "위치 변환", + "info": "Stack에서만 사용 가능하며, 하나의 자식 위젯을 포함할 수 있고, 두 사각형 사이에서 위치 애니메이션을 수행할 수 있습니다. 애니메이션 rect를 제공해야 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【rect】 : 애니메이션 【Animation】", + " PositionedTransition 위젯은 Stack 내에서만 작동합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json new file mode 100644 index 00000000..9c65910d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transição de Posição", + "info": "Só pode ser usado em uma Stack, pode conter um componente filho, permitindo que ele faça uma animação de posição entre dois retângulos, é necessário fornecer um animador rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do PositionedTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【rect】 : Animação 【Animation】", + " O componente PositionedTransition só funciona dentro de uma Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json new file mode 100644 index 00000000..bd5e2aa9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Позиционный переход", + "info": "Может использоваться только в Stack, может содержать один дочерний компонент, позволяющий ему выполнять анимацию между двумя прямоугольниками, требуется предоставить аниматор rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PositionedTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【rect】 : Анимация 【Animation】", + " Компонент PositionedTransition может работать только внутри Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json new file mode 100644 index 00000000..5999b455 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "位置变换", + "info": "只能用于Stack中,可容纳一个子组件,让其在两个矩形间进行位置动画,需要提供动画器rect。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【rect】 : 动画 【Animation】", + " PositionedTransition组件只能在Stack内起作用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart new file mode 100644 index 00000000..6485185c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomPositionedTransition extends StatefulWidget { + const CustomPositionedTransition({Key? key}) : super(key: key); + + @override + _CustomPositionedTransitionState createState() => + _CustomPositionedTransitionState(); +} + +class _CustomPositionedTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + ); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + color: Colors.grey.withAlpha(33), + width: 200, + height: 100, + child: Stack( + children: [ + PositionedTransition( + rect: RelativeRectTween( + begin: const RelativeRect.fromLTRB(0, 50, 150, 100), + end: const RelativeRect.fromLTRB(60, 0, 150, -50), + ).animate(_ctrl), + child: const Icon( + Icons.android, + color: Colors.green, + size: 50, + ), + ) + ], + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json new file mode 100644 index 00000000..d7c3a2b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Auswahlknopf", + "info": "Aufgrund der runden Knöpfe für ausgewählte und nicht ausgewählte Zustände können mehrere Radios je nach Logik Einzel- oder Mehrfachauswahl ermöglichen. Farbe kann angegeben werden, und Statusänderungsrückrufe werden empfangen.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Radio", + "desc": [ + "【value】 : Auswahlknopfwert 【T】", + "【groupValue】 : Aktueller Übereinstimmungswert 【T】", + "【activeColor】 : Aktivierungsfarbe 【Color】", + "【onChanged】 : Rückruf bei Änderung 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json new file mode 100644 index 00000000..9cba63c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Radio Button", + "info": "Due to the selected and unselected states of the circular button, multiple Radios can implement single or multiple selection requirements based on logic. The color can be specified, and a callback for state changes is supported.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Radio", + "desc": [ + "【value】: Radio button value 【T】", + "【groupValue】: Current matching value 【T】", + "【activeColor】: Active color 【Color】", + "【onChanged】: Callback on change 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json new file mode 100644 index 00000000..1b0024bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Botón de selección", + "info": "Debido a los botones circulares en estados seleccionados y no seleccionados, múltiples Radio pueden satisfacer necesidades de selección única o múltiple según la lógica. Se puede especificar el color y recibir una devolución de llamada para cambios de estado.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Radio", + "desc": [ + "【value】 : Valor del botón de selección 【T】", + "【groupValue】 : Valor de coincidencia actual 【T】", + "【activeColor】 : Color activo 【Color】", + "【onChanged】 : Devolución de llamada al cambiar 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json new file mode 100644 index 00000000..c4853c7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Bouton de sélection", + "info": "En raison des boutons ronds pour les états sélectionnés et non sélectionnés, plusieurs Radio peuvent répondre aux besoins de sélection unique ou multiple selon la logique. La couleur peut être spécifiée et un rappel de changement d'état peut être reçu.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Radio", + "desc": [ + "【value】 : Valeur du bouton de sélection 【T】", + "【groupValue】 : Valeur de correspondance actuelle 【T】", + "【activeColor】 : Couleur active 【Color】", + "【onChanged】 : Rappel lors du changement 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json new file mode 100644 index 00000000..f1786d8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Pulsante di selezione", + "info": "A causa dei pulsanti rotondi per lo stato selezionato e non selezionato, più Radio possono realizzare la necessità di selezione singola o multipla secondo la logica. È possibile specificare il colore e ricevere un callback per i cambiamenti di stato.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Radio", + "desc": [ + "【value】 : Valore del pulsante di selezione 【T】", + "【groupValue】 : Valore di corrispondenza corrente 【T】", + "【activeColor】 : Colore attivo 【Color】", + "【onChanged】 : Callback al cambiamento 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json new file mode 100644 index 00000000..587b5767 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "ラジオボタン", + "info": "選択状態と未選択状態の円形ボタンであり、複数のRadioを論理的に使用することで、単一選択または複数選択の要件を実現できます。色を指定でき、状態変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Radioの基本的な使用法", + "desc": [ + "【value】 : ラジオボタンの値 【T】", + "【groupValue】 : 現在のマッチ値 【T】", + "【activeColor】 : アクティブな色 【Color】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json new file mode 100644 index 00000000..f28f41ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "라디오 버튼", + "info": "선택 및 미선택 상태의 원형 버튼으로, 여러 개의 라디오 버튼을 통해 논리에 따라 단일 선택 또는 다중 선택이 가능합니다. 색상을 지정할 수 있으며, 상태 변화 콜백을 받을 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "라디오 버튼 기본 사용법", + "desc": [ + "【value】 : 라디오 버튼 값 【T】", + "【groupValue】 : 현재 일치 값 【T】", + "【activeColor】 : 활성화 색상 【Color】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json new file mode 100644 index 00000000..03a9593d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Botão de seleção", + "info": "Devido aos botões circulares para estados selecionados e não selecionados, vários Radios podem atender às necessidades de seleção única ou múltipla com base na lógica. Pode-se especificar a cor e receber um retorno de chamada para mudanças de estado.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Radio", + "desc": [ + "【value】 : Valor do botão de seleção 【T】", + "【groupValue】 : Valor correspondente atual 【T】", + "【activeColor】 : Cor ativa 【Color】", + "【onChanged】 : Retorno de chamada ao mudar 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json new file mode 100644 index 00000000..1859bd1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Кнопка выбора", + "info": "Из-за круглых кнопок в выбранном и невыбранном состоянии, несколько Radio могут реализовать потребности в выборе одного или нескольких вариантов в зависимости от логики. Можно указать цвет, получать обратные вызовы при изменении состояния.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Radio", + "desc": [ + "【value】 : Значение кнопки выбора 【T】", + "【groupValue】 : Текущее совпадающее значение 【T】", + "【activeColor】 : Активный цвет 【Color】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json new file mode 100644 index 00000000..05943372 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "选钮", + "info": "由于选中和未选择状态的圆钮,多个Radio根据逻辑可以实现单选或多选的需求。可指定颜色,接收状态变化回调。", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Radio基本使用", + "desc": [ + "【value】 : 选钮值 【T】", + "【groupValue】 : 当前匹配值 【T】", + "【activeColor】 : 激活颜色 【Color】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart new file mode 100644 index 00000000..363a7ece --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomRadio extends StatefulWidget { + const CustomRadio({Key? key}) : super(key: key); + + @override + _CustomRadioState createState() => _CustomRadioState(); +} + +class _CustomRadioState extends State { + List data = [1, 2, 3, 4, 5]; + double _value = 1; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: data + .map((e) => Radio( + activeColor: Colors.orangeAccent, + value: e, + groupValue: _value, + onChanged: (v) => setState(() => _value = v??0))) + .toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json new file mode 100644 index 00000000..b6476564 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Bereichs-Schieberegler", + "info": "Bereichs-Schieberegler-Komponente, unterstützt das Ziehen von zwei Punkten, um den Bereich dazwischen zu erhalten. Ermöglicht die Angabe von Farbe, Anzahl der Abschnitte und angezeigte Labels, empfängt Rückrufe bei Fortschrittsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RangeSlider", + "desc": [ + "【values】 : Werte 【RangeValues】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【divisions】 : Anzahl der Abschnitte 【int】", + "【label】 : Text der Hinweisblase 【String】", + "【activeColor】 : Aktive Farbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【onChangeStart】 : Listener beim Start des Ziehens 【Function(RangeValues)】", + "【onChangeEnd】 : Listener beim Ende des Ziehens 【Function(RangeValues)】", + "【onChanged】 : Rückruf bei Änderung 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json new file mode 100644 index 00000000..ac404002 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Range Slider", + "info": "The Range Slider component supports two-point dragging to get the range between them. You can specify the color, number of segments, and displayed labels, and receive progress change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RangeSlider", + "desc": [ + "【values】 : Values 【RangeValues】", + "【min】 : Minimum value 【double】", + "【max】 : Maximum value 【double】", + "【divisions】 : Number of divisions 【int】", + "【label】 : Tooltip text 【String】", + "【activeColor】 : Active color 【Color】", + "【inactiveColor】 : Inactive color 【Color】", + "【onChangeStart】 : Listener when sliding starts 【Function(RangeValues)】", + "【onChangeEnd】 : Listener when sliding ends 【Function(RangeValues)】", + "【onChanged】 : Callback when changed 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json new file mode 100644 index 00000000..60d9003b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Control deslizante de rango", + "info": "Componente de control deslizante de rango, compatible con arrastre de dos puntos para obtener el rango entre ellos. Permite especificar colores, número de segmentos y etiquetas mostradas, y recibe una devolución de llamada para cambios de progreso.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RangeSlider", + "desc": [ + "【values】 : valores 【RangeValues】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【divisions】 : número de divisiones 【int】", + "【label】 : texto de la burbuja de sugerencia 【String】", + "【activeColor】 : color activo 【Color】", + "【inactiveColor】 : color inactivo 【Color】", + "【onChangeStart】 : escucha al comenzar a deslizar 【Function(RangeValues)】", + "【onChangeEnd】 : escucha al finalizar el deslizamiento 【Function(RangeValues)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json new file mode 100644 index 00000000..ee1de5b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Curseur de plage", + "info": "Composant de curseur de plage, prend en charge le glissement à deux points pour obtenir la plage entre eux. Peut spécifier la couleur, le nombre de segments et les étiquettes affichées, reçoit un rappel de changement de progression.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RangeSlider", + "desc": [ + "【values】 : valeurs 【RangeValues】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【divisions】 : nombre de segments 【int】", + "【label】 : texte de la bulle d'information 【String】", + "【activeColor】 : couleur active 【Color】", + "【inactiveColor】 : couleur inactive 【Color】", + "【onChangeStart】 : écouteur au début du glissement 【Function(RangeValues)】", + "【onChangeEnd】 : écouteur à la fin du glissement 【Function(RangeValues)】", + "【onChanged】 : rappel lors du changement 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json new file mode 100644 index 00000000..fdf08352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Cursore di intervallo", + "info": "Componente cursore di intervallo, supporta il trascinamento di due punti per ottenere l'intervallo tra di essi. Può specificare il colore, il numero di segmenti e le etichette visualizzate, riceve un callback per le modifiche di avanzamento.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RangeSlider", + "desc": [ + "【values】 : Valori 【RangeValues】", + "【min】 : Valore minimo 【double】", + "【max】 : Valore massimo 【double】", + "【divisions】 : Numero di segmenti 【int】", + "【label】 : Testo del tooltip 【String】", + "【activeColor】 : Colore attivo 【Color】", + "【inactiveColor】 : Colore inattivo 【Color】", + "【onChangeStart】 : Ascolta quando inizia lo scorrimento 【Function(RangeValues)】", + "【onChangeEnd】 : Ascolta quando finisce lo scorrimento 【Function(RangeValues)】", + "【onChanged】 : Callback al cambiamento 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json new file mode 100644 index 00000000..d62e6d3f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "範囲スライダー", + "info": "範囲スライダーコンポーネントは、2点のドラッグをサポートし、その間の範囲を取得します。色、セグメント数、表示されるラベルを指定でき、進捗変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider基本使用", + "desc": [ + "【values】 : 数値 【RangeValues】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【divisions】 : セグメント数 【int】", + "【label】 : ヒントバブルテキスト 【String】", + "【activeColor】 : アクティブカラー 【Color】", + "【inactiveColor】 : 非アクティブカラー 【Color】", + "【onChangeStart】 : スライド開始時のリスナー 【Function(RangeValues)】", + "【onChangeEnd】 : スライド終了時のリスナー 【Function(RangeValues)】", + "【onChanged】 : 変更時のコールバック 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json new file mode 100644 index 00000000..c95744b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "범위 슬라이더", + "info": "범위 슬라이더 컴포넌트, 두 점 드래그를 지원하여 그 사이의 범위를 얻을 수 있습니다. 색상, 분할 수 및 표시된 라벨을 지정할 수 있으며, 진행 변화 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider 기본 사용", + "desc": [ + "【values】 : 값 【RangeValues】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【divisions】 : 분할 수 【int】", + "【label】 : 툴팁 텍스트 【String】", + "【activeColor】 : 활성화 색상 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【onChangeStart】 : 슬라이드 시작 시 리스너 【Function(RangeValues)】", + "【onChangeEnd】 : 슬라이드 종료 시 리스너 【Function(RangeValues)】", + "【onChanged】 : 변경 시 콜백 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json new file mode 100644 index 00000000..6158ffed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Controlo deslizante de intervalo", + "info": "Componente de controlo deslizante de intervalo, suporta arrasto de dois pontos para obter o intervalo entre eles. Pode especificar a cor, o número de segmentos e as etiquetas exibidas, e recebe uma chamada de retorno para alterações no progresso.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do RangeSlider", + "desc": [ + "【values】 : valores 【RangeValues】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【divisions】 : número de segmentos 【int】", + "【label】 : texto da bolha de dica 【String】", + "【activeColor】 : cor ativa 【Color】", + "【inactiveColor】 : cor inativa 【Color】", + "【onChangeStart】 : ouvinte ao iniciar o deslize 【Function(RangeValues)】", + "【onChangeEnd】 : ouvinte ao terminar o deslize 【Function(RangeValues)】", + "【onChanged】 : chamada de retorno ao alterar 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json new file mode 100644 index 00000000..7475fa48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Ползунок диапазона", + "info": "Компонент ползунка диапазона, поддерживает перетаскивание двух точек для получения диапазона между ними. Можно указать цвет, количество сегментов и отображаемые метки, а также получать обратные вызовы при изменении прогресса.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RangeSlider", + "desc": [ + "【values】 : Значения 【RangeValues】", + "【min】 : Минимальное значение 【double】", + "【max】 : Максимальное значение 【double】", + "【divisions】 : Количество сегментов 【int】", + "【label】 : Текст подсказки 【String】", + "【activeColor】 : Активный цвет 【Color】", + "【inactiveColor】 : Неактивный цвет 【Color】", + "【onChangeStart】 : Слушатель начала перетаскивания 【Function(RangeValues)】", + "【onChangeEnd】 : Слушатель окончания перетаскивания 【Function(RangeValues)】", + "【onChanged】 : Обратный вызов при изменении 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json new file mode 100644 index 00000000..815e725e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "范围滑块", + "info": "范围滑块组件,支持两点拖动,获取之间的范围。可指定颜色、分段数及显示的标签,接收进度变化回调。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider基本使用", + "desc": [ + "【values】 : 数值 【RangeValues】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【divisions】 : 分段数 【int】", + "【label】 : 提示气泡文字 【String】", + "【activeColor】 : 激活颜色 【Color】", + "【inactiveColor】 : 非激活颜色 【Color】", + "【onChangeStart】 : 开始滑动时监听 【Function(RangeValues)】", + "【onChangeEnd】 : 滑动结束时监听 【Function(RangeValues)】", + "【onChanged】 : 改变时回调 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart new file mode 100644 index 00000000..bb9ab74e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomRangeSlider extends StatefulWidget { + const CustomRangeSlider({Key? key}) : super(key: key); + + @override + _CustomRangeSliderState createState() => _CustomRangeSliderState(); +} + +class _CustomRangeSliderState extends State { + RangeValues _rangeValues = const RangeValues(90, 270); + + @override + Widget build(BuildContext context) { + return RangeSlider( + values: _rangeValues, + divisions: 180, + min: 0.0, + max: 360.0, + labels: RangeLabels(_rangeValues.start.toStringAsFixed(1), + _rangeValues.end.toStringAsFixed(1)), + activeColor: Colors.orangeAccent, + inactiveColor: Colors.green.withAlpha(99), + onChangeStart: (value) { + print('开始滑动:$value'); + }, + onChangeEnd: (value) { + print('滑动结束:$value'); + }, + onChanged: (value) { + setState(() { + _rangeValues = value; + }); + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json new file mode 100644 index 00000000..36e4d9cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Native Chip", + "info": "Der Vorfahr aller Chip-Komponenten, der die Fähigkeit besitzt, das Verhalten jedes Chips zu zeigen, unterstützt Ereignisse wie Auswählen, Klicken und Löschen. Weitere Informationen finden Sie unter Chip, FilterChip, ActionChip, InputChip und ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip Klickeffekt", + "desc": [ + "【label】: Mittlere Komponente 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【labelPadding】: Label-Abstand 【EdgeInsetsGeometry】", + "【shadowColor】: Schattenfarbe 【Color】", + "【avatar】: Linke Komponente 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【pressElevation】: Schattentiefe beim Klicken 【double】", + "【onPressed】: Klickereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip Auswahl- und Lösch-Effekt", + "desc": [ + "【selected】: Ist ausgewählt 【bool】", + "【deleteIconColor】: Farbe des Endsymbols 【Color】", + "【selectedColor】: Auswahlfarbe 【Color】", + "【deleteIcon】: Endkomponente 【Widget】", + "【onSelected】: Auswahlereignis 【Function(bool)】", + "【onDeleted】: Endereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json new file mode 100644 index 00000000..cc299aa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "RawChip", + "info": "The ancestor of each Chip component, possessing the ability to exhibit each Chip's behavior, supporting events such as selection, click, and deletion. For details, see Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip Click Effect", + "desc": [ + "【label】: Middle component 【Widget】", + "【padding】 : Padding 【EdgeInsetsGeometry】", + "【labelPadding】 : Label padding 【EdgeInsetsGeometry】", + "【shadowColor】: Shadow color 【Color】", + "【avatar】: Left component 【Widget】", + "【elevation】: Elevation 【double】", + "【pressElevation】: Elevation when pressed 【double】", + "【onPressed】 : Click event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip Selection and Deletion Effect", + "desc": [ + "【selected】: Whether selected 【bool】", + "【deleteIconColor】: Trailing icon color 【Color】", + "【selectedColor】: Selected color 【Color】", + "【deleteIcon】: Trailing component 【Widget】", + "【onSelected】: Selection event 【Function(bool)】", + "【onDeleted】 : Trailing event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json new file mode 100644 index 00000000..48e0eb6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "El antepasado de cada componente Chip, con la capacidad de representar cada comportamiento de Chip, soporta eventos como selección, clic, eliminación, etc. Para más detalles, consulta Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Efecto de clic en RawChip", + "desc": [ + "【label】: Componente central 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【labelPadding】 : Relleno de la etiqueta 【EdgeInsetsGeometry】", + "【shadowColor】: Color de la sombra 【Color】", + "【avatar】: Componente izquierdo 【Widget】", + "【elevation】: Profundidad de la sombra 【double】", + "【pressElevation】: Profundidad de la sombra al hacer clic 【double】", + "【onPressed】 : Evento de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección y eliminación en RawChip", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【deleteIconColor】: Color del icono de eliminación 【Color】", + "【selectedColor】: Color de selección 【Color】", + "【deleteIcon】: Componente de eliminación 【Widget】", + "【onSelected】: Evento de selección 【Function(bool)】", + "【onDeleted】 : Evento de eliminación 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json new file mode 100644 index 00000000..7c9461bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Petite barre native", + "info": "L'ancêtre de chaque composant Chip, possédant la capacité de représenter chaque Chip, prend en charge des événements tels que la sélection, le clic, la suppression, etc. Voir Chip, FilterChip, ActionChip, InputChip, ChoiceChip pour plus de détails.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Effet de clic de RawChip", + "desc": [ + "【label】: Composant central 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【labelPadding】 : Marge du label 【EdgeInsetsGeometry】", + "【shadowColor】: Couleur de l'ombre 【Color】", + "【avatar】: Composant gauche 【Widget】", + "【elevation】: Profondeur de l'ombre 【double】", + "【pressElevation】: Profondeur de l'ombre lors du clic 【double】", + "【onPressed】 : Événement de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection et de suppression de RawChip", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【deleteIconColor】: Couleur de l'icône de fin 【Color】", + "【selectedColor】: Couleur de sélection 【Color】", + "【deleteIcon】: Composant de fin 【Widget】", + "【onSelected】: Événement de sélection 【Function(bool)】", + "【onDeleted】 : Événement de fin 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json new file mode 100644 index 00000000..9469f54d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "L'antenato di tutti i componenti Chip, con la capacità di rappresentare ogni Chip, supporta eventi come selezione, clic, eliminazione, ecc. Vedi Chip, FilterChip, ActionChip, InputChip, ChoiceChip per maggiori dettagli.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Effetto Clic di RawChip", + "desc": [ + "【label】: Componente centrale 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【labelPadding】 : Spaziatura del label 【EdgeInsetsGeometry】", + "【shadowColor】: Colore dell'ombra 【Color】", + "【avatar】: Componente sinistro 【Widget】", + "【elevation】: Profondità dell'ombra 【double】", + "【pressElevation】: Profondità dell'ombra al clic 【double】", + "【onPressed】 : Evento di clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto Selezione ed Eliminazione di RawChip", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【deleteIconColor】: Colore dell'icona di coda 【Color】", + "【selectedColor】: Colore selezionato 【Color】", + "【deleteIcon】: Componente di coda 【Widget】", + "【onSelected】: Evento di selezione 【Function(bool)】", + "【onDeleted】 : Evento di coda 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json new file mode 100644 index 00000000..7c53a5b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "ネイティブチップ", + "info": "各Chipコンポーネントの始祖であり、各Chipの表現能力を持ち、選択、クリック、削除などのイベントをサポートします。詳細はChip、FilterChip、ActionChip、InputChip、ChoiceChipを参照してください。", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChipクリック効果", + "desc": [ + "【label】: 中間コンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【labelPadding】 : ラベルパディング 【EdgeInsetsGeometry】", + "【shadowColor】: シャドウカラー 【Color】", + "【avatar】: 左側コンポーネント 【Widget】", + "【elevation】: 影の深さ 【double】", + "【pressElevation】: クリック時の影の深さ 【double】", + "【onPressed】 : クリックイベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip選択と削除効果", + "desc": [ + "【selected】: 選択されているか 【bool】", + "【deleteIconColor】: 末尾アイコンカラー 【Color】", + "【selectedColor】: 選択色 【Color】", + "【deleteIcon】: 末尾コンポーネント 【Widget】", + "【onSelected】: 選択イベント 【Function(bool)】", + "【onDeleted】 : 末尾イベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json new file mode 100644 index 00000000..5ee7e501 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "원본 칩", + "info": "각 Chip 컴포넌트의 조상으로, 각 Chip의 표현 능력을 가지고 있으며, 선택, 클릭, 삭제 등의 이벤트를 지원합니다. 자세한 내용은 Chip, FilterChip, ActionChip, InputChip, ChoiceChip을 참조하세요.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip 클릭 효과", + "desc": [ + "【label】: 중간 컴포넌트 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【labelPadding】 : 라벨 여백 【EdgeInsetsGeometry】", + "【shadowColor】: 그림자 색상 【Color】", + "【avatar】: 왼쪽 컴포넌트 【Widget】", + "【elevation】: 그림자 깊이 【double】", + "【pressElevation】: 클릭 시 그림자 깊이 【double】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip 선택 및 삭제 효과", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【deleteIconColor】: 끝 아이콘 색상 【Color】", + "【selectedColor】: 선택 색상 【Color】", + "【deleteIcon】: 끝 컴포넌트 【Widget】", + "【onSelected】: 선택 이벤트 【Function(bool)】", + "【onDeleted】 : 끝 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json new file mode 100644 index 00000000..972d20a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "O ancestral de cada componente Chip, possui a capacidade de exibir cada comportamento de Chip, suportando eventos como seleção, clique, exclusão, etc. Consulte Chip, FilterChip, ActionChip, InputChip, ChoiceChip para mais detalhes.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Efeito de Clique do RawChip", + "desc": [ + "【label】: Componente central 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【labelPadding】 : Preenchimento do label 【EdgeInsetsGeometry】", + "【shadowColor】: Cor da sombra 【Color】", + "【avatar】: Componente esquerdo 【Widget】", + "【elevation】: Profundidade da sombra 【double】", + "【pressElevation】: Profundidade da sombra ao clicar 【double】", + "【onPressed】 : Evento de clique 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de Seleção e Exclusão do RawChip", + "desc": [ + "【selected】: Selecionado ou não 【bool】", + "【deleteIconColor】: Cor do ícone de exclusão 【Color】", + "【selectedColor】: Cor de seleção 【Color】", + "【deleteIcon】: Componente de ícone de exclusão 【Widget】", + "【onSelected】: Evento de seleção 【Function(bool)】", + "【onDeleted】 : Evento de exclusão 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json new file mode 100644 index 00000000..852e4ae3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Нативный чип", + "info": "Прародитель всех компонентов Chip, обладает способностью отображать различные чипы, поддерживает события выбора, клика, удаления и другие. Подробнее см. Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Эффект нажатия RawChip", + "desc": [ + "【label】: Центральный компонент 【Widget】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【labelPadding】 : Отступы для label 【EdgeInsetsGeometry】", + "【shadowColor】: Цвет тени 【Color】", + "【avatar】: Левый компонент 【Widget】", + "【elevation】: Глубина тени 【double】", + "【pressElevation】: Глубина тени при нажатии 【double】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора и удаления RawChip", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【deleteIconColor】: Цвет иконки удаления 【Color】", + "【selectedColor】: Цвет выбора 【Color】", + "【deleteIcon】: Компонент в конце 【Widget】", + "【onSelected】: Событие выбора 【Function(bool)】", + "【onDeleted】 : Событие в конце 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json new file mode 100644 index 00000000..c70fd51d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "原生小条", + "info": "各自Chip组件的始祖,拥有各自Chip表现的能力,支持选中、点击、删除等事件。详见Chip、FilterChip、ActionChip、InputChip、ChoiceChip。", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip点击效果", + "desc": [ + "【label】: 中间组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【labelPadding】 : label边距 【EdgeInsetsGeometry】", + "【shadowColor】: 阴影色 【Color】", + "【avatar】: 左侧组件 【Widget】", + "【elevation】: 影深 【double】", + "【pressElevation】: 点击时影深 【double】", + "【onPressed】 : 点击事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip选中和删除效果", + "desc": [ + "【selected】: 是否选中 【bool】", + "【deleteIconColor】: 尾部图标色 【Color】", + "【selectedColor】: 选中色 【Color】", + "【deleteIcon】: 尾部组件 【Widget】", + "【onSelected】: 选中事件 【Function(bool)】", + "【onDeleted】 : 尾部事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart new file mode 100644 index 00000000..39140106 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class PressRawChip extends StatelessWidget { + const PressRawChip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return RawChip( + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + label: const Text('张风捷特烈'), + avatar: Image.asset("assets/images/icon_head.webp"), + elevation: 3, + pressElevation: 5, + shadowColor: Colors.orangeAccent, + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart new file mode 100644 index 00000000..2165a0d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class SelectRawChip extends StatefulWidget { + const SelectRawChip({Key? key}) : super(key: key); + + @override + _SelectRawChipState createState() => _SelectRawChipState(); +} + +class _SelectRawChipState extends State { + bool _selected = false; + @override + Widget build(BuildContext context) { + return RawChip( + selected: _selected, + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + deleteIconColor: Colors.red, + selectedColor: Colors.orangeAccent.withAlpha(44), + label: const Text('张风捷特烈'), + avatar: Image.asset("assets/images/icon_head.webp"), + elevation: 3, + pressElevation: 5, + shadowColor: Colors.orangeAccent, + onSelected: (v)=> setState(() => _selected=v), + onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json new file mode 100644 index 00000000..a9931825 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Rohgestenerkennung", + "info": "Kann verwendet werden, um die durch eine gegebene Gestenfabrik beschriebenen Gesten zu erkennen, was bei der Entwicklung eigener Gestenerkenner sehr nützlich ist. Für gängige Gesten verwenden Sie GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawGestureDetector", + "desc": [ + "【behavior】 : Erkennungsverhalten 【HitTestBehavior】", + "【gestures】 : Gestenzuordnung 【Map】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json new file mode 100644 index 00000000..68828d2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Raw Gesture Detector", + "info": "Can be used to detect gestures described by a given gesture factory, which is very useful when developing your own gesture recognizer. For common gestures, use GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawGestureDetector", + "desc": [ + "【behavior】: Detection behavior 【HitTestBehavior】", + "【gestures】: Gesture mapping 【Map】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json new file mode 100644 index 00000000..ac69bfca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Detector de gestos en bruto", + "info": "Se puede utilizar para detectar gestos descritos por una fábrica de gestos dada, es muy útil al desarrollar su propio reconocedor de gestos. Para gestos comunes, use GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawGestureDetector", + "desc": [ + "【behavior】 : Comportamiento de detección 【HitTestBehavior】", + "【gestures】 : Mapeo de gestos 【Map】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json new file mode 100644 index 00000000..109a3ad2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Détecteur de gestes bruts", + "info": "Peut être utilisé pour détecter les gestes décrits par une usine de gestes donnée, très utile lors du développement de son propre détecteur de gestes. Pour les gestes courants, utilisez GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawGestureDetector", + "desc": [ + "【behavior】 : Comportement de détection 【HitTestBehavior】", + "【gestures】 : Mappage des gestes 【Map】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json new file mode 100644 index 00000000..5607345e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Rilevatore di gesti grezzi", + "info": "Può essere utilizzato per rilevare i gesti descritti da una determinata fabbrica di gesti, molto utile nello sviluppo del proprio riconoscitore di gesti. Per i gesti comuni, utilizzare GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di RawGestureDetector", + "desc": [ + "【behavior】 : Comportamento di rilevamento 【HitTestBehavior】", + "【gestures】 : Mappatura dei gesti 【Map】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json new file mode 100644 index 00000000..11076bb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "生のジェスチャー検出器", + "info": "指定されたジェスチャーファクトリの記述に基づいてジェスチャーを検出するために使用できます。独自のジェスチャー認識器を開発する際に非常に便利です。一般的なジェスチャーには、GestureRecognizerを使用してください。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetectorの基本的な使用法", + "desc": [ + "【behavior】 : 検出動作 【HitTestBehavior】", + "【gestures】 : ジェスチャーマッピング 【Map】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json new file mode 100644 index 00000000..35c0c4e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "원 제스처 감지기", + "info": "주어진 제스처 팩토리 설명에 따라 제스처를 감지하는 데 사용할 수 있으며, 자신만의 제스처 인식기를 개발할 때 매우 유용합니다. 일반적인 제스처의 경우 GestureRecognizer를 사용하세요.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector 기본 사용법", + "desc": [ + "【behavior】 : 감지 행동 【HitTestBehavior】", + "【gestures】 : 제스처 매핑 【Map】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json new file mode 100644 index 00000000..cc83464e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Detetor de Gestos Bruto", + "info": "Pode ser usado para detetar gestos descritos por uma fábrica de gestos fornecida, sendo muito útil ao desenvolver o seu próprio reconhecedor de gestos. Para gestos comuns, use o GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawGestureDetector", + "desc": [ + "【behavior】 : Comportamento de deteção 【HitTestBehavior】", + "【gestures】 : Mapeamento de gestos 【Map】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json new file mode 100644 index 00000000..1b1570ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Детектор жестов", + "info": "Может использоваться для обнаружения жестов, описанных заданной фабрикой жестов. Очень полезен при разработке собственного распознавателя жестов. Для распространенных жестов используйте GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawGestureDetector", + "desc": [ + "【behavior】 : Поведение обнаружения 【HitTestBehavior】", + "【gestures】 : Сопоставление жестов 【Map】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json new file mode 100644 index 00000000..f061068a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "原手势检测器", + "info": "可以用来检测给定手势工厂描述的手势,在开发自己的手势识别器时非常有用。对于常见的手势,使用 GestureRecognizer。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector基本使用", + "desc": [ + "【behavior】 : 侦测行为 【HitTestBehavior】", + "【gestures】 : 手势映射 【Map】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart new file mode 100644 index 00000000..505f019a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart @@ -0,0 +1,61 @@ + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class RawGestureDetectorDemo extends StatefulWidget { + const RawGestureDetectorDemo({Key? key}) : super(key: key); + + @override + _RawGestureDetectorDemoState createState() => _RawGestureDetectorDemoState(); +} + +class _RawGestureDetectorDemoState extends State { + String _last = ""; + + @override + Widget build(BuildContext context) { + return RawGestureDetector( + gestures: { + TapGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => TapGestureRecognizer(), + init, + ), + }, + child: Container( + width: 300.0, + height: 100.0, + alignment: Alignment.center, + color: Colors.yellow, + child: Text(_last)), + ); + } + + void init(TapGestureRecognizer instance) { + instance..onTapDown = (TapDownDetails details) { + setState(() { + _last = 'down'; + }); + } + ..onTapUp = (TapUpDetails details) { + setState(() { + _last = 'up'; + }); + } + ..onTap = () { + setState(() { + _last = 'tap'; + }); + } + ..onTapCancel = () { + setState(() { + _last = 'cancel'; + }); + } + ; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json new file mode 100644 index 00000000..b8923e6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Roh-Tastatur-Listener", + "info": "Kann verwendet werden, um Tastendruck- und Tastenloslass-Ereignisse zu erkennen. Derzeit können nur physische Tastaturen erkannt werden und kann auf Desktop-Plattformen verwendet werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawGestureDetector", + "desc": [ + "【onKey】 : Tastaturereignis 【ValueChanged】", + "【focusNode】 : Fokus 【FocusNode】", + "【autofocus】 : Automatischer Fokus 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json new file mode 100644 index 00000000..d1dc2129 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Raw Keyboard Listener", + "info": "Can be used to detect keyboard key press and release events, currently only physical keyboards can be detected, and can be used on desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawGestureDetector", + "desc": [ + "【onKey】 : Keyboard event 【ValueChanged】", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Whether to auto focus 【bool】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json new file mode 100644 index 00000000..a759ad93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Escuchador de teclado en bruto", + "info": "Se puede utilizar para detectar eventos de pulsación y liberación de teclas del teclado. Actualmente solo puede detectar teclados físicos y se puede utilizar en aplicaciones de escritorio.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawGestureDetector", + "desc": [ + "【onKey】 : Evento de teclado 【ValueChanged】", + "【focusNode】 : Nodo de enfoque 【FocusNode】", + "【autofocus】 : Enfoque automático 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json new file mode 100644 index 00000000..6b46447f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Écouteur de clavier brut", + "info": "Peut être utilisé pour détecter les événements de pression et de relâchement des touches du clavier. Actuellement, il ne peut détecter que les claviers physiques et peut être utilisé sur les plateformes de bureau.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawGestureDetector", + "desc": [ + "【onKey】 : Événement de clavier 【ValueChanged】", + "【focusNode】 : Point focal 【FocusNode】", + "【autofocus】 : Mise au point automatique 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json new file mode 100644 index 00000000..114bda06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Ascoltatore Tastiera Originale", + "info": "Può essere utilizzato per rilevare eventi di pressione e rilascio dei tasti della tastiera, attualmente può rilevare solo tastiere fisiche, può essere utilizzato su desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RawGestureDetector", + "desc": [ + "【onKey】 : Evento Tastiera 【ValueChanged】", + "【focusNode】 : Nodo Focus 【FocusNode】", + "【autofocus】 : Autofocus 【bool】", + "【child】 : Componente Figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json new file mode 100644 index 00000000..0811d9ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "生キーボードリスナー", + "info": "キーボードのキー押下とキーリリースのイベントを検出するために使用できます。現在は物理キーボードのみ検出可能で、デスクトップで使用できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetectorの基本使用", + "desc": [ + "【onKey】 : キーボードイベント 【ValueChanged】", + "【focusNode】 : フォーカス 【FocusNode】", + "【autofocus】 : 自動フォーカス 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json new file mode 100644 index 00000000..ff8c7f9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "원시 키보드 리스너", + "info": "키보드 키 누름 및 해제 이벤트를 감지하는 데 사용할 수 있으며, 현재는 물리적 키보드만 감지할 수 있으며 데스크톱에서 사용할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector 기본 사용", + "desc": [ + "【onKey】 : 키보드 이벤트 【ValueChanged】", + "【focusNode】 : 포커스 【FocusNode】", + "【autofocus】 : 자동 포커스 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json new file mode 100644 index 00000000..2bdb176e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Ouvinte de Teclado Bruto", + "info": "Pode ser usado para detectar eventos de pressionamento e liberação de teclas do teclado, atualmente só pode detectar teclados físicos e pode ser usado em desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawGestureDetector", + "desc": [ + "【onKey】 : Evento de teclado 【ValueChanged】", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Foco automático 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json new file mode 100644 index 00000000..8e4770dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Слушатель клавиатуры", + "info": "Может использоваться для обнаружения событий нажатия и отпускания клавиш на клавиатуре. В настоящее время может обнаруживать только физические клавиатуры и может использоваться на настольных устройствах.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawGestureDetector", + "desc": [ + "【onKey】 : Событие клавиатуры 【ValueChanged】", + "【focusNode】 : Фокус 【FocusNode】", + "【autofocus】 : Автоматическая фокусировка 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json new file mode 100644 index 00000000..44a4de06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "原键盘监听器", + "info": "可以用来检测键盘按键和松键的事件,目前只能检测到物理键盘,可在桌面端使用。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector基本使用", + "desc": [ + "【onKey】 : 键盘事件 【ValueChanged】", + "【focusNode】 : 焦点 【FocusNode】", + "【autofocus】 : 是否自动聚焦 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart new file mode 100644 index 00000000..45a43cdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class RawKeyboardListenerDemo extends StatefulWidget { + const RawKeyboardListenerDemo({Key? key}) : super(key: key); + + @override + _RawKeyboardListenerDemoState createState() => _RawKeyboardListenerDemoState(); +} + +class _RawKeyboardListenerDemoState extends State { + String _info = ""; + + final FocusNode node = FocusNode(); + + @override + Widget build(BuildContext context) { + return RawKeyboardListener( + focusNode: node, + onKey: _onKey, + child: SizedBox( + width: 300, + child: Row( + children: [ + const Expanded( + child: TextField( + decoration: InputDecoration( + border: OutlineInputBorder() + ), + ), + ), + const SizedBox(width: 20,), + Text(_info) + ], + ), + ), + ); + } + + void _onKey(RawKeyEvent value) { + print(value); + if(value is RawKeyDownEvent){ + _info = "按下: ${value.logicalKey.debugName}\nid: 0x${value.logicalKey.keyId.toRadixString(16).padLeft(9,"0")}"; + } + if(value is RawKeyUpEvent){ + _info = "抬起: ${value.logicalKey.debugName}\nid: 0x${value.logicalKey.keyId.toRadixString(16).padLeft(9,"0")}"; + } + setState(() { + + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json new file mode 100644 index 00000000..c3e73fef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Rohmaterialknopf", + "info": "Der ursprüngliche Material-Knopf, der große Meister hinter den Kulissen der Knopfwelt, kann Klick-, Langdruck-, Hervorhebungsänderungsereignisse akzeptieren und Farbe, Form, Schattentiefe, Innenabstand usw. angeben.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawMaterialButton", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【fillColor】 : Füllfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【textStyle】 : Textstil 【TextStyle】", + "【onLongPress】 : Langdruckereignis 【Function()】", + "【onPressed】 : Klickereignis 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Hervorhebung und Form von RawMaterialButton", + "desc": [ + "【highlightElevation】 : Hervorhebungs-Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json new file mode 100644 index 00000000..fd8cfeae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Raw Button", + "info": "The original Material button, the behind-the-scenes boss of the button world, can accept click, long press, and highlight change events, and can specify color, shape, shadow depth, padding, and other properties.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawMaterialButton", + "desc": [ + "【child】: Child component 【Widget】", + "【elevation】: Shadow depth 【double】", + "【fillColor】: Fill color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【textStyle】: Text style 【TextStyle】", + "【onLongPress】: Long press event 【Function()】", + "【onPressed】: Click event 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Highlight and Shape of RawMaterialButton", + "desc": [ + "【highlightElevation】: Highlight shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json new file mode 100644 index 00000000..738ddebc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Botón Original", + "info": "El botón original de Material, el gran jefe detrás de los botones, puede aceptar eventos de clic, pulsación larga, cambios de resaltado, y puede especificar color, forma, profundidad de sombra, relleno interno y otros atributos.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawMaterialButton", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【elevation】 : Profundidad de sombra 【double】", + "【fillColor】 : Color de relleno 【Color】", + "【splashColor】 : Color de efecto de ondas 【Color】", + "【textStyle】 : Estilo de texto 【TextStyle】", + "【onLongPress】 : Evento de pulsación larga 【Function()】", + "【onPressed】 : Evento de clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Resaltado y forma de RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profundidad de sombra resaltada 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json new file mode 100644 index 00000000..ec2bbbca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Bouton Brut", + "info": "Le bouton Material original, le grand maître derrière les boutons, peut accepter des événements de clic, de pression longue et de changement de surbrillance, et peut spécifier la couleur, la forme, l'ombre, la marge intérieure et d'autres attributs.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawMaterialButton", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【fillColor】 : Couleur de remplissage 【Color】", + "【splashColor】 : Couleur de l'effet de vague 【Color】", + "【textStyle】 : Style du texte 【TextStyle】", + "【onLongPress】 : Événement de pression longue 【Function()】", + "【onPressed】 : Événement de clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Surbrillance et forme de RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profondeur de l'ombre en surbrillance 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json new file mode 100644 index 00000000..5a618dcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Pulsante Originale", + "info": "Il pulsante Material originale, il grande capo dietro le quinte dei pulsanti, può accettare eventi di clic, pressione prolungata, cambiamenti di evidenziazione, e può specificare colore, forma, profondità dell'ombra, spaziatura interna e altre proprietà.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RawMaterialButton", + "desc": [ + "【child】 : Componente Figlio 【Widget】", + "【elevation】 : Profondità dell'Ombra 【double】", + "【fillColor】 : Colore di Riempimento 【Color】", + "【splashColor】 : Colore dell'Onda 【Color】", + "【textStyle】 : Stile del Testo 【TextStyle】", + "【onLongPress】 : Evento di Pressione Prolungata 【Function()】", + "【onPressed】 : Evento di Clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Evidenziazione e Forma di RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profondità dell'Ombra in Evidenza 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json new file mode 100644 index 00000000..3dae08ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "オリジナルボタン", + "info": "オリジナルのMaterialボタン、ボタン界の裏の大物、クリック、長押し、ハイライト変更イベントを受け入れ、色、形状、影の深さ、内側の余白などの属性を指定できます。", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButtonの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【fillColor】 : 塗りつぶし色 【Color】", + "【splashColor】 : 波紋色 【Color】", + "【textStyle】 : テキストスタイル 【TextStyle】", + "【onLongPress】 : 長押しイベント 【Function()】", + "【onPressed】 : クリックイベント 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButtonのハイライトと形状", + "desc": [ + "【highlightElevation】 : ハイライトの影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json new file mode 100644 index 00000000..3836fa29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "원시 버튼", + "info": "원시 Material 버튼, 버튼계의 숨은 거물, 클릭, 길게 누르기, 강조 변화 이벤트를 받아들일 수 있으며, 색상, 모양, 그림자 깊이, 안쪽 여백 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButton 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【fillColor】 : 채우기 색상 【Color】", + "【splashColor】 : 물결 색상 【Color】", + "【textStyle】 : 텍스트 스타일 【TextStyle】", + "【onLongPress】 : 길게 누르기 이벤트 【Function()】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButton 강조 및 모양", + "desc": [ + "【highlightElevation】 : 강조 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json new file mode 100644 index 00000000..1cf0df63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Botão Original", + "info": "O botão Material original, o grande mestre nos bastidores dos botões, pode aceitar eventos de clique, pressão longa e mudanças de destaque, e pode especificar cor, forma, profundidade de sombra, preenchimento interno e outros atributos.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawMaterialButton", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【fillColor】 : Cor de preenchimento 【Color】", + "【splashColor】 : Cor do efeito de ondulação 【Color】", + "【textStyle】 : Estilo de texto 【TextStyle】", + "【onLongPress】 : Evento de pressão longa 【Function()】", + "【onPressed】 : Evento de clique 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Destaque e Forma do RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profundidade de sombra em destaque 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json new file mode 100644 index 00000000..728b9baa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Исходная кнопка", + "info": "Исходная кнопка Material, скрытый лидер среди кнопок, поддерживает события нажатия, долгого нажатия, изменения выделения. Можно указать цвет, форму, тень, внутренние отступы и другие атрибуты.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawMaterialButton", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【fillColor】 : Цвет заливки 【Color】", + "【splashColor】 : Цвол эффекта ряби 【Color】", + "【textStyle】 : Стиль текста 【TextStyle】", + "【onLongPress】 : Событие долгого нажатия 【Function()】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Выделение и форма RawMaterialButton", + "desc": [ + "【highlightElevation】 : Глубина тени при выделении 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json new file mode 100644 index 00000000..756285b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "原始按钮", + "info": "原始的Material按钮,按钮界的幕后大佬,可接受点击、长按、高亮变化事件,可指定颜色、形状。影深、内边距等属性。", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButton基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【elevation】 : 影深 【double】", + "【fillColor】 : 填充色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【textStyle】 : 文字样式 【TextStyle】", + "【onLongPress】 : 长按事件 【Function()】", + "【onPressed】 : 点击事件 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButton高亮和形状", + "desc": [ + "【highlightElevation】 : 高亮影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart new file mode 100644 index 00000000..18e72046 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomRawMaterialButton extends StatelessWidget { + const CustomRawMaterialButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + RawMaterialButton( + elevation: 2, + fillColor: Colors.green, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: ()=>print('onLongPress'), + child: const Icon(Icons.remove), + onPressed: ()=>print('onPressed'), + ), + RawMaterialButton( + elevation: 2, + fillColor: Colors.blue, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: ()=>print('onLongPress'), + child: const Text('Push'), + onPressed: ()=>print('onPressed'), + ), + RawMaterialButton( + elevation: 2, + fillColor: Colors.red, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: ()=>print('onLongPress'), + child: const Icon(Icons.add), + onPressed: ()=>print('onPressed'), + ), + + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart new file mode 100644 index 00000000..b38ded03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class ShapeRawMaterialButton extends StatelessWidget { + const ShapeRawMaterialButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + RawMaterialButton( + elevation: 2, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + fillColor: Colors.green, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: () => print('onLongPress'), + child: const Icon(Icons.remove), + onPressed: () => print('onPressed'), + ), + RawMaterialButton( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15))), + elevation: 0, + highlightElevation: 0, + fillColor: Colors.blue, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: () => print('onLongPress'), + child: const Text('Push'), + onPressed: () => print('onPressed'), + ), + RawMaterialButton( + elevation: 2, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + fillColor: Colors.red, + splashColor: Colors.orange, + textStyle: const TextStyle(color: Colors.white), + onLongPress: () => print('onLongPress'), + child: const Icon(Icons.add), + onPressed: () => print('onPressed'), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json new file mode 100644 index 00000000..c415b0c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Aktualisierungsanzeige", + "info": "Enthält einen verschachtelten, scrollbaren Bereich, der beim Herunterziehen ein Aktualisierungssymbol anzeigt und beim Loslassen eine spezifizierte asynchrone Methode ausführt. Eigenschaften wie Farbe und Abstand zur Oberseite können angegeben werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RefreshIndicator", + "desc": [ + "【child】 : Kind (scrollbar) 【Widget】", + "【displacement】 : Höhe des schwebenden Indikators 【double】", + "【color】 : Farbe des Indikators 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json new file mode 100644 index 00000000..614a4571 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Refresh Indicator", + "info": "Internally nested scrollable area, displaying a refresh icon when pulled down, and executing a specified asynchronous method upon release. Properties such as color and distance to the top can be specified.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RefreshIndicator", + "desc": [ + "【child】 : Child (scrollable) 【Widget】", + "【displacement】 : Indicator floating height 【double】", + "【color】 : Indicator color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json new file mode 100644 index 00000000..7c6b9090 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicador de actualización", + "info": "Área deslizante anidada internamente, muestra un ícono de actualización al deslizar hacia abajo y ejecuta un método asíncrono especificado al soltar. Se pueden especificar propiedades como el color y la distancia desde la parte superior.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RefreshIndicator", + "desc": [ + "【child】 : Hijo (deslizable) 【Widget】", + "【displacement】 : Altura flotante del indicador 【double】", + "【color】 : Color del indicador 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json new file mode 100644 index 00000000..0259f3b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicateur de rafraîchissement", + "info": "Zone coulissante interne, l'icône de rafraîchissement s'affiche lors du glissement vers le bas, et une méthode asynchrone spécifiée peut être exécutée après le relâchement. Vous pouvez spécifier des propriétés telles que la couleur, la distance par rapport au sommet, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RefreshIndicator", + "desc": [ + "【child】 : Enfant (coulissant) 【Widget】", + "【displacement】 : Hauteur de flottement de l'indicateur 【double】", + "【color】 : Couleur de l'indicateur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json new file mode 100644 index 00000000..9107a0d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicatore di Aggiornamento", + "info": "Area scorrevole interna nidificata, che mostra un'icona di aggiornamento quando si scorre verso il basso e può eseguire un metodo asincrono specificato dopo il rilascio. È possibile specificare attributi come il colore e la distanza dalla parte superiore.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RefreshIndicator", + "desc": [ + "【child】 : Figlio (scorrevole) 【Widget】", + "【displacement】 : Altezza di sospensione dell'indicatore 【double】", + "【color】 : Colore dell'indicatore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json new file mode 100644 index 00000000..1f504c15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "リフレッシュインジケーター", + "info": "内部にスライド可能な領域をネストし、下にスライドするとリフレッシュアイコンが表示され、手を離すと指定された非同期メソッドを実行できます。色やトップまでの距離などの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicatorの基本使用", + "desc": [ + "【child】 : 子(スライド可能) 【Widget】", + "【displacement】 : インジケーターの浮遊高さ 【double】", + "【color】 : インジケーターの色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json new file mode 100644 index 00000000..eb369bcc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "새로고침 표시기", + "info": "내부에 스크롤 가능한 영역을 포함하고 있으며, 아래로 스크롤할 때 새로고침 아이콘이 표시되고, 손을 떼면 지정된 비동기 메서드를 실행할 수 있습니다. 색상, 상단까지의 거리 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicator 기본 사용법", + "desc": [ + "【child】 : 자식(스크롤 가능) 【Widget】", + "【displacement】 : 표시기 부유 높이 【double】", + "【color】 : 표시기 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json new file mode 100644 index 00000000..4853223d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicador de Atualização", + "info": "Área deslizante aninhada internamente, que exibe um ícone de atualização ao deslizar para baixo e executa um método assíncrono especificado ao soltar. Pode especificar atributos como cor, distância até o topo, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RefreshIndicator", + "desc": [ + "【child】 : Filho (deslizante) 【Widget】", + "【displacement】 : Altura de suspensão do indicador 【double】", + "【color】 : Cor do indicador 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json new file mode 100644 index 00000000..c6c4707b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Индикатор обновления", + "info": "Внутренняя вложенная область с возможностью прокрутки, при прокрутке вниз отображается значок обновления, после отпускания можно выполнить указанный асинхронный метод. Можно указать такие свойства, как цвет, расстояние до верхнего края и т.д.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RefreshIndicator", + "desc": [ + "【child】 : Дочерний элемент (с возможностью прокрутки) 【Widget】", + "【displacement】 : Высота индикатора 【double】", + "【color】 : Цвет индикатора 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json new file mode 100644 index 00000000..f9b529a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "刷新指示器", + "info": "内部嵌套可滑动区域,下滑时会显示刷新图标,松手后可以执行指定的异步方法。可指定颜色、到顶端距离等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicator基本使用", + "desc": [ + "【child】 : 孩子(可滑动) 【Widget】", + "【displacement】 : 指示器悬浮高度 【double】", + "【color】 : 指示器颜色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart new file mode 100644 index 00000000..3b0b1745 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomRefreshIndicator extends StatefulWidget { + const CustomRefreshIndicator({Key? key}) : super(key: key); + + @override + _CustomRefreshIndicatorState createState() => _CustomRefreshIndicatorState(); +} + +class _CustomRefreshIndicatorState extends State { + int _count = 0; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + width: 200, + child: RefreshIndicator( + onRefresh: _increment, + displacement: 20, + color: Colors.orange, + backgroundColor: Colors.white, + child: SingleChildScrollView( + child: Container( + alignment: Alignment.center, + width: 200, + height: 300, + color: Colors.blue, + child: Text('$_count',style: const TextStyle(color: Colors.white,fontSize: 40)), + ), + ), + ), + ); + } + + Future _increment() async { + await Future.delayed(const Duration(seconds: 2)); + setState(() { + _count++; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json new file mode 100644 index 00000000..dca63683 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Rechteckpositionsübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Rect verwendet, um Übergangsanimationen zwischen zwei Rect-Objekten für die Kindkomponente zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RelativePositionedTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【size】 : Versatz von links und oben 【Size】", + "【rect】 : Animation 【Animation】", + " Die PositionedTransition-Komponente funktioniert nur innerhalb eines Stacks" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json new file mode 100644 index 00000000..abb6f78e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Rectangle Position Transition", + "info": "A subclass of AnimatedWidget, using a Rect type animator to allow child components to transition between two Rect objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RelativePositionedTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【size】: Left and top offset 【Size】", + "【rect】: Animation 【Animation】", + " PositionedTransition component only works within a Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json new file mode 100644 index 00000000..a9cee088 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transición de posición rectangular", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Rect para realizar una animación de transición entre dos objetos Rect en los componentes hijos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RelativePositionedTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【size】 : Desplazamiento izquierdo y superior 【Size】", + "【rect】 : Animación 【Animation】", + " El componente PositionedTransition solo funciona dentro de un Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json new file mode 100644 index 00000000..f9cadaae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transition de position rectangulaire", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Rect pour permettre à un composant enfant de faire une transition animée entre deux objets Rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RelativePositionedTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【size】 : Décalage gauche et haut 【Size】", + "【rect】 : Animation 【Animation】", + " Le composant PositionedTransition ne fonctionne que dans une Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json new file mode 100644 index 00000000..930bfdc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transizione Posizione Rettangolo", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Rect per far eseguire un'animazione di transizione tra due oggetti Rect ai componenti figli.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RelativePositionedTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【size】 : Offset sinistro e superiore 【Size】", + "【rect】 : Animazione 【Animation】", + " Il componente PositionedTransition funziona solo all'interno di uno Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json new file mode 100644 index 00000000..87051af5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "矩形位置変換", + "info": "AnimatedWidgetのサブクラスで、Rectタイプのアニメーターを使用して子コンポーネントを2つのRectオブジェクト間でトランジションアニメーションさせます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【size】 : 左と上のオフセット 【Size】", + "【rect】 : アニメーション 【Animation】", + " PositionedTransitionコンポーネントはStack内でのみ機能します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json new file mode 100644 index 00000000..94672c44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "사각형 위치 변환", + "info": "AnimatedWidget의 하위 클래스, Rect 타입의 애니메이터를 사용하여 자식 위젯이 두 Rect 객체 간에 전환 애니메이션을 수행하도록 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【size】 : 왼쪽과 위쪽의 오프셋 【Size】", + "【rect】 : 애니메이션 【Animation】", + " PositionedTransition 위젯은 Stack 내에서만 작동합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json new file mode 100644 index 00000000..da3db99f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transição de Posição Retangular", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Rect para permitir que os componentes filhos façam uma animação de transição entre dois objetos Rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de RelativePositionedTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【size】 : Deslocamento esquerdo e superior 【Size】", + "【rect】 : Animação 【Animation】", + " O componente PositionedTransition só funciona dentro de uma Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json new file mode 100644 index 00000000..ead4f390 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Прямоугольное позиционное преобразование", + "info": "Подкласс AnimatedWidget, использующий аниматор типа Rect для создания переходной анимации между двумя объектами Rect для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RelativePositionedTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【size】 : Смещение по левому и верхнему краю 【Size】", + "【rect】 : Анимация 【Animation】", + " Компонент PositionedTransition может работать только внутри Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json new file mode 100644 index 00000000..b8b19f59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "矩形位置变换", + "info": "AnimatedWidget的子类,使用Rect类型的动画器让子组件在两个Rect对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【size】 : 左和上的偏移量 【Size】", + "【rect】 : 动画 【Animation】", + " PositionedTransition组件只能在Stack内起作用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart new file mode 100644 index 00000000..2fc8df00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomRelativePositionedTransition extends StatefulWidget { + const CustomRelativePositionedTransition({Key? key}) : super(key: key); + + @override + _CustomRelativePositionedTransitionState createState() => + _CustomRelativePositionedTransitionState(); +} + +class _CustomRelativePositionedTransitionState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + late Animation rectAnimation; + + @override + void initState() { + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + ); + rectAnimation = RectTween( + begin: const Rect.fromLTRB(0, 0, 50, 50), + end: const Rect.fromLTRB(0, 0, 50, 50).translate(100, 50), + ).animate(_ctrl); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + color: Colors.grey.withAlpha(33), + width: 200, + height: 100, + child: Stack( + children: [ + RelativePositionedTransition( + size: const Size(200, 100), + rect: rectAnimation as Animation, + child: const Icon( + Icons.android, + color: Colors.green, + size: 50, + ), + ) + ], + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json new file mode 100644 index 00000000..50fda898 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Sortierbare Liste", + "info": "Eine ListView, die durch langes Drücken sortiert werden kann. Es können Eigenschaften wie die Scrollrichtung, ob umgekehrt, Scroll-Controller usw. angegeben werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ReorderableListView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【header】 : Kopfkomponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsets】", + "【onReorder】 : Rückruf beim Austauschen 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scrollrichtung von ReorderableListView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json new file mode 100644 index 00000000..a1b043f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Reorderable List", + "info": "A ListView that can be reordered by long-pressing, with properties such as scroll direction, reverse, and scroll controller.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ReorderableListView", + "desc": [ + "【children】 : List of child components 【List】", + "【header】 : Header component 【Widget】", + "【padding】 : Padding 【EdgeInsets】", + "【onReorder】 : Callback when reordering 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scroll Direction of ReorderableListView", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to reverse 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json new file mode 100644 index 00000000..6a3fb814 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista reordenable", + "info": "ListView que permite reordenar mediante pulsación larga, se pueden especificar propiedades como la dirección de deslizamiento, si es inversa, el controlador de deslizamiento, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ReorderableListView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【header】 : Componente de cabecera 【Widget】", + "【padding】 : Relleno interno 【EdgeInsets】", + "【onReorder】 : Callback al reordenar 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de deslizamiento de ReorderableListView", + "desc": [ + "【scrollDirection】 : Dirección de deslizamiento 【Axis】", + "【reverse】 : Si es inverso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json new file mode 100644 index 00000000..0f1b257b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Liste réorganisable", + "info": "ListView qui permet de réorganiser les éléments par un appui long. Peut spécifier la direction de défilement, l'inversion, le contrôleur de défilement, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ReorderableListView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【header】 : Composant d'en-tête 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsets】", + "【onReorder】 : Rappel lors de la réorganisation 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de ReorderableListView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inversion 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json new file mode 100644 index 00000000..49a293d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista riordinabile", + "info": "Una ListView che può essere riordinata con un lungo tocco, con la possibilità di specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ReorderableListView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【header】 : Componente di intestazione 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsets】", + "【onReorder】 : Callback per lo scambio 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di ReorderableListView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json new file mode 100644 index 00000000..bc86df7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "並べ替え可能なリスト", + "info": "長押しで並べ替え可能なListViewで、スワイプ方向、逆方向かどうか、スワイプコントローラーなどの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【header】 : ヘッダーコンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsets】", + "【onReorder】 : 並べ替え時のコールバック 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListViewのスワイプ方向", + "desc": [ + "【scrollDirection】 : スワイプ方向 【Axis】", + "【reverse】 : 逆方向かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json new file mode 100644 index 00000000..526d329b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "재정렬 가능한 리스트", + "info": "길게 눌러 정렬할 수 있는 ListView, 스크롤 방향, 반대 방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListView 기본 사용법", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【header】 : 헤더 위젯 【Widget】", + "【padding】 : 내부 여백 【EdgeInsets】", + "【onReorder】 : 재정렬 시 콜백 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json new file mode 100644 index 00000000..098c7486 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista Reordenável", + "info": "Uma ListView que permite reordenar com um toque longo, podendo especificar a direção de deslize, se é reverso, controlador de deslize, entre outros atributos.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ReorderableListView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【header】 : Componente de cabeçalho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsets】", + "【onReorder】 : Callback ao reordenar 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslize do ReorderableListView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se é reverso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json new file mode 100644 index 00000000..09d81f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Переупорядочиваемый список", + "info": "ListView, который можно упорядочивать с помощью длительного нажатия, можно указать направление прокрутки, обратное направление, контроллер прокрутки и другие свойства.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ReorderableListView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【header】 : Верхний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsets】", + "【onReorder】 : Обратный вызов при переупорядочивании 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки ReorderableListView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json new file mode 100644 index 00000000..b67b345a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "可重排序列表", + "info": "可以进行长按排序的ListView,可指定滑动方向、是否反向、滑动控制器等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【header】 : 头部组件 【Widget】", + "【padding】 : 内边距 【EdgeInsets】", + "【onReorder】 : 调换时回调 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart new file mode 100644 index 00000000..153fe66e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class CustomReorderableListView extends StatefulWidget { + const CustomReorderableListView({Key? key}) : super(key: key); + + @override + _CustomReorderableListViewState createState() => _CustomReorderableListViewState(); +} + +class _CustomReorderableListViewState extends State { + +final List data = [ + Colors.yellow[50]!, + Colors.yellow[100]!, + Colors.yellow[200]!, + Colors.yellow[300]!, + Colors.yellow[400]!, + Colors.yellow[500]!, + Colors.yellow[600]!, + Colors.yellow[700]!, + Colors.yellow[800]!, + Colors.yellow[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 250, + child: ReorderableListView( + padding: const EdgeInsets.all(10), + header: Container( + color: Colors.blue, + alignment: Alignment.center, + height: 50, + child: const Text('长按拖拽进行换位',style: TextStyle(color: Colors.white),)), + onReorder: _handleReorder, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + void _handleReorder(int oldIndex, int newIndex) { + if (oldIndex < newIndex) { + newIndex -= 1; + } + + setState(() { + final element = data.removeAt(oldIndex); + data.insert(newIndex, element); + }); + + } + + Widget _buildItem(Color color) { + return Container( + key: ValueKey(color) , + alignment: Alignment.center, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ]), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart new file mode 100644 index 00000000..906ba9bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-30 +/// contact me by email 1981462002@qq.com + +class DirectionReorderableListView extends StatefulWidget { + const DirectionReorderableListView({Key? key}) : super(key: key); + + @override + _DirectionReorderableListViewState createState() => + _DirectionReorderableListViewState(); +} + +class _DirectionReorderableListViewState extends State { + final List data = [ + Colors.yellow[50]!, + Colors.yellow[100]!, + Colors.yellow[200]!, + Colors.yellow[300]!, + Colors.yellow[400]!, + Colors.yellow[500]!, + Colors.yellow[600]!, + Colors.yellow[700]!, + Colors.yellow[800]!, + Colors.yellow[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ReorderableListView( + scrollDirection: Axis.horizontal, + reverse: false, + onReorder: _handleReorder, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + void _handleReorder(int oldIndex, int newIndex) { + if (oldIndex < newIndex) { + newIndex -= 1; + } + + setState(() { + final element = data.removeAt(oldIndex); + data.insert(newIndex, element); + }); + + } + + Widget _buildItem(Color color) { + return Container( + key: ValueKey(color) , + alignment: Alignment.center, + width: 80, + color: color, + child: Text( + colorString(color), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ]), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json new file mode 100644 index 00000000..5d4f0f0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Drehübergang", + "info": "Kann ein Kind-Widget aufnehmen und es mit einer Drehanimation versehen, erfordert einen Animator turns und verfügt über die Eigenschaft alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RotationTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【turns】 : Ob verschwinden 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json new file mode 100644 index 00000000..42eaf2aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Rotation Transition", + "info": "Can accommodate a child component and make it perform a rotation animation. Requires an animator turns and has an alignment property.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RotationTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【turns】 : Whether to disappear 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json new file mode 100644 index 00000000..2e2b439c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transición de Rotación", + "info": "Puede contener un componente hijo y hacer que realice una animación de rotación. Requiere un animador turns y tiene la propiedad alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RotationTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【turns】 : ¿Desaparece? 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json new file mode 100644 index 00000000..83817b99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transition de rotation", + "info": "Peut contenir un composant enfant et lui faire effectuer une animation de rotation, nécessite un animateur turns, possède une propriété alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RotationTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【turns】 : Disparaît ou non 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json new file mode 100644 index 00000000..4eb81129 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transizione di rotazione", + "info": "Può contenere un componente figlio e farlo ruotare con un'animazione, richiede un animatore turns, possiede l'attributo alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RotationTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【turns】 : Scompare 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json new file mode 100644 index 00000000..6c2f878f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "回転変換", + "info": "子コンポーネントを収容し、回転アニメーションを行わせることができます。アニメーターturnsを提供する必要があり、alignment属性を持っています。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【turns】 : 消えるかどうか 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json new file mode 100644 index 00000000..fcacc7f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "회전 변환", + "info": "하나의 자식 위젯을 포함하고 회전 애니메이션을 적용할 수 있습니다. 애니메이터 turns를 제공해야 하며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【turns】 : 사라짐 여부 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json new file mode 100644 index 00000000..a19b0f63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transição de Rotação", + "info": "Pode conter um componente filho e fazê-lo realizar uma animação de rotação, requer um animador turns e possui a propriedade alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RotationTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【turns】 : Desaparece ou não 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json new file mode 100644 index 00000000..7fcc8161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Вращательный переход", + "info": "Может содержать один дочерний компонент и анимировать его вращение. Требуется предоставить аниматор turns, имеет свойство alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RotationTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【turns】 : Исчезнет ли 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json new file mode 100644 index 00000000..77a2fb32 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "旋转变换", + "info": "可容纳一个子组件,并使其进行旋转动画,需要提供动画器turns,拥有alignment属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【turns】 : 是否消失 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart new file mode 100644 index 00000000..761491f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart @@ -0,0 +1,55 @@ + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomRotationTransition extends StatefulWidget { + const CustomRotationTransition({Key? key}) : super(key: key); + + @override + _CustomRotationTransitionState createState() => _CustomRotationTransitionState(); +} + +class _CustomRotationTransitionState extends State with SingleTickerProviderStateMixin{ + + late AnimationController _ctrl; + + @override + void initState() { + super.initState(); + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + ); + _ctrl.forward(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + color: Colors.grey.withAlpha(22), + width: 100, + height: 100, + child: RotationTransition( + turns: CurvedAnimation( + parent: _ctrl, + curve: Curves.linear, + ), + child: const Icon( + Icons.camera_outlined, + color: Colors.green, + size: 60, + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json new file mode 100644 index 00000000..96eec136 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Gerüst", + "info": "Eine allgemeine App-Struktur, die obere, untere, linke, rechte, mittlere und schwebende Button-Bereiche umfasst, in denen Komponenten platziert werden können.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scaffold", + "desc": [ + "【appBar】 : Kopfkomponente 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Fußkomponente 【Widget】", + "【drawer】 : Linke Schiebekomponente 【Widget】", + "【endDrawer】 : Rechte Schiebekomponente 【Widget】", + "【body】 : Inhaltkomponente 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【floatingActionButton】 : Schwebender Button 【Widget】", + "【floatingActionButtonLocation】 : Position des schwebenden Buttons 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json new file mode 100644 index 00000000..2964c381 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Scaffold", + "info": "A general app structure, including top, bottom, left, right, middle, and floating button parts, where components can be placed in corresponding positions.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scaffold", + "desc": [ + "【appBar】: Header component 【PreferredSizeWidget】", + "【bottomNavigationBar】: Bottom component 【Widget】", + "【drawer】: Left sliding component 【Widget】", + "【endDrawer】: Right sliding component 【Widget】", + "【body】: Content component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【floatingActionButton】: Floating button 【Widget】", + "【floatingActionButtonLocation】: Floating button position 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json new file mode 100644 index 00000000..3fbddd85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Andamio", + "info": "Una estructura de aplicación genérica que incluye partes superior, inferior, izquierda, derecha, central y botón flotante, donde se pueden colocar componentes en las posiciones correspondientes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scaffold", + "desc": [ + "【appBar】 : Componente de la cabecera 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferior 【Widget】", + "【drawer】 : Componente deslizante izquierdo 【Widget】", + "【endDrawer】 : Componente deslizante derecho 【Widget】", + "【body】 : Componente de contenido 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【floatingActionButton】 : Botón flotante 【Widget】", + "【floatingActionButtonLocation】 : Ubicación del botón flotante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json new file mode 100644 index 00000000..156168ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Échafaudage", + "info": "Une structure d'application générique comprenant des parties supérieure, inférieure, gauche, droite, centrale et un bouton flottant, où des composants peuvent être placés aux positions correspondantes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scaffold", + "desc": [ + "【appBar】 : Composant de tête 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Composant de bas 【Widget】", + "【drawer】 : Composant de glissement gauche 【Widget】", + "【endDrawer】 : Composant de glissement droit 【Widget】", + "【body】 : Composant de contenu 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【floatingActionButton】 : Bouton flottant 【Widget】", + "【floatingActionButtonLocation】 : Position du bouton flottant 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json new file mode 100644 index 00000000..3d6852f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Impalcatura", + "info": "Una struttura generica per app, che include parti superiore, inferiore, sinistra, destra, centrale e un pulsante fluttuante, dove è possibile posizionare componenti nelle posizioni corrispondenti.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Scaffold", + "desc": [ + "【appBar】 : Componente superiore 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferiore 【Widget】", + "【drawer】 : Componente scorrevole a sinistra 【Widget】", + "【endDrawer】 : Componente scorrevole a destra 【Widget】", + "【body】 : Componente principale 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【floatingActionButton】 : Pulsante fluttuante 【Widget】", + "【floatingActionButtonLocation】 : Posizione del pulsante fluttuante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json new file mode 100644 index 00000000..966ee658 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "足場", + "info": "一般的なアプリの構造で、上部、下部、左側、右側、中央、フローティングボタンの部分を含み、対応する位置にコンポーネントを配置できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffoldの基本的な使い方", + "desc": [ + "【appBar】 : ヘッダーコンポーネント 【PreferredSizeWidget】", + "【bottomNavigationBar】 : フッターコンポーネント 【Widget】", + "【drawer】 : 左スライドコンポーネント 【Widget】", + "【endDrawer】 : 右スライドコンポーネント 【Widget】", + "【body】 : コンテンツコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【floatingActionButton】 : フローティングボタン 【Widget】", + "【floatingActionButtonLocation】 : フローティングボタンの位置 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json new file mode 100644 index 00000000..a5ac3c4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "스캐폴드", + "info": "일반적인 앱 구조로, 상단, 하단, 좌측, 우측, 중앙, 플로팅 버튼 부분을 포함하며, 해당 위치에 컴포넌트를 배치할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffold 기본 사용법", + "desc": [ + "【appBar】 : 헤더 컴포넌트 【PreferredSizeWidget】", + "【bottomNavigationBar】 : 하단 컴포넌트 【Widget】", + "【drawer】 : 좌측 슬라이드 컴포넌트 【Widget】", + "【endDrawer】 : 우측 슬라이드 컴포넌트 【Widget】", + "【body】 : 내용 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【floatingActionButton】 : 플로팅 버튼 【Widget】", + "【floatingActionButtonLocation】 : 플로팅 버튼 위치 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json new file mode 100644 index 00000000..9dd00eea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Andaime", + "info": "Uma estrutura de aplicativo genérica, incluindo partes superior, inferior, esquerda, direita, central e botão flutuante, onde os componentes podem ser colocados nas posições correspondentes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Scaffold", + "desc": [ + "【appBar】 : Componente do cabeçalho 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferior 【Widget】", + "【drawer】 : Componente deslizante esquerdo 【Widget】", + "【endDrawer】 : Componente deslizante direito 【Widget】", + "【body】 : Componente de conteúdo 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【floatingActionButton】 : Botão flutuante 【Widget】", + "【floatingActionButtonLocation】 : Localização do botão flutuante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json new file mode 100644 index 00000000..8d59eb99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Леса", + "info": "Универсальная структура приложения, включающая верхнюю, нижнюю, левую, правую, центральную части и плавающую кнопку, в соответствующих местах могут размещаться компоненты.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scaffold", + "desc": [ + "【appBar】 : Верхний компонент 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Нижний компонент 【Widget】", + "【drawer】 : Левый выдвижной компонент 【Widget】", + "【endDrawer】 : Правый выдвижной компонент 【Widget】", + "【body】 : Основной компонент 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【floatingActionButton】 : Плавающая кнопка 【Widget】", + "【floatingActionButtonLocation】 : Расположение плавающей кнопки 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json new file mode 100644 index 00000000..72cb719e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "脚手架", + "info": "一个通用app结构,包括上、下、左、右、中、浮动按钮部位,对应位置可盛放组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffold基本用法", + "desc": [ + "【appBar】 : 头部组件 【PreferredSizeWidget】", + "【bottomNavigationBar】 : 底部组件 【Widget】", + "【drawer】 : 左侧滑组件 【Widget】", + "【endDrawer】 : 右侧滑组件 【Widget】", + "【body】 : 内容组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【floatingActionButton】 : 浮动按钮 【Widget】", + "【floatingActionButtonLocation】 : 浮动按钮位置 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart new file mode 100644 index 00000000..5c18db22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import '../PopupMenuButton/node1_base.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomScaffold extends StatefulWidget { + const CustomScaffold({Key? key}) : super(key: key); + + @override + State createState() => _CustomScaffoldState(); +} + +// AppBar 默认的实例,有状态 +class _CustomScaffoldState extends State with SingleTickerProviderStateMixin { + final List tabs = const ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; + int _position = 0; + final Map iconsMap = { + "图鉴": Icons.home, + "动态": Icons.toys, + "喜欢": Icons.favorite, + "手册": Icons.class_, + "我的": Icons.account_circle, + }; + final List _colors = [ + Colors.blue, + Colors.red, + Colors.yellow, + Colors.green, + Colors.purple, + ]; + + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(vsync: this, length: tabs.length); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 300, + child: Scaffold( + floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () {}, + ), + drawer: _buildLeftDrawer(), + endDrawer: _buildLeftDrawer(), + appBar: AppBar( + title: const Text('风雅六社'), + backgroundColor: Colors.blue, + centerTitle: true, + actions: const [Icon(Icons.star), CustomPopupMenuButton()], + bottom: _buildTabBar(), + ), + body: _buildTableBarView(), + bottomNavigationBar: _buildBottomNavigationBar(), + ), + ); + } + + Drawer _buildLeftDrawer() => Drawer( + elevation: 1, + child: Image.asset( + 'assets/images/sabar.webp', + fit: BoxFit.cover, + ), + ); + + PreferredSizeWidget _buildTabBar() => TabBar( + isScrollable: true, + controller: _tabController, + indicatorColor: Colors.orangeAccent, + tabs: tabs.map((e) => Tab(text: e)).toList(), + ); + + Widget _buildBottomNavigationBar() => BottomNavigationBar( + onTap: (position) => setState(() => _position = position), + currentIndex: _position, + elevation: 1, + backgroundColor: Colors.white, + iconSize: 25, + selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), + showUnselectedLabels: false, + showSelectedLabels: true, + items: iconsMap.keys + .map((key) => BottomNavigationBarItem( + label: key, + icon: Icon(iconsMap[key]), + backgroundColor: _colors[_position])) + .toList(), + ); + + Widget _buildTableBarView() => TabBarView( + controller: _tabController, + children: tabs + .map((e) => Center( + child: Text( + e, + style: const TextStyle(color: Colors.blue, fontSize: 20), + ))) + .toList()); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json new file mode 100644 index 00000000..6153ce83 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Skalierungstransformation", + "info": "Kann ein Kindelement aufnehmen und es mit einer Skalierungsanimation versehen. Erfordert einen Animator 'scale' und besitzt das Attribut 'alignment'.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ScaleTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【scale】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json new file mode 100644 index 00000000..1486f242 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Scale Transition", + "info": "Can contain a child component and make it perform a scaling animation. Requires providing an animator scale and has the alignment property.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ScaleTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【scale】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json new file mode 100644 index 00000000..6bb870ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transición de Escala", + "info": "Puede contener un componente hijo y realizar una animación de escala, requiere un animador scale, tiene la propiedad alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ScaleTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【scale】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json new file mode 100644 index 00000000..9a59a791 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transition de mise à l'échelle", + "info": "Peut contenir un composant enfant et lui appliquer une animation de mise à l'échelle. Nécessite un animateur scale et possède l'attribut alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ScaleTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【scale】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json new file mode 100644 index 00000000..2614f287 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transizione di Scala", + "info": "Può contenere un componente figlio e farlo animare con una transizione di scala, richiede un animatore scale, ha la proprietà alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ScaleTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【scale】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json new file mode 100644 index 00000000..1d61966a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "スケールトランジション", + "info": "子コンポーネントを収容し、スケールアニメーションを行わせることができます。アニメーターscaleを提供する必要があり、alignment属性を持っています。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【scale】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json new file mode 100644 index 00000000..a902e389 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "스케일 변환", + "info": "하나의 자식 위젯을 포함하고, 스케일 애니메이션을 수행할 수 있습니다. 애니메이션 스케일을 제공해야 하며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【scale】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json new file mode 100644 index 00000000..67ce554d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transição de Escala", + "info": "Pode conter um componente filho e fazer com que ele realize uma animação de escala, requer um animador scale, possui o atributo alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ScaleTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【scale】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json new file mode 100644 index 00000000..a3d00838 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Масштабирование", + "info": "Может содержать один дочерний компонент и выполнять анимацию масштабирования. Требуется предоставить аниматор scale, имеет свойство alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ScaleTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【scale】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json new file mode 100644 index 00000000..de5eae99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "缩放变换", + "info": "可容纳一个子组件,并使其进行缩放动画,需要提供动画器scale,拥有alignment属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【scale】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart new file mode 100644 index 00000000..524dbdb7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomScaleTransition extends StatefulWidget { + const CustomScaleTransition({Key? key}) : super(key: key); + + @override + _CustomScaleTransitionState createState() => _CustomScaleTransitionState(); +} + +class _CustomScaleTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController(vsync: this, duration: const Duration(seconds: 2)); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + color: Colors.grey.withAlpha(22), + width: 100, + height: 100, + child: ScaleTransition( + scale: CurvedAnimation(parent: _ctrl, curve: Curves.linear), + child: const Icon(Icons.android, color: Colors.green, size: 60), + ), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json new file mode 100644 index 00000000..ec33e744 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Scrollbare Komponente", + "info": "Implementiert ein Interaktionsmodell für eine scrollbare Komponente, das die Konstruktion des Viewports durch den viewportBuilder erfordert. Es ist eine der Kernkomponenten der ScrollView-Implementierung und wird in der Regel nicht direkt verwendet.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scrollable", + "desc": [ + "【viewportBuilder】: Viewport-Konstruktor 【ViewportBuilder】", + "【axisDirection】: Scrollrichtung 【AxisDirection】", + "【controller】: Scroll-Controller 【ScrollController】", + "【dragStartBehavior】: Drag-Verhalten 【DragStartBehavior】", + "【physics】: Scroll-Physik 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json new file mode 100644 index 00000000..eb851f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Scrollable Component", + "info": "Implements an interactive model for a scrollable component, requiring the construction of a viewport via viewportBuilder. It is one of the core implementation components of ScrollView and is generally not used directly.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scrollable", + "desc": [ + "【viewportBuilder】: Viewport Constructor 【ViewportBuilder】", + "【axisDirection】: Scroll Direction 【AxisDirection】", + "【controller】: Scroll Controller 【ScrollController】", + "【dragStartBehavior】: Drag Behavior 【DragStartBehavior】", + "【physics】: Scroll Physics 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json new file mode 100644 index 00000000..04ba09ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Deslizable", + "info": "Implementa un modelo de interacción para un componente desplazable, requiere la construcción del viewport a través del viewportBuilder. Es uno de los componentes centrales de ScrollView, generalmente no se usa directamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scrollable", + "desc": [ + "【viewportBuilder】: Constructor del viewport 【ViewportBuilder】", + "【axisDirection】: Dirección de desplazamiento 【AxisDirection】", + "【controller】: Controlador de desplazamiento 【ScrollController】", + "【dragStartBehavior】: Comportamiento de arrastre 【DragStartBehavior】", + "【physics】: Fenómeno de desplazamiento 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json new file mode 100644 index 00000000..5ead6127 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Composant défilable", + "info": "Implémente un modèle d'interaction pour un composant défilable, nécessitant la construction d'une fenêtre d'affichage via viewportBuilder. C'est l'un des composants de base de ScrollView, généralement pas utilisé directement.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scrollable", + "desc": [ + "【viewportBuilder】 : Constructeur de fenêtre d'affichage 【ViewportBuilder】", + "【axisDirection】: Direction de défilement 【AxisDirection】", + "【controller】: Contrôleur de défilement 【ScrollController】", + "【dragStartBehavior】: Comportement de glissement 【DragStartBehavior】", + "【physics】: Physique de défilement 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json new file mode 100644 index 00000000..d2c6a6e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Scorrevole", + "info": "Implementa un modello di interazione per un componente scorrevole, richiede la costruzione di un viewport tramite viewportBuilder. È uno dei componenti principali di ScrollView e generalmente non viene utilizzato direttamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Scrollable", + "desc": [ + "【viewportBuilder】 : Costruttore del viewport 【ViewportBuilder】", + "【axisDirection】: Direzione di scorrimento 【AxisDirection】", + "【controller】: Controller di scorrimento 【ScrollController】", + "【dragStartBehavior】: Comportamento di trascinamento 【DragStartBehavior】", + "【physics】: Fisica dello scorrimento 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json new file mode 100644 index 00000000..f653f3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "スクロール可能コンポーネント", + "info": "スクロール可能なコンポーネントのインタラクションモデルを実装し、viewportBuilderを使用してビューポートを構築する必要があります。ScrollViewのコア実装コンポーネントの一つで、通常直接使用されません。", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollableの基本的な使用法", + "desc": [ + "【viewportBuilder】 : ビューポートビルダー 【ViewportBuilder】", + "【axisDirection】: スクロール方向 【AxisDirection】", + "【controller】: スクロールコントローラー 【ScrollController】", + "【dragStartBehavior】: ドラッグ開始動作 【DragStartBehavior】", + "【physics】: スクロール物理現象 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json new file mode 100644 index 00000000..cd737531 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "스크롤 가능한 컴포넌트", + "info": "스크롤 가능한 컴포넌트의 상호작용 모델을 구현하며, viewportBuilder를 통해 viewport를 구성해야 합니다. ScrollView의 핵심 구현 컴포넌트 중 하나로, 일반적으로 직접 사용되지 않습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollable 기본 사용법", + "desc": [ + "【viewportBuilder】 : 뷰포트 빌더 【ViewportBuilder】", + "【axisDirection】: 스크롤 방향 【AxisDirection】", + "【controller】: 스크롤 컨트롤러 【ScrollController】", + "【dragStartBehavior】: 드래그 시작 동작 【DragStartBehavior】", + "【physics】: 스크롤 물리 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json new file mode 100644 index 00000000..dfded888 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Deslizável", + "info": "Implementa um modelo de interação para um componente deslizável, necessitando da construção de um viewport através do viewportBuilder. É um dos componentes principais da implementação do ScrollView, geralmente não utilizado diretamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Scrollable", + "desc": [ + "【viewportBuilder】 : Construtor do viewport 【ViewportBuilder】", + "【axisDirection】: Direção do deslize 【AxisDirection】", + "【controller】: Controlador de deslize 【ScrollController】", + "【dragStartBehavior】: Comportamento de arrasto 【DragStartBehavior】", + "【physics】: Fenómeno de rolagem 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json new file mode 100644 index 00000000..7bc209fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Прокручиваемый компонент", + "info": "Реализует модель взаимодействия прокручиваемого компонента, требуется viewportBuilder для построения viewport. Это один из основных компонентов реализации ScrollView, обычно не используется напрямую.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scrollable", + "desc": [ + "【viewportBuilder】 : Конструктор viewport 【ViewportBuilder】", + "【axisDirection】: Направление прокрутки 【AxisDirection】", + "【controller】: Контроллер прокрутки 【ScrollController】", + "【dragStartBehavior】: Поведение при перетаскивании 【DragStartBehavior】", + "【physics】: Физика прокрутки 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json new file mode 100644 index 00000000..f726ea80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "可滑动组件", + "info": "实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollable的基本使用", + "desc": [ + "【viewportBuilder】 : 视口构造器 【ViewportBuilder】", + "【axisDirection】: 滑动方向 【AxisDirection】", + "【controller】: 滑动控制器 【ScrollController】", + "【dragStartBehavior】: t拖动行为 【DragStartBehavior】", + "【physics】: 滚动现象 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart new file mode 100644 index 00000000..f32df2c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +/// create by 张风捷特烈 on 2020/8/2 +/// contact me by email 1981462002@qq.com + + +class ScrollableDemo extends StatelessWidget { + const ScrollableDemo({super.key}); + + List get data => List.generate(32, (i) => Color(0xFF6600FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 250, + child: Scrollable( + axisDirection: AxisDirection.down, + physics: const BouncingScrollPhysics(), + dragStartBehavior: DragStartBehavior.start, + viewportBuilder: (ctx, position) => Viewport( + cacheExtent: 200, + cacheExtentStyle: CacheExtentStyle.pixel, + offset: position, + slivers: [_buildSliverList()], + ), + ), + ); + } + + Widget _buildSliverList() => SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + margin: const EdgeInsets.only(top: 1), + alignment: Alignment.center, + width: 100, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ], + ), + ), + ), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json new file mode 100644 index 00000000..d452345b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Scrollleiste", + "info": "Muss einen scrollbaren Bereich umschließen. Wenn scrollbar, wird eine Scrollleiste zur Anzeige angezeigt.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scrollbar", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json new file mode 100644 index 00000000..875f30bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Scrollbar", + "info": "It needs to wrap a scrollable area. When it is scrollable, a scroll bar will be displayed for indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scrollbar", + "desc": [ + "【child】: Child widget 【Widget】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json new file mode 100644 index 00000000..cbaf503a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra de desplazamiento", + "info": "Debe envolver un área desplazable. Cuando es desplazable, se mostrará una barra de desplazamiento para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scrollbar", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json new file mode 100644 index 00000000..c94a78d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barre de défilement", + "info": "Doit envelopper une zone défilable. Lorsqu'elle est défilable, une barre de défilement est affichée pour l'indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scrollbar", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json new file mode 100644 index 00000000..d06c80c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra di scorrimento", + "info": "Deve avvolgere un'area scorrevole. Quando è scorrevole, verrà visualizzata una barra di scorrimento per indicare.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Scrollbar", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【controller】 : Controllore 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json new file mode 100644 index 00000000..c2831c33 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "スクロールバー", + "info": "スクロール可能な領域をラップする必要があります。スクロール可能な場合、スクロールのバーが表示されて指示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbarの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json new file mode 100644 index 00000000..c4a018f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "스크롤바", + "info": "스크롤 가능한 영역을 감싸야 하며, 스크롤이 가능할 때 스크롤 바가 표시되어 위치를 표시합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbar 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json new file mode 100644 index 00000000..4724067d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra de Rolagem", + "info": "Precisa envolver uma área rolável. Quando rolável, exibirá uma barra de rolagem para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Scrollbar", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json new file mode 100644 index 00000000..3f8d4a3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Ползунок прокрутки", + "info": "Необходимо обернуть прокручиваемую область, при прокрутке будет отображаться ползунок для индикации.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scrollbar", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json new file mode 100644 index 00000000..7e6d02ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "滑动指示栏", + "info": "需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbar基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart new file mode 100644 index 00000000..da07c5b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomScrollbar extends StatelessWidget { + const CustomScrollbar({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Scrollbar( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ], + ), + ), + )) + .toList(), + ), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json new file mode 100644 index 00000000..9d384d43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Auswählbarer Text", + "info": "Auswählbarer Text, der ausgewählt und kopiert werden kann. Die Farbe, Größe, Textstil, Ausrichtung usw. des Cursors können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SelectableText", + "desc": [ + "【Parameter】 : Angezeigter Text 【String】", + "【style】 : Textstil 【TextStyle】", + "【cursorRadius】 : Cursorradius 【Radius】", + "【cursorColor】 : Cursorfarbe 【Color】", + "【cursorWidth】 : Cursorbreite 【double】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【autofocus】 : Autofokus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Ausrichtungseigenschaften von SelectableText", + "desc": [ + "【textAlign】 : Ausrichtung*6 【textAlign】", + "【textDirection】 : Textrichtung*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json new file mode 100644 index 00000000..ac2e706d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Selectable Text", + "info": "Selectable text that can be selected and copied. You can specify the color, size, text style, alignment, etc. of the cursor.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SelectableText", + "desc": [ + "【Parameter】 : Display text 【String】", + "【style】 : Text style 【TextStyle】", + "【cursorRadius】 : Cursor radius 【Radius】", + "【cursorColor】 : Cursor color 【Color】", + "【cursorWidth】 : Cursor width 【double】", + "【showCursor】 : Whether to show the cursor 【bool】", + "【autofocus】 : Auto focus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Alignment Properties of SelectableText", + "desc": [ + "【textAlign】 : Alignment method*6 【textAlign】", + "【textDirection】 : Text direction*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json new file mode 100644 index 00000000..ef1aee65 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texto Seleccionable", + "info": "Texto seleccionable que se puede seleccionar y copiar. Se puede especificar el color, tamaño, estilo de texto, alineación, etc., del cursor.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SelectableText", + "desc": [ + "【Parámetro】 : Texto mostrado 【String】", + "【style】 : Estilo de texto 【TextStyle】", + "【cursorRadius】 : Radio del cursor 【Radius】", + "【cursorColor】 : Color del cursor 【Color】", + "【cursorWidth】 : Ancho del cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Enfoque automático 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propiedades de alineación de SelectableText", + "desc": [ + "【textAlign】 : Alineación*6 【textAlign】", + "【textDirection】 : Dirección del texto*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json new file mode 100644 index 00000000..99181eb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texte sélectionnable", + "info": "Texte sélectionnable, peut être sélectionné et copié. Permet de spécifier la couleur du curseur, la taille, le style du texte, l'alignement, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SelectableText", + "desc": [ + "【Paramètre】 : Texte affiché 【String】", + "【style】 : Style du texte 【TextStyle】", + "【cursorRadius】 : Rayon du curseur 【Radius】", + "【cursorColor】 : Couleur du curseur 【Color】", + "【cursorWidth】 : Largeur du curseur 【double】", + "【showCursor】 : Afficher le curseur 【bool】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propriétés d'alignement de SelectableText", + "desc": [ + "【textAlign】 : Mode d'alignement*6 【textAlign】", + "【textDirection】 : Direction du texte*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json new file mode 100644 index 00000000..10e6cc53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Testo selezionabile", + "info": "Testo selezionabile che può essere selezionato e copiato. È possibile specificare il colore, la dimensione, lo stile del testo, l'allineamento, ecc. del cursore.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SelectableText", + "desc": [ + "【Parametro】 : Testo da visualizzare 【String】", + "【style】 : Stile del testo 【TextStyle】", + "【cursorRadius】 : Raggio del cursore 【Radius】", + "【cursorColor】 : Colore del cursore 【Color】", + "【cursorWidth】 : Larghezza del cursore 【double】", + "【showCursor】 : Mostra il cursore 【bool】", + "【autofocus】 : Autofocus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Proprietà di allineamento di SelectableText", + "desc": [ + "【textAlign】 : Allineamento*6 【textAlign】", + "【textDirection】 : Direzione del testo*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json new file mode 100644 index 00000000..b669bbea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "選択可能なテキスト", + "info": "選択可能なテキストで、選択やコピーが可能です。カーソルの色、サイズ、テキストスタイル、配置などを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableTextの基本使用", + "desc": [ + "【入参】 : 表示テキスト 【String】", + "【style】 : テキストスタイル 【TextStyle】", + "【cursorRadius】 : カーソル半径 【Radius】", + "【cursorColor】 : カーソル色 【Color】", + "【cursorWidth】 : カーソル幅 【double】", + "【showCursor】 : カーソル表示の有無 【bool】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableTextの配置属性", + "desc": [ + "【textAlign】 : 配置方法*6 【textAlign】", + "【textDirection】 : テキスト方向*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json new file mode 100644 index 00000000..75baa2b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "선택 가능한 텍스트", + "info": "선택 가능한 텍스트로, 선택 및 복사가 가능합니다. 커서의 색상, 크기, 텍스트 스타일, 정렬 방식 등을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableText 기본 사용법", + "desc": [ + "【입력 매개변수】 : 표시할 텍스트 【String】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【cursorRadius】 : 커서 반지름 【Radius】", + "【cursorColor】 : 커서 색상 【Color】", + "【cursorWidth】 : 커서 너비 【double】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【autofocus】 : 자동 포커스 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableText 정렬 속성", + "desc": [ + "【textAlign】 : 정렬 방식*6 【textAlign】", + "【textDirection】 : 텍스트 방향*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json new file mode 100644 index 00000000..571375f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texto Selecionável", + "info": "Texto que pode ser selecionado e copiado. Pode especificar a cor do cursor, tamanho, estilo de texto, alinhamento, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SelectableText", + "desc": [ + "【Parâmetro】 : Texto a ser exibido 【String】", + "【style】 : Estilo do texto 【TextStyle】", + "【cursorRadius】 : Raio do cursor 【Radius】", + "【cursorColor】 : Cor do cursor 【Color】", + "【cursorWidth】 : Largura do cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Foco automático 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propriedades de Alinhamento do SelectableText", + "desc": [ + "【textAlign】 : Método de alinhamento*6 【textAlign】", + "【textDirection】 : Direção do texto*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json new file mode 100644 index 00000000..6b26264f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Выбираемый текст", + "info": "Текст, который можно выбирать и копировать. Можно указать цвет курсора, размер, стиль текста, выравнивание и т.д.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SelectableText", + "desc": [ + "【Параметр】 : Отображаемый текст 【String】", + "【style】 : Стиль текста 【TextStyle】", + "【cursorRadius】 : Радиус курсора 【Radius】", + "【cursorColor】 : Цвет курсора 【Color】", + "【cursorWidth】 : Ширина курсора 【double】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【autofocus】 : Автофокус 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Свойства выравнивания SelectableText", + "desc": [ + "【textAlign】 : Способ выравнивания*6 【textAlign】", + "【textDirection】 : Направление текста*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json new file mode 100644 index 00000000..0459ab60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "可选择文字", + "info": "可选择的文字,可以选择、复制。可指定浮标的颜色、大小、文字样式、对齐方式等。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableText基本使用", + "desc": [ + "【入参】 : 显示文字 【String】", + "【style】 : 文字样式 【TextStyle】", + "【cursorRadius】 : 光标半径 【Radius】", + "【cursorColor】 : 光标颜色 【Color】", + "【cursorWidth】 : 光标宽度 【double】", + "【showCursor】 : 是否显示光标 【bool】", + "【autofocus】 : 自动聚焦 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableText对齐属性", + "desc": [ + "【textAlign】 : 对齐方式*6 【textAlign】", + "【textDirection】 : 文字方向*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart new file mode 100644 index 00000000..a20dcd5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomSelectableText extends StatelessWidget { + const CustomSelectableText({Key? key}) : super(key: key); + + final String text = " 始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时," + "臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然," + "技经肯綮之未尝,而况大軱乎!良庖岁更刀,割也;族庖月更刀,折也。" + "今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有间,而刀刃者无厚;" + "以无厚入有间,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。" + "虽然,每至于族,吾见其难为,怵然为戒,视为止,行为迟。动刀甚微,謋然已解,如土委地。" + "提刀而立,为之四顾,为之踌躇满志,善刀而藏之."; + + @override + Widget build(BuildContext context) { + return SelectableText( + text, + style: const TextStyle(fontSize: 18, color: Colors.orange), + cursorColor: Colors.green, + cursorRadius: const Radius.circular(3), + cursorWidth: 5, + showCursor: true, + autofocus: false, + ); + } +} diff --git a/packages/widgets/lib/StatefulWidget/SelectableText/node2_align.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart similarity index 87% rename from packages/widgets/lib/StatefulWidget/SelectableText/node2_align.dart rename to modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart index edfe022b..53bf6c37 100644 --- a/packages/widgets/lib/StatefulWidget/SelectableText/node2_align.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 53, -// "name": 'SelectableText对齐属性', -// "priority": 2, -// "subtitle": -// "【textAlign】 : 对齐方式*6 【textAlign】\n" -// "【textDirection】 : 文字方向*2 【TextDirection】", -// } + class AlignSelectableText extends StatefulWidget { const AlignSelectableText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json new file mode 100644 index 00000000..d6ac3b94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Größenübergang", + "info": "Kann ein Kindelement aufnehmen und eine Größenanimation durchführen. Es erfordert einen Animator sizeFactor und kann die Achse und die Achsenausrichtung der Größenänderung angeben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizeTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【axis】 : Achse*2 【Axis】", + "【sizeFactor】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json new file mode 100644 index 00000000..35fe02fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Size Transition", + "info": "Can accommodate a child component and animate its size. Requires an animator sizeFactor, and can specify the axis of size change and the axis alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizeTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【axis】: Axis*2 【Axis】", + "【sizeFactor】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json new file mode 100644 index 00000000..7c346567 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transición de Tamaño", + "info": "Puede contener un componente hijo y realizar una animación de tamaño, requiere un animador sizeFactor, y se puede especificar el eje de cambio de tamaño y la alineación del eje.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizeTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【axis】 : Eje*2 【Axis】", + "【sizeFactor】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json new file mode 100644 index 00000000..cc72ace5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transition de taille", + "info": "Peut contenir un composant enfant et lui faire subir une animation de taille. Nécessite un animateur sizeFactor, peut spécifier l'axe de changement de taille et l'alignement axial axisAlignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizeTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【axis】 : Axe*2 【Axis】", + "【sizeFactor】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json new file mode 100644 index 00000000..f4cd2291 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transizione Dimensionale", + "info": "Può contenere un componente figlio e fargli eseguire un'animazione di dimensione, richiede un animatore sizeFactor, è possibile specificare l'asse di cambiamento delle dimensioni e l'allineamento assiale.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di SizeTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【axis】 : Asse*2 【Axis】", + "【sizeFactor】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json new file mode 100644 index 00000000..9e63d914 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "サイズ変更", + "info": "子コンポーネントを収容し、そのサイズアニメーションを実行します。アニメーターsizeFactorを提供する必要があり、サイズ変化の軸と軸方向のaxisAlignmentを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransitionの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【axis】 : 軸方向*2 【Axis】", + "【sizeFactor】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json new file mode 100644 index 00000000..4ea1cccb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "크기 변환", + "info": "하위 컴포넌트를 수용하고 크기 애니메이션을 수행할 수 있습니다. 애니메이션 sizeFactor를 제공해야 하며, 크기 변화 축 및 축 정렬을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransition 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【axis】 : 축*2 【Axis】", + "【sizeFactor】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json new file mode 100644 index 00000000..84922215 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transição de Tamanho", + "info": "Pode conter um componente filho e fazê-lo realizar uma animação de tamanho, requer um animador sizeFactor, pode especificar o eixo de mudança de tamanho e o alinhamento axial do eixo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizeTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【axis】 : Eixo*2 【Axis】", + "【sizeFactor】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json new file mode 100644 index 00000000..7b4cef6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Изменение размера", + "info": "Может содержать один дочерний компонент и анимировать его размер. Требуется предоставить аниматор sizeFactor, можно указать ось изменения размера и выравнивание оси axisAlignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizeTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【axis】 : Ось*2 【Axis】", + "【sizeFactor】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json new file mode 100644 index 00000000..8cb4f26b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "尺寸变换", + "info": "可容纳一个子组件,并使其进行尺寸动画,需要提供动画器sizeFactor,可指定尺寸变化轴及轴向的axisAlignment。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【axis】 : 轴向*2 【Axis】", + "【sizeFactor】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart new file mode 100644 index 00000000..733e9c49 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomSizeTransition extends StatefulWidget { + const CustomSizeTransition({Key? key}) : super(key: key); + + @override + _CustomSizeTransitionState createState() => _CustomSizeTransitionState(); +} + +class _CustomSizeTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = + AnimationController(vsync: this, duration: const Duration(seconds: 1)); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Wrap( + runSpacing: 20, + children: [ + SizeTransition( + axis: Axis.horizontal, + sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear), + child: Container( + width: MediaQuery.of(context).size.width, + color: Colors.orange, + child: + const Icon(Icons.android, color: Colors.green, size: 80)), + ), + SizeTransition( + axis: Axis.vertical, + sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear), + child: Container( + width: MediaQuery.of(context).size.width, + color: Colors.orange, + child: + const Icon(Icons.android, color: Colors.green, size: 80)), + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json new file mode 100644 index 00000000..a3835b8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Schiebeübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Offset verwendet, um eine Übergangsanimation zwischen zwei Offset-Objekten für das Kind-Widget zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SlideTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【textDirection】 : X-Achsenrichtung 【TextDirection】", + "【position】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json new file mode 100644 index 00000000..b808bde8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Slide Transition", + "info": "A subclass of AnimatedWidget, using an animator of type Offset to allow child components to transition between two Offset objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SlideTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【textDirection】: X-axis direction 【TextDirection】", + "【position】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json new file mode 100644 index 00000000..da6678e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transición de deslizamiento", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Offset para realizar una animación de transición entre dos objetos Offset en el componente hijo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SlideTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【textDirection】 : Dirección del eje x 【TextDirection】", + "【position】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json new file mode 100644 index 00000000..3e24c65a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transition par glissement", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Offset pour permettre à un composant enfant de faire une animation de transition entre deux objets Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SlideTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【textDirection】 : Direction de l'axe x 【TextDirection】", + "【position】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json new file mode 100644 index 00000000..067c3325 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transizione scorrevole", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Offset per far sì che i componenti figli eseguano un'animazione di transizione tra due oggetti Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SlideTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【textDirection】 : Direzione dell'asse x 【TextDirection】", + "【position】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json new file mode 100644 index 00000000..06eef3ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "スライド遷移", + "info": "AnimatedWidgetのサブクラスで、Offsetタイプのアニメーターを使用して子コンポーネントを2つのOffsetオブジェクト間で遷移させるアニメーションを行います。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【textDirection】 : x軸方向 【TextDirection】", + "【position】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json new file mode 100644 index 00000000..fece4f89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "슬라이드 전환", + "info": "AnimatedWidget의 하위 클래스로, Offset 타입의 애니메이터를 사용하여 자식 위젯이 두 Offset 객체 간의 전환 애니메이션을 수행하도록 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【textDirection】 : x축 방향 【TextDirection】", + "【position】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json new file mode 100644 index 00000000..62082d06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transição de Deslizamento", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Offset para fazer com que os componentes filhos realizem uma animação de transição entre dois objetos Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SlideTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【textDirection】 : Direção do eixo x 【TextDirection】", + "【position】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json new file mode 100644 index 00000000..70208440 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Скользящий переход", + "info": "Подкласс AnimatedWidget, использует аниматор типа Offset для создания анимации перехода между двумя объектами Offset для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SlideTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【textDirection】 : Направление оси x 【TextDirection】", + "【position】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json new file mode 100644 index 00000000..8007c60a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "滑动变换", + "info": "AnimatedWidget的子类,使用Offset类型的动画器让子组件在两个Offset对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【textDirection】 : x轴方向 【TextDirection】", + "【position】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart new file mode 100644 index 00000000..19569425 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomSlideTransition extends StatefulWidget { + const CustomSlideTransition({Key? key}) : super(key: key); + + @override + _CustomSlideTransitionState createState() => _CustomSlideTransitionState(); +} + +class _CustomSlideTransitionState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + late Animation animation; + + @override + void initState() { + super.initState(); + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + )..forward(); + + animation = Tween( + begin: Offset.zero, + end: const Offset(0.5, 0.5), + ).animate(_ctrl); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Container( + width: 200, + color: Colors.grey.withAlpha(33), + height: 100, + child: Stack( + fit: StackFit.expand, + children: [ + SlideTransition( + textDirection: TextDirection.ltr, + position: animation, + child: _buildChild(), + ), + SlideTransition( + textDirection: TextDirection.rtl, + position: animation, + child: _buildChild(), + ), + ], + ), + )); + } + Widget _buildChild() => const Icon( + Icons.accessible_forward_sharp, + color: Colors.green, + size: 25, + ); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json new file mode 100644 index 00000000..96f03fab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Schieberegler", + "info": "Schieberegler-Komponente, die es ermöglicht, zwischen einem festgelegten Minimum und Maximum zu wählen. Kann Farbe, Anzahl der Segmente und angezeigte Labels angeben und erhält einen Rückruf bei Fortschrittsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Sliders", + "desc": [ + "【value】 : Wert 【double】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【activeColor】 : Aktive Farbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【onChanged】 : Rückruf bei Änderung 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmente und Labels des Sliders", + "desc": [ + "【divisions】 : Anzahl der Segmente 【int】", + "【label】 : Text des Hinweisblasens 【String】", + "【onChangeStart】 : Überwachung beim Start des Schiebens 【Function(double)】", + "【onChangeEnd】 : Überwachung beim Ende des Schiebens 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json new file mode 100644 index 00000000..91e1a8e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Slider", + "info": "Slider component, allows dragging to select between a specified maximum and minimum value. Can specify color, number of segments, and displayed labels, and receives progress change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Slider", + "desc": [ + "【value】 : value 【double】", + "【min】 : minimum value 【double】", + "【max】 : maximum value 【double】", + "【activeColor】 : active color 【Color】", + "【inactiveColor】 : inactive color 【Color】", + "【onChanged】 : callback when changed 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider Segments and Labels", + "desc": [ + "【divisions】 : number of segments 【int】", + "【label】 : tooltip text 【String】", + "【onChangeStart】 : listener when sliding starts 【Function(double)】", + "【onChangeEnd】 : listener when sliding ends 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json new file mode 100644 index 00000000..3f914044 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Control deslizante", + "info": "Componente de control deslizante que permite seleccionar arrastrando entre un valor máximo y mínimo especificados. Se puede especificar el color, el número de segmentos y las etiquetas mostradas, y recibe una devolución de llamada para los cambios de progreso.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del Slider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : color activo 【Color】", + "【inactiveColor】 : color inactivo 【Color】", + "【onChanged】 : devolución de llamada al cambiar 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentos y etiquetas del Slider", + "desc": [ + "【divisions】 : número de segmentos 【int】", + "【label】 : texto de la burbuja de información 【String】", + "【onChangeStart】 : escucha al comenzar a deslizar 【Function(double)】", + "【onChangeEnd】 : escucha al finalizar el deslizamiento 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json new file mode 100644 index 00000000..73779261 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Curseur", + "info": "Composant curseur, permet de faire glisser pour sélectionner entre une valeur maximale et minimale spécifiées. Peut spécifier la couleur, le nombre de segments et les étiquettes affichées, reçoit un rappel de changement de progression.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du Slider", + "desc": [ + "【value】 : valeur 【double】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【activeColor】 : couleur active 【Color】", + "【inactiveColor】 : couleur inactive 【Color】", + "【onChanged】 : rappel lors du changement 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentation et étiquettes du Slider", + "desc": [ + "【divisions】 : nombre de segments 【int】", + "【label】 : texte de la bulle d'info 【String】", + "【onChangeStart】 : écoute au début du glissement 【Function(double)】", + "【onChangeEnd】 : écoute à la fin du glissement 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json new file mode 100644 index 00000000..35fb8034 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Cursore", + "info": "Componente cursore, consente di selezionare trascinando tra un valore massimo e minimo specificato. È possibile specificare il colore, il numero di segmenti e le etichette visualizzate, e ricevere un callback per le variazioni di avanzamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base del cursore", + "desc": [ + "【value】 : valore 【double】", + "【min】 : valore minimo 【double】", + "【max】 : valore massimo 【double】", + "【activeColor】 : colore attivo 【Color】", + "【inactiveColor】 : colore inattivo 【Color】", + "【onChanged】 : callback al cambiamento 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentazione ed etichette del cursore", + "desc": [ + "【divisions】 : numero di segmenti 【int】", + "【label】 : testo della bolla di suggerimento 【String】", + "【onChangeStart】 : ascolto all'inizio dello scorrimento 【Function(double)】", + "【onChangeEnd】 : ascolto alla fine dello scorrimento 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json new file mode 100644 index 00000000..626b3924 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "スライダー", + "info": "スライダーコンポーネントは、指定された最大値と最小値の間でドラッグして選択することができます。色、分割数、表示されるラベルを指定でき、進捗変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "スライダーの基本使用", + "desc": [ + "【value】 : 数値 【double】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【activeColor】 : アクティブカラー 【Color】", + "【inactiveColor】 : 非アクティブカラー 【Color】", + "【onChanged】 : 変更時のコールバック 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "スライダーの分割とラベル", + "desc": [ + "【divisions】 : 分割数 【int】", + "【label】 : ヒントバブルテキスト 【String】", + "【onChangeStart】 : スライド開始時のリスナー 【Function(double)】", + "【onChangeEnd】 : スライド終了時のリスナー 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json new file mode 100644 index 00000000..4a82878c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "슬라이더", + "info": "슬라이더 컴포넌트는 지정된 최대값과 최소값 사이에서 드래그하여 선택할 수 있습니다. 색상, 분할 수 및 표시된 라벨을 지정할 수 있으며, 진행률 변경 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Slider 기본 사용", + "desc": [ + "【value】 : 값 【double】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【activeColor】 : 활성화 색상 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【onChanged】 : 변경 시 콜백 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider의 분할과 라벨", + "desc": [ + "【divisions】 : 분할 수 【int】", + "【label】 : 툴팁 텍스트 【String】", + "【onChangeStart】 : 슬라이드 시작 시 리스너 【Function(double)】", + "【onChangeEnd】 : 슬라이드 종료 시 리스너 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json new file mode 100644 index 00000000..e4a68925 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Deslizador", + "info": "Componente deslizante que permite selecionar arrastando entre um valor máximo e mínimo especificados. Pode especificar a cor, o número de segmentos e as etiquetas exibidas, e recebe uma chamada de retorno para alterações de progresso.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Slider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : cor ativa 【Color】", + "【inactiveColor】 : cor inativa 【Color】", + "【onChanged】 : chamada de retorno ao alterar 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentação e etiquetas do Slider", + "desc": [ + "【divisions】 : número de segmentos 【int】", + "【label】 : texto da bolha de dica 【String】", + "【onChangeStart】 : ouvinte ao iniciar o deslize 【Function(double)】", + "【onChangeEnd】 : ouvinte ao terminar o deslize 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json new file mode 100644 index 00000000..64bbb857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Ползунок", + "info": "Компонент ползунка, который позволяет выбирать значение, перетаскивая между указанными минимальным и максимальным значениями. Можно указать цвет, количество сегментов и отображаемые метки, а также получить обратный вызов при изменении прогресса.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Slider", + "desc": [ + "【value】 : значение 【double】", + "【min】 : минимальное значение 【double】", + "【max】 : максимальное значение 【double】", + "【activeColor】 : активный цвет 【Color】", + "【inactiveColor】 : неактивный цвет 【Color】", + "【onChanged】 : обратный вызов при изменении 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Сегменты и метки Slider", + "desc": [ + "【divisions】 : количество сегментов 【int】", + "【label】 : текст подсказки 【String】", + "【onChangeStart】 : слушатель начала перетаскивания 【Function(double)】", + "【onChangeEnd】 : слушатель окончания перетаскивания 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json new file mode 100644 index 00000000..d8164d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "滑块", + "info": "滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色、分段数及显示的标签,接收进度变化回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Slider基本使用", + "desc": [ + "【value】 : 数值 【double】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【activeColor】 : 激活颜色 【Color】", + "【inactiveColor】 : 非激活颜色 【Color】", + "【onChanged】 : 改变时回调 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider的分段与标签", + "desc": [ + "【divisions】 : 分段数 【int】", + "【label】 : 提示气泡文字 【String】", + "【onChangeStart】 : 开始滑动时监听 【Function(double)】", + "【onChangeEnd】 : 滑动结束时监听 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart new file mode 100644 index 00000000..102802e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class CustomSlider extends StatefulWidget { + const CustomSlider({Key? key}) : super(key: key); + + @override + _CustomSliderState createState() => _CustomSliderState(); +} + +class _CustomSliderState extends State { + double _value = 0.0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text('当前值:${_value.toStringAsFixed(1)}'), + Slider( + value: _value, + min: 0.0, + max: 360.0, + activeColor: Colors.orangeAccent, + inactiveColor: Colors.green.withAlpha(99), + onChanged: _onChange), + ], + ); + } + + void _onChange(value) { + setState(() { + _value = value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart new file mode 100644 index 00000000..268f5e8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-31 +/// contact me by email 1981462002@qq.com + +class DivisionsSlider extends StatefulWidget { + const DivisionsSlider({Key? key}) : super(key: key); + + @override + _DivisionsSliderState createState() => _DivisionsSliderState(); +} + +class _DivisionsSliderState extends State { + double _value = 0.0; + + @override + Widget build(BuildContext context) { + return Slider( + value: _value, + min: 0.0, + max: 360.0, + divisions: 10, + label: _value.toStringAsFixed(1), + activeColor: Colors.orangeAccent, + inactiveColor: Colors.green.withAlpha(99), + onChangeStart: (value) { + print('开始滑动:$value'); + }, + onChangeEnd: (value) { + print('滑动结束:$value'); + }, + onChanged: (value) { + setState(() { + _value = value; + }); + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json new file mode 100644 index 00000000..d4526d87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Statuskonstruktor", + "info": "Es muss das builder-Attribut übergeben werden, um die Komponente zu konstruieren. Im builder kann StateSetter verwendet werden, um den Zustand der Unterkomponenten zu ändern, d.h. es ist möglich, eine lokal aktualisierte Komponente zu erstellen, ohne eine Klasse zu erstellen.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von StatefulBuilder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json new file mode 100644 index 00000000..7b339f1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "State Constructor", + "info": "The builder property needs to be passed to construct the component. In the builder, StateSetter can be used to change the state of the child component, which means a locally refreshed component can be implemented without creating a class.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of StatefulBuilder", + "desc": [ + "【builder】 : Component Constructor 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json new file mode 100644 index 00000000..f4ab980b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Constructor de Estado", + "info": "Requiere que se pase la propiedad builder para construir el componente. En el builder, se puede usar StateSetter para cambiar el estado del subcomponente, lo que permite implementar un componente con actualización local sin necesidad de crear una clase.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de StatefulBuilder", + "desc": [ + "【builder】 : Constructor del componente 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json new file mode 100644 index 00000000..56c80e8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Constructeur d'état", + "info": "Nécessite de passer la propriété builder pour construire le composant. Dans le builder, vous pouvez utiliser StateSetter pour modifier l'état du sous-composant, ce qui permet de créer un composant à rafraîchissement local sans avoir à créer une classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de StatefulBuilder", + "desc": [ + "【builder】 : Constructeur de composant 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json new file mode 100644 index 00000000..656f0161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Costruttore di Stato", + "info": "È necessario passare la proprietà builder per costruire il componente. Nel builder, è possibile utilizzare StateSetter per cambiare lo stato del componente figlio, il che consente di implementare un componente con aggiornamento locale senza dover creare una classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di StatefulBuilder", + "desc": [ + "【builder】: Costruttore del componente 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json new file mode 100644 index 00000000..8a72f81a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "ステートフルビルダー", + "info": "builderプロパティを渡してコンポーネントを構築する必要があります。builder内でStateSetterを使用して子コンポーネントの状態を変更できます。つまり、クラスを作成せずに局所的な更新を行うコンポーネントを実現できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilderの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json new file mode 100644 index 00000000..12ea565a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "상태 생성기", + "info": "builder 속성을 전달하여 컴포넌트를 구성해야 합니다. builder 내에서 StateSetter를 사용하여 하위 컴포넌트의 상태를 변경할 수 있습니다. 즉, 클래스를 생성하지 않고도 부분적으로 새로 고치는 컴포넌트를 구현할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilder 기본 사용법", + "desc": [ + "【builder】 : 컴포넌트 생성기 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json new file mode 100644 index 00000000..c09e9ade --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Construtor de Estado", + "info": "É necessário passar a propriedade builder para construir o componente. No builder, pode-se usar o StateSetter para alterar o estado do subcomponente, o que permite implementar um componente com atualização local sem a necessidade de criar uma classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do StatefulBuilder", + "desc": [ + "【builder】: Construtor de Componentes 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f6dd4db8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Конструктор состояния", + "info": "Необходимо передать свойство builder для создания компонента. В builder можно использовать StateSetter для изменения состояния дочернего компонента, что позволяет реализовать локальное обновление компонента без создания класса.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование StatefulBuilder", + "desc": [ + "【builder】 : Конструктор компонента 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json new file mode 100644 index 00000000..4105126d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "状态构造器", + "info": "需要传入 builder 属性进行构造组件,在 builder 中可以使用 StateSetter 改变构造子组件的状态,即可以不用创建类而实现一个局部刷新的组件。", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilder基本使用", + "desc": [ + "【builder】 : 组件构造器 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart new file mode 100644 index 00000000..6cc0f465 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class StatefulBuilderDemo extends StatelessWidget { + const StatefulBuilderDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + int count = 0; + + return StatefulBuilder( + builder: (ctx, setState) => ElevatedButton( + child: Text("当前数字: $count"), + onPressed: () { + setState(() { + count++; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json new file mode 100644 index 00000000..d00db645 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Statusübergangskomponente", + "info": "Abstrakte Klasse, die Aktualisierungen basierend auf den bereitgestellten Animatorstatusänderungen auslösen kann. Es gibt keine implementierten Unterklassen auf der Flutter-Framework-Ebene und keine Anwendungsfälle, daher scheint sie nicht sehr nützlich zu sein.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in StatusTransitionWidget", + "desc": [ + "【animation】 : Unterkomponente 【Animation】", + "Hier wird ein benutzerdefiniertes ColorStatusTransitionWidget verwendet, das beim Zustandswechsel des Animators verschiedene Farben erstellt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json new file mode 100644 index 00000000..de7e4f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Status Transition Widget", + "info": "Abstract class that can trigger refresh based on the state changes of the provided animator. There are no implemented subclasses in the Flutter framework layer, nor any usage scenarios, so it doesn't seem very useful.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to StatusTransitionWidget", + "desc": [ + "【animation】 : Child component 【Animation】", + "Here, a custom ColorStatusTransitionWidget is used to build different colors when the state of the animator changes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json new file mode 100644 index 00000000..26137220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Componente de Transición de Estado", + "info": "Clase abstracta que puede desencadenar una actualización basada en los cambios de estado del animador proporcionado. No hay subclases implementadas en el nivel del framework Flutter, ni escenarios de uso, parece no ser muy útil.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a StatusTransitionWidget", + "desc": [ + "【animation】 : Componente hijo 【Animation】", + "Aquí se personaliza ColorStatusTransitionWidget para su uso, construyendo diferentes colores cuando cambia el estado del animador." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json new file mode 100644 index 00000000..837becf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Widget de transition d'état", + "info": "Classe abstraite qui peut déclencher un rafraîchissement en fonction des changements d'état de l'animateur fourni. Il n'y a pas de sous-classes implémentées au niveau du framework Flutter, ni de scénarios d'utilisation, ce qui semble peu utile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction de StatusTransitionWidget", + "desc": [ + "【animation】 : Sous-composant 【Animation】", + "Ici, ColorStatusTransitionWidget est personnalisé pour être utilisé, construisant différentes couleurs lorsque l'état de l'animateur change." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json new file mode 100644 index 00000000..33ca6c76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Widget di transizione di stato", + "info": "Classe astratta che può attivare un aggiornamento in base ai cambiamenti di stato dell'animatore fornito. Non ci sono sottoclassi implementate a livello di framework Flutter, né scenari di utilizzo, sembra non essere molto utile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a StatusTransitionWidget", + "desc": [ + "【animation】 : componente figlio 【Animation】", + "Qui viene utilizzato il ColorStatusTransitionWidget personalizzato, che costruisce colori diversi quando lo stato dell'animatore cambia." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json new file mode 100644 index 00000000..ecf6183b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "ステータス遷移コンポーネント", + "info": "抽象クラスで、提供されたアニメーターの状態変化に基づいて更新をトリガーできます。Flutterフレームワーク層には実装されたサブクラスも使用シナリオもなく、あまり役に立たないと感じます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 紹介", + "desc": [ + "【animation】 : サブコンポーネント 【Animation】", + "ここでカスタムColorStatusTransitionWidgetを使用し、アニメーターの状態が変化したときに異なる色を構築します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json new file mode 100644 index 00000000..d8141178 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "상태 전환 위젯", + "info": "추상 클래스로, 제공된 애니메이터 상태 변화에 따라 새로고침을 트리거할 수 있습니다. Flutter 프레임워크 레벨에서 구현된 하위 클래스도 없고, 사용 사례도 없어서 유용성이 크지 않아 보입니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 소개", + "desc": [ + "【animation】 : 자식 위젯 【Animation】", + "여기서 사용자 정의 ColorStatusTransitionWidget을 사용하여 애니메이터의 상태가 변경될 때 다른 색상을 구성합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json new file mode 100644 index 00000000..ee2ef811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Componente de Transição de Estado", + "info": "Classe abstrata que pode acionar atualizações com base nas mudanças de estado do animador fornecido. Não há subclasses implementadas na camada do framework Flutter, nem cenários de uso, parece não ser muito útil.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao StatusTransitionWidget", + "desc": [ + "【animation】 : Subcomponente 【Animation】", + "Aqui, o ColorStatusTransitionWidget é personalizado para uso, construindo cores diferentes quando o estado do animador muda." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json new file mode 100644 index 00000000..441f8cd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Виджет перехода состояний", + "info": "Абстрактный класс, который может вызывать обновление при изменении состояния предоставленного аниматора. На уровне фреймворка Flutter нет реализованных подклассов, а также сценариев использования, что делает его не очень полезным.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в StatusTransitionWidget", + "desc": [ + "【animation】 : Дочерний компонент 【Animation】", + "Здесь используется пользовательский ColorStatusTransitionWidget, который строит различные цвета при изменении состояния аниматора." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json new file mode 100644 index 00000000..523c58f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "状态转变组件", + "info": "抽象类,可以根据提供的动画器状态变化触发刷新。在 Flutter 框架层没有实现的子类,也没有使用的场景,感觉用处不是很大。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 介绍", + "desc": [ + "【animation】 : 子组件 【Animation】", + "这里自定义 ColorStatusTransitionWidget 进行使用,在动画器的状态改变时构建不同的颜色。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart new file mode 100644 index 00000000..c431fb38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + + +class StatusTransitionWidgetDemo extends StatefulWidget { + const StatusTransitionWidgetDemo({Key? key}) : super(key: key); + + @override + _StatusTransitionWidgetDemoState createState() => + _StatusTransitionWidgetDemoState(); +} + +class _StatusTransitionWidgetDemoState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + super.initState(); + _ctrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 1), + )..forward(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: (){ + _ctrl.forward(from: 0); + }, + child: ColorStatusTransitionWidget( + anim: _ctrl, + ), + ); + } +} + +class ColorStatusTransitionWidget extends StatusTransitionWidget { + final Animation anim; + + const ColorStatusTransitionWidget({Key? key,required this.anim}) + : super(key: key, animation: anim); + + @override + Widget build(BuildContext context) { + Color color = Colors.blue; + switch (animation.status) { + case AnimationStatus.dismissed: + color = Colors.black; + break; + case AnimationStatus.forward: + color = Colors.blue; + break; + case AnimationStatus.reverse: + color = Colors.red; + break; + case AnimationStatus.completed: + color = Colors.green; + break; + } + + return Container( + alignment: Alignment.center, + width: 80, + height: 80, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + child: Text('${animation.status}'.split('.')[1],style: const TextStyle(color: Colors.white),), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json new file mode 100644 index 00000000..78dd51b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Schrittkomponente", + "info": "Schrittkomponente, die schrittweise Operationen festlegen kann, kann den Inhalt der Schritte, die Bestätigungs- und Rückgängig-Buttons sowie die Ausrichtung der Schritte anpassen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Stepper", + "desc": [ + "【steps】 : Schrittliste 【List】", + "【currentStep】 : Aktueller Schritt 【double】", + "【onStepTapped】 : Klick-Rückruf 【ValueChanged】", + "【onStepCancel】 : Rückgängig-Rückruf 【VoidCallback】", + "【controlsBuilder】 : Controller-Konstruktion 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Ausrichtung des Steppers", + "desc": [ + "【type】 : Ausrichtung 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json new file mode 100644 index 00000000..a769d901 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Step Component", + "info": "Step component, which can specify step-by-step operations, customize the content of the steps, the buttons for confirmation and return, and the direction of the step arrangement.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Stepper", + "desc": [ + "【steps】: Step list 【List】", + "【currentStep】: Current step 【double】", + "【onStepTapped】: Click callback 【ValueChanged】", + "【onStepCancel】: Previous step callback 【VoidCallback】", + "【controlsBuilder】: Controller construction 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direction of Stepper", + "desc": [ + "【type】: Direction 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json new file mode 100644 index 00000000..9e71ee58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente de pasos", + "info": "Componente de pasos, permite especificar operaciones paso a paso, se puede personalizar el contenido de los pasos, los botones de confirmación y retroceso, así como la dirección de la secuencia de pasos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Stepper", + "desc": [ + "【steps】 : Lista de pasos 【List】", + "【currentStep】 : Paso actual 【double】", + "【onStepTapped】 : Callback de clic 【ValueChanged】", + "【onStepCancel】 : Callback de retroceso 【VoidCallback】", + "【controlsBuilder】 : Constructor del controlador 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Dirección de Stepper", + "desc": [ + "【type】 : Dirección 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json new file mode 100644 index 00000000..88f48010 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Composant d'étapes", + "info": "Composant d'étapes, permet de spécifier des opérations étape par étape, peut personnaliser le contenu des étapes, les boutons de confirmation et de retour ainsi que la direction de l'arrangement des étapes.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Stepper", + "desc": [ + "【steps】 : Liste des étapes 【List】", + "【currentStep】 : Étape actuelle 【double】", + "【onStepTapped】 : Rappel de clic 【ValueChanged】", + "【onStepCancel】 : Rappel de l'étape précédente 【VoidCallback】", + "【controlsBuilder】 : Constructeur de contrôleur 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direction de Stepper", + "desc": [ + "【type】 : Direction 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json new file mode 100644 index 00000000..064e5653 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente Passaggi", + "info": "Componente passaggi, consente di specificare operazioni passo-passo, personalizzare il contenuto dei passaggi, i pulsanti di conferma e ritorno, e la direzione dell'ordinamento dei passaggi.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Stepper", + "desc": [ + "【steps】 : Lista dei passaggi 【List】", + "【currentStep】 : Passaggio corrente 【double】", + "【onStepTapped】 : Callback al click 【ValueChanged】", + "【onStepCancel】 : Callback del passaggio precedente 【VoidCallback】", + "【controlsBuilder】 : Costruttore del controller 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direzione di Stepper", + "desc": [ + "【type】 : Direzione 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json new file mode 100644 index 00000000..9e768794 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "ステップコンポーネント", + "info": "ステップコンポーネントは、ステップごとの操作を指定でき、ステップの内容、確認と戻るボタン、およびステップの並び方向をカスタマイズできます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepperの基本使用", + "desc": [ + "【steps】 : ステップリスト 【List】", + "【currentStep】 : 現在のステップ 【double】", + "【onStepTapped】 : クリックコールバック 【ValueChanged】", + "【onStepCancel】 : 前のステップコールバック 【VoidCallback】", + "【controlsBuilder】 : コントローラー構築 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepperの方向", + "desc": [ + "【type】 : 方向 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json new file mode 100644 index 00000000..ea94ac5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "스텝 컴포넌트", + "info": "스텝 컴포넌트는 단계별 작업을 지정할 수 있으며, 스텝의 내용, 확인 및 뒤로 가기 버튼, 스텝 배열 방향을 사용자 정의할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepper 기본 사용", + "desc": [ + "【steps】 : 스텝 리스트 【List】", + "【currentStep】 : 현재 스텝 【double】", + "【onStepTapped】 : 클릭 콜백 【ValueChanged】", + "【onStepCancel】 : 이전 스텝 콜백 【VoidCallback】", + "【controlsBuilder】 : 컨트롤러 생성 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepper의 방향", + "desc": [ + "【type】 : 방향 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json new file mode 100644 index 00000000..9b918a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente de Passos", + "info": "Componente de passos, que permite especificar operações passo a passo, pode personalizar o conteúdo dos passos, os botões de confirmação e retorno, bem como a direção do arranjo dos passos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Stepper", + "desc": [ + "【steps】 : Lista de passos 【List】", + "【currentStep】 : Passo atual 【double】", + "【onStepTapped】 : Callback de clique 【ValueChanged】", + "【onStepCancel】 : Callback de passo anterior 【VoidCallback】", + "【controlsBuilder】 : Construtor de controlador 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direção do Stepper", + "desc": [ + "【type】 : Direção 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json new file mode 100644 index 00000000..ec410f0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Компонент шагов", + "info": "Компонент шагов, который позволяет указать шаги выполнения операций, можно настроить содержимое шагов, кнопки подтверждения и возврата, а также направление расположения шагов.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Stepper", + "desc": [ + "【steps】 : Список шагов 【List】", + "【currentStep】 : Текущий шаг 【double】", + "【onStepTapped】 : Обратный вызов при нажатии 【ValueChanged】", + "【onStepCancel】 : Обратный вызов для предыдущего шага 【VoidCallback】", + "【controlsBuilder】 : Конструктор контроллера 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Направление Stepper", + "desc": [ + "【type】 : Направление 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json new file mode 100644 index 00000000..23576b38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "步骤组件", + "info": "步骤组件,可指定一步步的操作,可以自定义步骤的内容,确认和返回的按钮以及步骤排列的方向。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepper基本使用", + "desc": [ + "【steps】 : 步骤列表 【List】", + "【currentStep】 : 当前步骤 【double】", + "【onStepTapped】 : 点击回调 【ValueChanged】", + "【onStepCancel】 : 上一步回调 【VoidCallback】", + "【controlsBuilder】 : 控制器构造 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepper的方向", + "desc": [ + "【type】 : 方向 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart new file mode 100644 index 00000000..6b2b2cfd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class StepperDemo extends StatefulWidget { + const StepperDemo({Key? key}) : super(key: key); + + @override + _StepperDemoState createState() => _StepperDemoState(); +} + +class _StepperDemoState extends State { + int _position = 0; + + final Map stepsData = { + "填写表单": '请按表单填写个人信息。', + "邮箱校验": '已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。', + "注册完成": '恭喜您,注册完成!', + }; + + final List steps = const [ + Step( + title: Text("填写表单"), + content: SizedBox(height: 60, child: Text("请按表单填写个人信息")), + ), + Step(title: Text("邮箱校验"), content: Text("请对您的账号进行邮箱校验")), + Step(title: Text("注册完成"), content: Text("恭喜您,注册完成")), + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Stepper( + type: StepperType.horizontal, + currentStep: _position, + onStepTapped: (index) { + setState(() { + _position = index; + }); + }, + onStepContinue: () { + setState(() { + if (_position < 2) { + _position++; + } + }); + }, + onStepCancel: () { + if (_position > 0) { + setState(() { + _position--; + }); + } + }, + controlsBuilder: (_, ControlsDetails details) { + return Row( + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + onPressed: details.onStepContinue, + child: const Icon( + Icons.check, + color: Colors.white, + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + onPressed: details.onStepCancel, + child: const Icon( + Icons.keyboard_backspace, + color: Colors.white, + ), + ), + ], + ); + }, + steps: stepsData.keys.map((e){ + bool isActive = stepsData.keys.toList().indexOf(e) ==_position; + return Step( + title: Text(e,style: TextStyle(color: isActive?Colors.blue:Colors.black),), + isActive: isActive, + state: _getState(stepsData.keys.toList().indexOf(e)), + content: SizedBox(height: 60, child: Text(stepsData[e]!)), + ); + }).toList()), + ); + } + + StepState _getState(index){ + if(_position==index) return StepState.editing; + if(_position>index) return StepState.complete; + return StepState.indexed; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart new file mode 100644 index 00000000..0b42e623 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class VerticalStepper extends StatefulWidget { + const VerticalStepper({Key? key}) : super(key: key); + + @override + _VerticalStepperState createState() => _VerticalStepperState(); +} + +class _VerticalStepperState extends State { + int _position = 0; + + final Map stepsData = { + "填写表单": '请按表单填写个人信息。', + "邮箱校验": '已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。', + "注册完成": '恭喜您,注册完成!', + }; + + final List steps = const[ + Step( + title: Text("填写表单"), + content: SizedBox(height: 60, child: Text("请按表单填写个人信息")), + ), + Step(title: Text("邮箱校验"), content: Text("请对您的账号进行邮箱校验")), + Step(title: Text("注册完成"), content: Text("恭喜您,注册完成")), + ]; + + @override + Widget build(BuildContext context) { + return Stepper( + type: StepperType.vertical, + currentStep: _position, + onStepTapped: (index) { + setState(() { + _position = index; + }); + }, + onStepContinue: () { + setState(() { + if (_position < 2) { + _position++; + } + }); + }, + onStepCancel: () { + if (_position > 0) { + setState(() { + _position--; + }); + } + }, + controlsBuilder: (_,ControlsDetails details) { + return Row( + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + onPressed: details.onStepContinue, + child: const Icon( + Icons.check, + color: Colors.white, + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + onPressed: details.onStepCancel, + child: const Icon( + Icons.keyboard_backspace, + color: Colors.white, + ), + ), + ], + ); + }, + steps: stepsData.keys.map((e) { + bool isActive = stepsData.keys.toList().indexOf(e) == _position; + return Step( + title: Text( + e, + style: TextStyle(color: isActive ? Colors.blue : Colors.black), + ), + isActive: isActive, + state: _getState(stepsData.keys.toList().indexOf(e)), + content: SizedBox(height: 60, child: Text(stepsData[e]!)), + ); + }).toList()); + } + + StepState _getState(index) { + if (_position == index) return StepState.editing; + if (_position > index) return StepState.complete; + return StepState.indexed; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json new file mode 100644 index 00000000..b344ba78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Stream-Builder", + "info": "Kann ein Stream-Objekt angeben, kann den Status der asynchronen Ausführung überwachen und im Builder verschiedene Benutzeroberflächen basierend auf dem Status erstellen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von StreamBuilder", + "desc": [ + "【stream】 : Unterkomponente 【Stream】", + "【initialData】 : Initiale Daten 【T】", + "【builder】 : Klickereignis 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json new file mode 100644 index 00000000..7a9c86d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Stream Builder", + "info": "Can specify a stream object, able to listen to the state of asynchronous execution, and build different interfaces in the constructor based on the state.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of StreamBuilder", + "desc": [ + "【stream】 : Child component 【Stream】", + "【initialData】 : Initial data 【T】", + "【builder】 : Click event 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json new file mode 100644 index 00000000..6720b0f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Constructor de Flujo", + "info": "Puede especificar un objeto stream, capaz de escuchar el estado de ejecución asíncrona y construir diferentes interfaces en el constructor según el estado.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de StreamBuilder", + "desc": [ + "【stream】 : componente hijo 【Stream】", + "【initialData】 : datos iniciales 【T】", + "【builder】 : evento de clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json new file mode 100644 index 00000000..f61d970b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Constructeur de flux", + "info": "Peut spécifier un objet stream, capable de surveiller l'état d'exécution asynchrone et de construire différentes interfaces dans le constructeur en fonction de l'état.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de StreamBuilder", + "desc": [ + "【stream】 : composant enfant 【Stream】", + "【initialData】 : données initiales 【T】", + "【builder】 : événement de clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json new file mode 100644 index 00000000..3d550c1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Costruttore di Flusso", + "info": "Può specificare un oggetto stream, in grado di monitorare lo stato dell'esecuzione asincrona e costruire diverse interfacce nel costruttore in base allo stato.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di StreamBuilder", + "desc": [ + "【stream】 : Componente figlio 【Stream】", + "【initialData】 : Dati iniziali 【T】", + "【builder】 : Evento di clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json new file mode 100644 index 00000000..bc75ba75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "ストリームビルダー", + "info": "ストリームオブジェクトを指定でき、非同期実行の状態を監視し、ビルダー内で状態に応じて異なるインターフェースを構築できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilderの基本使用", + "desc": [ + "【stream】 : 子コンポーネント 【Stream】", + "【initialData】 : 初期データ 【T】", + "【builder】 : クリックイベント 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json new file mode 100644 index 00000000..9731100a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "스트림 빌더", + "info": "스트림 객체를 지정할 수 있으며, 비동기 실행 상태를 감시하고, 빌더에서 상태에 따라 다른 인터페이스를 구성할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilder 기본 사용", + "desc": [ + "【stream】 : 자식 컴포넌트 【Stream】", + "【initialData】 : 초기 데이터 【T】", + "【builder】 : 클릭 이벤트 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json new file mode 100644 index 00000000..e56a75c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Construtor de Fluxo", + "info": "Pode especificar um objeto stream, capaz de monitorar o estado da execução assíncrona e construir diferentes interfaces no construtor com base no estado.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do StreamBuilder", + "desc": [ + "【stream】 : Componente Filho 【Stream】", + "【initialData】 : Dados Iniciais 【T】", + "【builder】 : Evento de Clique 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json new file mode 100644 index 00000000..03020df1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Потоковый конструктор", + "info": "Можно указать объект stream, который может отслеживать состояние асинхронного выполнения и строить различные интерфейсы в конструкторе в зависимости от состояния.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование StreamBuilder", + "desc": [ + "【stream】 : Дочерний компонент 【Stream】", + "【initialData】 : Начальные данные 【T】", + "【builder】 : Событие клика 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json new file mode 100644 index 00000000..f6be1cc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "流构造器", + "info": "可指定一个stream对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilder基本使用", + "desc": [ + "【stream】 : 子组件 【Stream】", + "【initialData】 : 初始数据 【T】", + "【builder】 : 点击事件 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart new file mode 100644 index 00000000..2abad565 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart @@ -0,0 +1,101 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomStreamBuilder extends StatefulWidget { + const CustomStreamBuilder({Key? key}) : super(key: key); + + @override + _CustomStreamBuilderState createState() => _CustomStreamBuilderState(); +} + +class _CustomStreamBuilderState extends State { + final CountGenerator _generator = CountGenerator()..increment(); + + @override + void dispose() { + _generator.dispose(); //关闭控制器 + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + child: const Icon( + Icons.add, + color: Colors.white, + ), + onPressed: () async { + await _generator.increment(); + }, + ), + _buildStreamBuilder(), + ElevatedButton( + style: ElevatedButton.styleFrom( + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + child: const Icon( + Icons.remove, + color: Colors.white, + ), + onPressed: () async { + await _generator.minus(); + }, + ), + ], + ); + } + + Widget _buildStreamBuilder() => StreamBuilder( + stream: _generator.state, + builder: (BuildContext context, AsyncSnapshot snap) { + print(snap); + if (snap.connectionState == ConnectionState.done) { + return const Text('Done'); + } + if (snap.connectionState == ConnectionState.active) { + return Text( + snap.data.toString(), + style: Theme.of(context).textTheme.bodyMedium, + ); + } + if (snap.connectionState == ConnectionState.waiting) { + return const CircularProgressIndicator(); + } + if (snap.hasError) { + return const Text('Error'); + } + return Container(); + }); +} + +class CountGenerator { + int _count = 0; //计数器数据 + final StreamController _controller = StreamController(); //控制器 + + Stream get state => _controller.stream; //获取状态流 + int get count => _count; //获取计数器数据 + + void dispose() {//关闭控制器 + _controller.close(); + } + + Future increment() async {//增加记数方法 + _controller.add(++_count); + } + + Future minus() async {//增加记数方法 + _controller.add(--_count); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json new file mode 100644 index 00000000..a11d67fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Schalter", + "info": "Umschaltknopf, häufig für Konfigurationswechsel verwendet, kann die Farbe des kleinen Kreises, Bilder, Farbe der Gleitschiene usw. angeben, empfängt Rückrufe bei Zustandsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Switch", + "desc": [ + "【inactiveThumbColor】 : Farbe des nicht ausgewählten kleinen Kreises 【Color】", + "【inactiveTrackColor】 : Farbe der nicht ausgewählten Gleitschiene 【Color】", + "【activeColor】 : Farbe des ausgewählten kleinen Kreises 【Color】", + "【activeTrackColor】 : Farbe der ausgewählten Gleitschiene 【Color】", + "【onChanged】 : Umschalt-Rückruf 【Function(double)】", + "Bei onChanged werden drei Zustände zurückgerufen: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch Bild", + "desc": [ + "【inactiveThumbImage】 : Bild des nicht ausgewählten kleinen Kreises 【ImageProvider】", + "【activeThumbImage】 : Bild des ausgewählten kleinen Kreises 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json new file mode 100644 index 00000000..224367a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Toggle Button", + "info": "Toggle button, commonly used for configuration switching, can specify small circle color, image, track color, etc., and receives state change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Switch", + "desc": [ + "【inactiveThumbColor】 : Unselected small circle color 【Color】", + "【inactiveTrackColor】 : Unselected track color 【Color】", + "【activeColor】 : Selected small circle color 【Color】", + "【activeTrackColor】 : Selected track color 【Color】", + "【onChanged】 : Toggle callback 【Function(double)】", + "When onChanged, callbacks for true, null, and false states" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch Image", + "desc": [ + "【inactiveThumbImage】 : Unselected small circle image 【ImageProvider】", + "【activeThumbImage】 : Selected small circle image 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json new file mode 100644 index 00000000..f05a37f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Interruptor", + "info": "Interruptor de selección, comúnmente utilizado para cambiar configuraciones, puede especificar el color del círculo pequeño, la imagen, el color de la ranura, etc., y recibe una devolución de llamada para cambios de estado.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Switch", + "desc": [ + "【inactiveThumbColor】 : Color del círculo pequeño no seleccionado 【Color】", + "【inactiveTrackColor】 : Color de la ranura no seleccionada 【Color】", + "【activeColor】 : Color del círculo pequeño seleccionado 【Color】", + "【activeTrackColor】 : Color de la ranura seleccionada 【Color】", + "【onChanged】 : Devolución de llamada de cambio 【Function(double)】", + " En onChanged, devuelve tres estados: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Imagen de Switch", + "desc": [ + "【inactiveThumbImage】 : Imagen del círculo pequeño no seleccionado 【ImageProvider】", + "【activeThumbImage】 : Imagen del círculo pequeño seleccionado 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json new file mode 100644 index 00000000..dd1fa7bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Bouton de commutation", + "info": "Bouton de commutation, souvent utilisé pour changer les configurations, peut spécifier la couleur du petit cercle, l'image, la couleur de la glissière, etc., et reçoit un rappel de changement d'état.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Switch", + "desc": [ + "【inactiveThumbColor】 : Couleur du petit cercle non sélectionné 【Color】", + "【inactiveTrackColor】 : Couleur de la glissière non sélectionnée 【Color】", + "【activeColor】 : Couleur du petit cercle sélectionné 【Color】", + "【activeTrackColor】 : Couleur de la glissière sélectionnée 【Color】", + "【onChanged】 : Rappel de commutation 【Function(double)】", + " Lors de onChanged, rappelle trois états : true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Image de Switch", + "desc": [ + "【inactiveThumbImage】 : Image du petit cercle non sélectionné 【ImageProvider】", + "【activeThumbImage】 : Image du petit cercle sélectionné 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json new file mode 100644 index 00000000..70dedac9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Interruttore", + "info": "Interruttore per la commutazione, spesso utilizzato per il cambio di configurazione, può specificare il colore del cerchio, l'immagine, il colore della scanalatura, ecc., riceve un callback per i cambiamenti di stato.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Switch", + "desc": [ + "【inactiveThumbColor】 : Colore del cerchio non selezionato 【Color】", + "【inactiveTrackColor】 : Colore della scanalatura non selezionata 【Color】", + "【activeColor】 : Colore del cerchio selezionato 【Color】", + "【activeTrackColor】 : Colore della scanalatura selezionata 【Color】", + "【onChanged】 : Callback di commutazione 【Function(double)】\"", + " Durante onChanged, il callback restituisce tre stati: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Immagine di Switch", + "desc": [ + "【inactiveThumbImage】 : Immagine del cerchio non selezionato 【ImageProvider】", + "【activeThumbImage】 : Immagine del cerchio selezionato 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json new file mode 100644 index 00000000..0955a1a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "スイッチ", + "info": "トグルボタンを切り替えます。設定の切り替えによく使用され、小さな円の色や画像、スライドトラックの色などを指定できます。状態変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switchの基本的な使い方", + "desc": [ + "【inactiveThumbColor】 : 未選択時の小さな円の色 【Color】", + "【inactiveTrackColor】 : 未選択時のスライドトラックの色 【Color】", + "【activeColor】 : 選択時の小さな円の色 【Color】", + "【activeTrackColor】 : 選択時のスライドトラックの色 【Color】", + "【onChanged】 : 切り替えコールバック 【Function(double)】", + " onChanged時、true、null、falseの3つの状態をコールバックします" + ] + }, + { + "file": "node2_image.dart", + "name": "Switchの画像", + "desc": [ + "【inactiveThumbImage】 : 未選択時の小さな円の画像 【ImageProvider】", + "【activeThumbImage】 : 選択時の小さな円の画像 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json new file mode 100644 index 00000000..ebaf48ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "스위치", + "info": "선택 버튼 전환, 주로 설정 전환에 사용되며, 작은 원의 색상, 이미지, 슬롯 색상 등을 지정할 수 있으며, 상태 변화 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switch 기본 사용법", + "desc": [ + "【inactiveThumbColor】 : 선택되지 않은 작은 원 색상 【Color】", + "【inactiveTrackColor】 : 선택되지 않은 슬롯 색상 【Color】", + "【activeColor】 : 선택된 작은 원 색상 【Color】", + "【activeTrackColor】 : 선택된 슬롯 색상 【Color】", + "【onChanged】 : 전환 콜백 【Function(double)】\"", + " onChanged 시, true, null, false 세 가지 상태를 콜백합니다." + ] + }, + { + "file": "node2_image.dart", + "name": "Switch 이미지", + "desc": [ + "【inactiveThumbImage】 : 선택되지 않은 작은 원 이미지 【ImageProvider】", + "【activeThumbImage】 : 선택된 작은 원 이미지 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json new file mode 100644 index 00000000..922b3f17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Botão de Alternar", + "info": "Botão de alternar, frequentemente usado para alternar configurações, pode especificar a cor do círculo pequeno, imagem, cor da faixa deslizante, etc., e recebe uma chamada de retorno para mudanças de estado.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Switch", + "desc": [ + "【inactiveThumbColor】 : Cor do círculo pequeno quando não selecionado 【Color】", + "【inactiveTrackColor】 : Cor da faixa deslizante quando não selecionada 【Color】", + "【activeColor】 : Cor do círculo pequeno quando selecionado 【Color】", + "【activeTrackColor】 : Cor da faixa deslizante quando selecionada 【Color】", + "【onChanged】 : Chamada de retorno para alternar 【Function(double)】\"", + " Quando onChanged, retorna três estados: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Imagem do Switch", + "desc": [ + "【inactiveThumbImage】 : Imagem do círculo pequeno quando não selecionado 【ImageProvider】", + "【activeThumbImage】 : Imagem do círculo pequeno quando selecionado 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json new file mode 100644 index 00000000..b4c01d16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Переключатель", + "info": "Переключатель, часто используется для изменения настроек, можно указать цвет маленького круга, изображение, цвет дорожки и т.д., принимает обратный вызов при изменении состояния.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Базовое использование Switch", + "desc": [ + "【inactiveThumbColor】 : Цвет маленького круга в неактивном состоянии 【Color】", + "【inactiveTrackColor】 : Цвет дорожки в неактивном состоянии 【Color】", + "【activeColor】 : Цвет маленького круга в активном состоянии 【Color】", + "【activeTrackColor】 : Цвет дорожки в активном состоянии 【Color】", + "【onChanged】 : Обратный вызов при переключении 【Function(double)】", + " При onChanged, обратный вызов возвращает три состояния: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Изображение Switch", + "desc": [ + "【inactiveThumbImage】 : Изображение маленького круга в неактивном состоянии 【ImageProvider】", + "【activeThumbImage】 : Изображение маленького круга в активном состоянии 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json new file mode 100644 index 00000000..c034cac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "切钮", + "info": "切换选钮,常用于配置的切换,可指定小圆颜色、图片,滑槽颜色等,接收状态变化回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switch基础用法", + "desc": [ + "【inactiveThumbColor】 : 未选中小圈颜色 【Color】", + "【inactiveTrackColor】 : 未选中滑槽颜色 【Color】", + "【activeColor】 : 选中时小圈颜色 【Color】", + "【activeTrackColor】 : 选中时滑槽颜色 【Color】", + "【onChanged】 : 切换回调 【Function(double)】\"", + " onChanged时,回调true、null、false三种状态" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch图片", + "desc": [ + "【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】", + "【activeThumbImage】 : 选中小圈图片 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart new file mode 100644 index 00000000..7ba534a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-14 +/// contact me by email 1981462002@qq.com + +class CustomSwitch extends StatefulWidget { + const CustomSwitch({Key? key}) : super(key: key); + + @override + _CustomSwitchState createState() => _CustomSwitchState(); +} + +class _CustomSwitchState extends State { + final List colors = const[ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + bool _checked = false; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: colors + .map((e) => Switch( + value: _checked, + inactiveThumbColor: e, + inactiveTrackColor: Colors.grey.withAlpha(88), + activeColor: Colors.green, + activeTrackColor: Colors.orange, + onChanged: (v) { + setState(() => _checked = v); + })) + .toList(), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart new file mode 100644 index 00000000..5487e25f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-14 +/// contact me by email 1981462002@qq.com + +class ImageSwitch extends StatefulWidget { + const ImageSwitch({Key? key}) : super(key: key); + + @override + _ImageSwitchState createState() => _ImageSwitchState(); +} + +class _ImageSwitchState extends State { + final List imgs = const [ + "assets/images/head_icon/icon_5.webp", + "assets/images/head_icon/icon_6.webp", + "assets/images/head_icon/icon_7.webp", + "assets/images/head_icon/icon_8.webp" + ]; + bool _checked = false; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: imgs + .map((e) => + Switch( + value: _checked, + inactiveThumbImage: AssetImage(e), + activeThumbImage: const AssetImage('assets/images/icon_head.webp'), + onChanged: (v) { + setState(() => _checked = v); + })) + .toList(), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json new file mode 100644 index 00000000..d3a0a2e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Tab", + "info": "Wird normalerweise mit TabBar verwendet, um den Slide-Effekt zu erzielen. Wird normalerweise nicht allein verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView muss mit TabBar verwendet werden", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Kinder 【Indikatorfarbe】", + "【physics】 : Verhalten 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json new file mode 100644 index 00000000..3d8755bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Tab Page", + "info": "Usually used in conjunction with TabBar to achieve the effect of sliding pages. It is generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView needs to be used in conjunction with TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Children 【Indicator Color】", + "【physics】 : Behavior 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json new file mode 100644 index 00000000..4038a99d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Pestañas", + "info": "Normalmente se usa junto con TabBar para lograr un efecto de deslizamiento de páginas. Generalmente no se usa por separado.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView debe usarse junto con TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【children】 : Hijos 【Color del indicador】", + "【physics】 : Comportamiento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json new file mode 100644 index 00000000..5749b458 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Onglets", + "info": "Généralement utilisé avec TabBar pour réaliser un effet de glissement de pages. Il n'est généralement pas utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView doit être utilisé avec TabBar", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【children】 : Enfants 【Couleur de l'indicateur】", + "【physics】 : Comportement 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json new file mode 100644 index 00000000..d9855ddb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Schede", + "info": "Generalmente utilizzato insieme a TabBar per ottenere un effetto di scorrimento delle pagine. Di solito non viene utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView deve essere utilizzato insieme a TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Figli 【Colore dell'indicatore】", + "【physics】 : Comportamento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json new file mode 100644 index 00000000..747d2d1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "タブビュー", + "info": "通常はTabBarと一緒に使用し、スライドページの効果を実現します。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarViewはTabBarと一緒に使用する必要があります", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【children】 : 子供たち 【インジケーターカラー】", + "【physics】 : パフォーマンス 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json new file mode 100644 index 00000000..1202916c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "탭 뷰", + "info": "일반적으로 TabBar와 함께 사용되어 페이지 슬라이딩 효과를 구현합니다. 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView는 TabBar와 함께 사용해야 합니다", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【children】 : 자식들 【인디케이터 색상】", + "【physics】 : 동작 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json new file mode 100644 index 00000000..53848ce7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Separador de Páginas", + "info": "Geralmente usado em conjunto com o TabBar para alcançar o efeito de deslizar páginas. Normalmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView precisa ser usado em conjunto com o TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【children】 : Crianças 【Cor do indicador】", + "【physics】 : Comportamento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json new file mode 100644 index 00000000..542c10f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Вкладки", + "info": "Обычно используется вместе с TabBar для реализации эффекта скольжения страниц. Обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView должен использоваться вместе с TabBar", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【children】 : Дети 【Цвет индикатора】", + "【physics】 : Поведение 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json new file mode 100644 index 00000000..8e7388e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "标签页", + "info": "通常与TabBar联用,实现滑页的效果。一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView需要与TabBar联用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【children】 : 孩子们 【指示器颜色】", + "【physics】 : 表现 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart new file mode 100644 index 00000000..9e5a3e7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomTabBarView extends StatefulWidget { + const CustomTabBarView({Key? key}) : super(key: key); + + @override + _CustomTabBarViewState createState() => _CustomTabBarViewState(); +} + +class _CustomTabBarViewState extends State with SingleTickerProviderStateMixin { + final List tabs = const [ + '风画庭', + '雨韵舍', + '雷鸣殿', + '电疾堂', + '霜寒阁', + '雪月楼', + ]; + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(vsync: this, length: tabs.length); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildTabBar(), + Container( + color: Colors.purple, + width: MediaQuery.of(context).size.width, + height: 200, + child: _buildTableBarView()) + ], + ); + } + + Widget _buildTabBar() => TabBar( + onTap: (tab) => print(tab), + labelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + unselectedLabelStyle: const TextStyle(fontSize: 16), + isScrollable: true, + controller: _tabController, + labelColor: Colors.blue, + indicatorWeight: 3, + indicatorPadding: const EdgeInsets.symmetric(horizontal: 10), + unselectedLabelColor: Colors.grey, + indicatorColor: Colors.orangeAccent, + tabs: tabs.map((e) => Tab(text: e)).toList(), + ); + + Widget _buildTableBarView() => TabBarView( + controller: _tabController, + children: tabs.map((e) => Center( + child: Text( + e, + style: const TextStyle( + color: Colors.white, + fontSize: 20, + ), + ))).toList()); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json new file mode 100644 index 00000000..7391d0cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Tabellen-Wasserwellen", + "info": "Kann nur für Tabellen-Wasserwellen verwendet werden, empfängt Klick-, Doppelklick-, Langklick- und Hervorhebungsänderungsereignisse. Die Wasserwellen wirken auf eine Tabellenzeile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell grundlegende Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onLongPress】 : Langklickereignis 【Function()】", + "【onHighlightChanged】 : Hervorhebungsänderungsrückruf 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json new file mode 100644 index 00000000..e2d8c29c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Table Ripple", + "info": "Can only be used for Table's ripple, receives click, double-click, long-press, and highlight change events, the ripple will be applied to a row of the table.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell Basic Events", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Click event 【Function()】", + "【onDoubleTap】 : Double-click event 【Function()】", + "【onLongPress】 : Long-press event 【Function()】", + "【onHighlightChanged】 : Highlight change callback 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json new file mode 100644 index 00000000..cbdd77c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Onda de tabla", + "info": "Solo se puede usar para la onda de la tabla, recibe eventos de clic, doble clic, pulsación larga y cambios de resaltado, la onda actuará en una fila de la tabla.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de TableRowInkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json new file mode 100644 index 00000000..184c2508 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Ondulation de Tableau", + "info": "Utilisé uniquement pour les ondulations dans un Tableau, reçoit les événements de clic, double-clic, appui long et changement de surbrillance, l'ondulation s'applique à une ligne du tableau.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de TableRowInkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【Function()】", + "【onLongPress】 : Événement d'appui long 【Function()】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json new file mode 100644 index 00000000..63bc0fda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Effetto Riga Tabella", + "info": "Può essere utilizzato solo per l'effetto ondulato nelle tabelle, riceve eventi di clic, doppio clic, pressione prolungata e cambiamenti di evidenziazione, l'effetto ondulato agirà su una riga della tabella.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi Base di TableRowInkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】", + "【onHighlightChanged】 : Callback di cambiamento di evidenziazione 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json new file mode 100644 index 00000000..0c36282f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "テーブル波紋", + "info": "Table専用の波紋で、クリック、ダブルクリック、長押し、ハイライト変更イベントを受け取り、波紋はテーブルの一行に作用します。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json new file mode 100644 index 00000000..236a4c40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "테이블 물결 효과", + "info": "Table에서만 사용 가능한 물결 효과로, 클릭, 더블 클릭, 롱 프레스, 하이라이트 변경 이벤트를 받습니다. 물결 효과는 테이블의 한 행에 적용됩니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【Function()】", + "【onLongPress】 : 롱 프레스 이벤트 【Function()】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json new file mode 100644 index 00000000..d107384f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Onda de tinta da tabela", + "info": "Só pode ser usado para a onda de tinta da tabela, recebe eventos de clique, duplo clique, pressão longa e mudança de destaque, a onda de tinta será aplicada a uma linha da tabela.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos do TableRowInkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onLongPress】 : Evento de pressão longa 【Function()】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json new file mode 100644 index 00000000..0cd39d75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Табличная волна", + "info": "Может использоваться только для волны в таблице, принимает события нажатия, двойного нажатия, длительного нажатия и изменения подсветки, волна будет применяться к строке таблицы.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события TableRowInkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onLongPress】 : Событие длительного нажатия 【Function()】", + "【onHighlightChanged】 : Обратный вызов изменения подсветки 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json new file mode 100644 index 00000000..47f41a15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "表格水波纹", + "info": "只能用于Table的水波纹,接收点击、双击、长按、高亮变化事件,水波纹会作用于表格的一行。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onLongPress】 : 长按事件 【Function()】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart new file mode 100644 index 00000000..ef2758b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomTableRowInkWell extends StatelessWidget { + const CustomTableRowInkWell({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); + _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); + _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); + _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); + _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); + _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); + _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); + _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); + + List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; + + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Table( + columnWidths: const { + 0: FixedColumnWidth(80.0), + 1: FixedColumnWidth(80.0), + 2: FixedColumnWidth(80.0), + 3: FixedColumnWidth(80.0), + 4: FixedColumnWidth(80.0), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + border: TableBorder.all( + color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), + children: data + .map((item) => TableRow(children: [ + TableRowInkWell( + onTap: () => print('onTap'), + onDoubleTap: () => print('onDoubleTap'), + onLongPress: () => print('onLongPress'), + onHighlightChanged: (v) => print('onHighlightChanged:$v'), + child: Center( + child: Text( + item.name, + style: const TextStyle(color: Colors.blue), + )), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.symbol)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unitSymbol)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unitName)), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: Text(item.unit)), + ), + ])) + .toList(), + ), + ); + } +} + +class _ItemBean { + String name; + String symbol; + String unit; + String unitName; + String unitSymbol; + + _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json new file mode 100644 index 00000000..b7714bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Textschaltfläche", + "info": "Materialstil-Textschaltfläche, standardmäßig nur mit Text, bei Klick mit Wasserwelleneffekt. Eigenschaften wie Rahmen, Farbe, Schatten können durch Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextButton", + "desc": [ + "【child】 : Hat es ein scrollbares Hauptelement 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langklickereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton-Stil", + "desc": [ + "【style】 : Schaltflächenstil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Beschneidungsverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json new file mode 100644 index 00000000..779529c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Text Button", + "info": "A Material-style text button, which only has text by default, and has a ripple effect when clicked. The border, color, shadow and other properties can be changed through styles.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextButton", + "desc": [ + "【child】 : Whether it has a scrollable body 【Widget】", + "【onPressed】 : Click event 【VoidCallback】", + "【onLongPress】 : Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton Style", + "desc": [ + "【style】 : Button style 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Clip behavior 【Clip】", + "【autofocus】 : Auto focus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json new file mode 100644 index 00000000..b78784bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Botón de texto", + "info": "Botón de texto con estilo Material, por defecto solo tiene texto y tiene un efecto de onda al hacer clic. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., a través del estilo.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextButton", + "desc": [ + "【child】 : ¿Tiene un cuerpo de desplazamiento? 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación larga 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de TextButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json new file mode 100644 index 00000000..7d96e6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Bouton texte", + "info": "Bouton texte de style Material, par défaut uniquement du texte, avec un effet de vague lors du clic. Les propriétés telles que la bordure, la couleur, l'ombre, etc., peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextButton", + "desc": [ + "【child】 : Si le corps peut défiler 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de maintien 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style de TextButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json new file mode 100644 index 00000000..241b16dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Pulsante di testo", + "info": "Pulsante di testo in stile Material, di default ha solo testo e un effetto onda al clic. È possibile modificare bordi, colori, ombre e altre proprietà attraverso lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TextButton", + "desc": [ + "【child】 : Se ha un corpo scorrevole 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di TextButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json new file mode 100644 index 00000000..70633f0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "テキストボタン", + "info": "Materialスタイルのテキストボタンで、デフォルトではテキストのみが表示され、クリック時に波紋効果があります。スタイルを変更することで、枠線、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButtonの基本的な使用", + "desc": [ + "【child】 : スクロール主体を持つかどうか 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json new file mode 100644 index 00000000..ccb14497 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "텍스트 버튼", + "info": "Material 스타일의 텍스트 버튼으로, 기본적으로 텍스트만 있으며 클릭 시 물결 효과가 있습니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButton 기본 사용법", + "desc": [ + "【child】 : 스크롤 가능한 주체 여부 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json new file mode 100644 index 00000000..17a48bce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Botão de texto", + "info": "Botão de texto no estilo Material, por padrão só tem texto, com efeito de ondulação ao clicar. Pode alterar propriedades como borda, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do TextButton", + "desc": [ + "【child】 : Se tem um corpo de rolagem 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressionar longo 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do TextButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json new file mode 100644 index 00000000..b2ae2d6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Текстовая кнопка", + "info": "Текстовая кнопка в стиле Material, по умолчанию имеет только текст, при нажатии появляется эффект волны. Можно изменить свойства границы, цвета, тени и другие через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextButton", + "desc": [ + "【child】 : Имеет ли прокручиваемое содержимое 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль TextButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json new file mode 100644 index 00000000..73589c97 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "文字按钮", + "info": "Material风格的文字按钮,默认只有文字,点击时有水波纹。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButton基本使用", + "desc": [ + "【child】 : 是否具有滚动主体 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart new file mode 100644 index 00000000..0b8383a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class TextButtonDemo extends StatelessWidget { + const TextButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + height: 60, + child: Wrap( + spacing: 20, + children: [ + TextButton( + child: const Text('TextButton 文字'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + const TextButton( + child: Text('TextButton 禁用'), + onPressed: null, + onLongPress: null, + ), + ], + )); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart new file mode 100644 index 00000000..d5a62004 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class TextButtonStyleDemo extends StatelessWidget { + const TextButtonStyleDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + child: Wrap( + spacing: 10, + children: [ + TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + padding: const EdgeInsets.symmetric(horizontal: 8), + foregroundColor: Colors.white, + elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('TextButton 样式'), + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + side: const BorderSide(color: Colors.blue, width: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + // elevation: 2, + shadowColor: Colors.orangeAccent), + child: const Text('TextButton 边线'), + autofocus: false, + onPressed: _onPressed, + onLongPress: _onLongPress, + ), + ], + ), + ); + } + + void _onPressed() {} + + void _onLongPress() {} +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json new file mode 100644 index 00000000..a5be0cb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Eingabefeld", + "info": "Eine Komponente zur Eingabe mit komplexen Eigenschaften. Kann Controller, Textstil, Dekorationslinien, Zeilenbeschränkungen, Cursor-Stil usw. angeben. Empfängt Ereignisse wie Eingabeänderungen und Eingabeabschluss.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Textstil 【TextStyle】", + "【decoration】 : Dekorationslinie 【InputDecoration】", + "【onEditingComplete】 : Ereignis bei Eingabeabschluss 【Function()】", + "【onSubmitted】 : Ereignis bei Übermittlung 【Function(String)】", + "【onChanged】 : Ereignis bei Eingabe 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Zeilenanzahl und Cursor von TextField", + "desc": [ + "【minLines】 : Minimale Zeilenanzahl 【int】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【cursorRadius】 : Cursor-Radius 【Radius】", + "【cursorColor】 : Cursor-Farbe 【Color】", + "【cursorWidth】 : Cursor-Breite 【double】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【autofocus】 : Automatischer Fokus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Komplexe Dekoration von InputDecoration", + "desc": [ + "InputDecoration hat viele Dekorationspunkte, siehe Code für Details:", + "border: Bezogen auf den Rand", + "helper: Bezogen auf die Hinweise unten links", + "counter: Bezogen auf die Hinweise unten rechts", + "prefix: Ganz links innerhalb des Eingabefelds", + "suffix: Ganz rechts innerhalb des Eingabefelds", + "label: Text ohne Fokus", + "label: Text ohne Fokus", + "hint: Bezogen auf Hinweistext", + "border: Bezogen auf den Rand" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json new file mode 100644 index 00000000..f84e35c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Input Box", + "info": "A component for input, with complex properties. Can specify controller, text style, decoration, line limit, cursor style, etc. Receives input change, input completion, and other events.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Text Style 【TextStyle】", + "【decoration】 : Decoration 【InputDecoration】", + "【onEditingComplete】 : Input Completion Event 【Function()】", + "【onSubmitted】 : Submission Event 【Function(String)】", + "【onChanged】 : Input Event 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Line Number and Cursor of TextField", + "desc": [ + "【minLines】 : Minimum Lines 【int】", + "【maxLines】 : Maximum Lines 【int】", + "【cursorRadius】 : Cursor Radius 【Radius】", + "【cursorColor】 : Cursor Color 【Color】", + "【cursorWidth】 : Cursor Width 【double】", + "【showCursor】 : Whether to Show Cursor 【bool】", + "【autofocus】 : Auto Focus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Complex Decoration of Decoration", + "desc": [ + "InputDecoration has many decoration points, corresponding to the code:", + "border: Border related", + "helper: Bottom left corner related hints", + "counter: Bottom right corner related hints", + "prefix: Innermost left side of the input box", + "suffix: Innermost right side of the input box", + "label: Text when no focus", + "label: Text when no focus", + "hint: Hint text related", + "border: Border related" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json new file mode 100644 index 00000000..90168ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo de texto", + "info": "Componente de entrada con propiedades complejas. Puede especificar controladores, estilos de texto, decoraciones de línea, límites de líneas, estilos de cursor, etc. Recibe eventos de cambio de entrada, finalización de entrada, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextField", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【style】 : Estilo de texto 【TextStyle】", + "【decoration】 : Decoración de línea 【InputDecoration】", + "【onEditingComplete】 : Evento de finalización de entrada 【Function()】", + "【onSubmitted】 : Evento de envío 【Function(String)】", + "【onChanged】 : Evento de entrada 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Número de líneas y cursor de TextField", + "desc": [ + "【minLines】 : Número mínimo de líneas 【int】", + "【maxLines】 : Número máximo de líneas 【int】", + "【cursorRadius】 : Radio del cursor 【Radius】", + "【cursorColor】 : Color del cursor 【Color】", + "【cursorWidth】 : Ancho del cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Enfoque automático 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decoración compleja de decoration", + "desc": [ + "InputDecoration tiene muchos puntos de decoración, consulte el código para los detalles:", + "border: Relacionado con el borde", + "helper: Sugerencia en la esquina inferior izquierda", + "counter: Sugerencia en la esquina inferior derecha", + "prefix: Interior del campo de texto, extremo izquierdo", + "suffix: Interior del campo de texto, extremo derecho", + "label: Texto sin foco", + "label: Texto sin foco", + "hint: Relacionado con el texto de sugerencia", + "border: Relacionado con el borde" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json new file mode 100644 index 00000000..f612657e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Champ de saisie", + "info": "Composant pour la saisie, possédant des propriétés complexes. Peut spécifier un contrôleur, un style de texte, une décoration de ligne, une limite de lignes, un style de curseur, etc. Reçoit des événements de changement de saisie, de saisie terminée, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextField", + "desc": [ + "【controller】 : Contrôleur 【TextEditingController】", + "【style】 : Style de texte 【TextStyle】", + "【decoration】 : Décoration de ligne 【InputDecoration】", + "【onEditingComplete】 : Événement de saisie terminée 【Function()】", + "【onSubmitted】 : Événement de soumission 【Function(String)】", + "【onChanged】 : Événement de saisie 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Nombre de lignes et curseur de TextField", + "desc": [ + "【minLines】 : Nombre minimal de lignes 【int】", + "【maxLines】 : Nombre maximal de lignes 【int】", + "【cursorRadius】 : Rayon du curseur 【Radius】", + "【cursorColor】 : Couleur du curseur 【Color】", + "【cursorWidth】 : Largeur du curseur 【double】", + "【showCursor】 : Afficher le curseur 【bool】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Décoration complexe de InputDecoration", + "desc": [ + "InputDecoration a de nombreux points de décoration, voir le code pour les détails:", + "border: Relatif à la bordure", + "helper: Indication en bas à gauche", + "counter: Indication en bas à droite", + "prefix: Partie la plus à gauche à l'intérieur du champ de saisie", + "suffix: Partie la plus à droite à l'intérieur du champ de saisie", + "label: Texte sans focus", + "label: Texte sans focus", + "hint: Relatif au texte d'indication", + "border: Relatif à la bordure" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json new file mode 100644 index 00000000..87050f76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo di testo", + "info": "Componente per l'input, con proprietà complesse. Puoi specificare il controller, lo stile del testo, la decorazione della linea, il limite di righe, lo stile del cursore, ecc. Riceve eventi di cambiamento dell'input, completamento dell'input, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Stile del testo 【TextStyle】", + "【decoration】 : Decorazione della linea 【InputDecoration】", + "【onEditingComplete】 : Evento di completamento dell'input 【Function()】", + "【onSubmitted】 : Evento di invio 【Function(String)】", + "【onChanged】 : Evento di input 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Numero di righe e cursore di TextField", + "desc": [ + "【minLines】 : Numero minimo di righe 【int】", + "【maxLines】 : Numero massimo di righe 【int】", + "【cursorRadius】 : Raggio del cursore 【Radius】", + "【cursorColor】 : Colore del cursore 【Color】", + "【cursorWidth】 : Larghezza del cursore 【double】", + "【showCursor】 : Mostrare il cursore 【bool】", + "【autofocus】 : Autofocus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decorazione complessa di decoration", + "desc": [ + "InputDecoration ha molti punti di decorazione, i dettagli sono nel codice:", + "border: Relativo al bordo", + "helper: Suggerimento nell'angolo inferiore sinistro", + "counter: Suggerimento nell'angolo inferiore destro", + "prefix: Parte più interna a sinistra del campo di input", + "suffix: Parte più interna a destra del campo di input", + "label: Testo senza focus", + "label: Testo senza focus", + "hint: Relativo al testo di suggerimento", + "border: Relativo al bordo" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json new file mode 100644 index 00000000..a77554df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "入力欄", + "info": "入力用のコンポーネントで、複雑な属性を持っています。コントローラー、テキストスタイル、装飾線、行数制限、カーソルスタイルなどを指定できます。入力の変化、入力完了などのイベントを受け取ります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFieldの基本使用法", + "desc": [ + "【controller】 : コントローラー 【TextEditingController】", + "【style】 : テキストスタイル 【TextStyle】", + "【decoration】 : 装飾線 【InputDecoration】", + "【onEditingComplete】 : 入力完了イベント 【Function()】", + "【onSubmitted】 : 送信イベント 【Function(String)】", + "【onChanged】 : 入力イベント 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextFieldの行数とカーソル", + "desc": [ + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【cursorRadius】 : カーソルの半径 【Radius】", + "【cursorColor】 : カーソルの色 【Color】", + "【cursorWidth】 : カーソルの幅 【double】", + "【showCursor】 : カーソルを表示するかどうか 【bool】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decorationの複雑な装飾", + "desc": [ + "InputDecorationには非常に多くの装飾ポイントがあり、コードに対応する装飾があります:", + "border: ボーダー関連", + "helper: 左下のヒント関連", + "counter: 右下のヒント関連", + "prefix: 入力欄の内部最左側", + "suffix: 入力欄の内部最右側", + "label: フォーカスがない時のテキスト", + "label: フォーカスがない時のテキスト", + "hint: ヒントテキスト関連", + "border: ボーダー関連" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json new file mode 100644 index 00000000..0f27e08e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "입력 필드", + "info": "입력을 위한 컴포넌트로, 복잡한 속성을 가지고 있습니다. 컨트롤러, 텍스트 스타일, 장식선, 줄 수 제한, 커서 스타일 등을 지정할 수 있습니다. 입력 변경, 입력 완료 등의 이벤트를 받습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextField 기본 사용법", + "desc": [ + "【controller】 : 컨트롤러 【TextEditingController】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【decoration】 : 장식선 【InputDecoration】", + "【onEditingComplete】 : 입력 완료 이벤트 【Function()】", + "【onSubmitted】 : 제출 이벤트 【Function(String)】", + "【onChanged】 : 입력 이벤트 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextField 줄 수와 커서", + "desc": [ + "【minLines】 : 최소 줄 수 【int】", + "【maxLines】 : 최대 줄 수 【int】", + "【cursorRadius】 : 커서 반지름 【Radius】", + "【cursorColor】 : 커서 색상 【Color】", + "【cursorWidth】 : 커서 너비 【double】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【autofocus】 : 자동 포커스 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decoration의 복잡한 장식", + "desc": [ + "InputDecoration에는 매우 많은 장식점이 있으며, 해당 장식점은 코드를 참조하세요:", + "border: 테두리 관련", + "helper: 왼쪽 하단 관련 힌트", + "counter: 오른쪽 하단 관련 힌트", + "prefix: 입력 필드 내부 가장 왼쪽", + "suffix: 입력 필드 내부 가장 오른쪽", + "label: 포커스 없을 때의 텍스트", + "label: 포커스 없을 때의 텍스트", + "hint: 힌트 텍스트 관련", + "border: 테두리 관련" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json new file mode 100644 index 00000000..76c04b01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo de entrada", + "info": "Componente para entrada de dados, possui propriedades complexas. Pode especificar controlador, estilo de texto, decoração de linha, limite de linhas, estilo do cursor, etc. Recebe eventos de mudança de entrada, conclusão de entrada, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do TextField", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【style】 : Estilo de texto 【TextStyle】", + "【decoration】 : Decoração de linha 【InputDecoration】", + "【onEditingComplete】 : Evento de conclusão de entrada 【Function()】", + "【onSubmitted】 : Evento de submissão 【Function(String)】", + "【onChanged】 : Evento de entrada 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Número de linhas e cursor do TextField", + "desc": [ + "【minLines】 : Número mínimo de linhas 【int】", + "【maxLines】 : Número máximo de linhas 【int】", + "【cursorRadius】 : Raio do cursor 【Radius】", + "【cursorColor】 : Cor do cursor 【Color】", + "【cursorWidth】 : Largura do cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Foco automático 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decoração complexa do decoration", + "desc": [ + "InputDecoration tem muitos pontos de decoração, correspondentes ao código:", + "border: Relacionado à borda", + "helper: Dica relacionada ao canto inferior esquerdo", + "counter: Dica relacionada ao canto inferior direito", + "prefix: Extremidade esquerda interna do campo de entrada", + "suffix: Extremidade direita interna do campo de entrada", + "label: Texto sem foco", + "label: Texto sem foco", + "hint: Texto de dica relacionado", + "border: Relacionado à borda" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json new file mode 100644 index 00000000..fc395008 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Поле ввода", + "info": "Компонент для ввода, обладающий сложными свойствами. Можно указать контроллер, стиль текста, декоративные линии, ограничение на количество строк, стиль курсора и т.д. Получает события изменения ввода, завершения ввода и т.д.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextField", + "desc": [ + "【controller】 : Контроллер 【TextEditingController】", + "【style】 : Стиль текста 【TextStyle】", + "【decoration】 : Декоративные линии 【InputDecoration】", + "【onEditingComplete】 : Событие завершения ввода 【Function()】", + "【onSubmitted】 : Событие отправки 【Function(String)】", + "【onChanged】 : Событие ввода 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Количество строк и курсор в TextField", + "desc": [ + "【minLines】 : Минимальное количество строк 【int】", + "【maxLines】 : Максимальное количество строк 【int】", + "【cursorRadius】 : Радиус курсора 【Radius】", + "【cursorColor】 : Цвет курсора 【Color】", + "【cursorWidth】 : Ширина курсора 【double】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【autofocus】 : Автоматическая фокусировка 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Сложные декорации в decoration", + "desc": [ + "InputDecoration имеет множество точек декорации, соответствующие элементы см. в коде:", + "border: Связано с границами", + "helper: Подсказка в нижнем левом углу", + "counter: Подсказка в нижнем правом углу", + "prefix: Самая левая часть внутри поля ввода", + "suffix: Самая правая часть внутри поля ввода", + "label: Текст без фокуса", + "label: Текст без фокуса", + "hint: Связано с подсказкой", + "border: Связано с границами" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json new file mode 100644 index 00000000..cf7ea31a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "输入框", + "info": "由于输入的组件,拥有复杂的属性。可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextField基本用法", + "desc": [ + "【controller】 : 控制器 【TextEditingController】", + "【style】 : 文字样式 【TextStyle】", + "【decoration】 : 装饰线 【InputDecoration】", + "【onEditingComplete】 : 输入完成事件 【Function()】", + "【onSubmitted】 : 提交事件 【Function(String)】", + "【onChanged】 : 输入事件 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextField行数和cursor", + "desc": [ + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【cursorRadius】 : 光标半径 【Radius】", + "【cursorColor】 : 光标颜色 【Color】", + "【cursorWidth】 : 光标宽度 【double】", + "【showCursor】 : 是否显示光标 【bool】", + "【autofocus】 : 自动聚焦 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decoration的复杂装饰", + "desc": [ + "InputDecoration有非常多的装饰点,对应点缀见代码:", + "border: 边线相关", + "helper: 左下角相关提示", + "counter: 右下角相关提示", + "prefix: 输入框内部最左侧", + "suffix: 输入框内部最右侧", + "label: 无焦点时文字", + "label: 无焦点时文字", + "hint: 提示文字相关", + "border: 边线相关" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart new file mode 100644 index 00000000..64a59be9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + +class CustomTextField extends StatefulWidget { + const CustomTextField({Key? key}) : super(key: key); + + @override + _CustomTextFieldState createState() => _CustomTextFieldState(); +} + +class _CustomTextFieldState extends State { + final FocusNode _focusNode = FocusNode(); + late TextEditingController _controller; + + @override + void initState() { + super.initState(); + _controller = TextEditingController(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 300, + child: TextField( + controller: _controller, + style: const TextStyle(color: Colors.blue), + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'username', + ), + onEditingComplete: () { + print('onEditingComplete'); + }, + onChanged: (v) { + print('onChanged:' + v); + }, + onSubmitted: (v) { + FocusScope.of(context).requestFocus(_focusNode); + print('onSubmitted:' + v); + _controller.clear(); + }, + )); + } +} + diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart new file mode 100644 index 00000000..5efaa0cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CursorTextField extends StatefulWidget { + const CursorTextField({Key? key}) : super(key: key); + + @override + _CursorTextFieldState createState() => _CursorTextFieldState(); +} + +class _CursorTextFieldState extends State { + final FocusNode _focusNode = FocusNode(); + + @override + void dispose() { + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + _buildSubmitBtn(), + _buildTextField(context), + ], + ); + } + + Widget _buildTextField(BuildContext context) { + return SizedBox( + width: 300, + child: TextField( + style: const TextStyle(color: Colors.blue), + minLines: 3, + maxLines: 5, + cursorColor: Colors.green, + cursorRadius: const Radius.circular(3), + cursorWidth: 5, + showCursor: true, + decoration: const InputDecoration( + contentPadding: EdgeInsets.all(10), + hintText: "请输入...", + border: OutlineInputBorder(), + ), + onChanged: (v) {}, + ), + ); + } + + Widget _buildSubmitBtn() => ElevatedButton( + child: const Text( + "提交", + style: TextStyle(color: Colors.white, fontSize: 16), + ), + onPressed: () => FocusScope.of(context).requestFocus(_focusNode)); +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart new file mode 100644 index 00000000..0a8aeb3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class ComplexTextField extends StatelessWidget { + const ComplexTextField({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const TextField( + decoration: InputDecoration( + border: OutlineInputBorder(), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.blue), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.deepPurpleAccent), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))), + labelText: 'username', + labelStyle: TextStyle(color: Colors.purple), + helperText: "help me", + helperStyle: TextStyle(color: Colors.blue), + + suffixText: "suffix", + suffixIcon: Icon(Icons.done), + suffixStyle: TextStyle(color: Colors.green), + + counterText: "counter", + counterStyle: TextStyle(color: Colors.orange), + + prefixText: "ID ", + prefixStyle: TextStyle(color: Colors.blue), + prefixIcon: Icon(Icons.language), + + fillColor: Color(0x110099ee), + filled: true, + + // errorText: "error", + // errorMaxLines: 1, + // errorStyle: TextStyle(color: Colors.red), + // errorBorder: UnderlineInputBorder(), + + hintText: "请输入用户名", + hintMaxLines: 1, + hintStyle: TextStyle(color: Colors.black38), + icon: Icon(Icons.assignment_ind), + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json new file mode 100644 index 00000000..a44d1a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Textformularfeld", + "info": "Die Eigenschaften sind im Wesentlichen dieselben wie bei TextField, zusätzlich gibt es Validierungs- und Rückruffunktionen für die Felder. Der FormState-save löst den onSaved-Rückruf aus.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextFormField", + "desc": [ + "Die grundlegenden Eigenschaften sind identisch mit TextField, siehe dort für Details", + "【validator】: Validierungsfunktion 【FormFieldValidator】", + "【onFieldSubmitted】: Einreichungsrückruf 【ValueChanged】", + "【onSaved】: Rückruf beim Speichern des Formulars 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json new file mode 100644 index 00000000..caa91b5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Text Form Input", + "info": "The properties are basically the same as TextField, with the addition of field validation and submission callbacks. The save of FormState will trigger the onSaved callback.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextFormField", + "desc": [ + "The basic properties are the same as TextField, see details there", + "【validator】: Validation function 【FormFieldValidator】", + "【onFieldSubmitted】: Submission callback 【ValueChanged】", + "【onSaved】: Callback when the form is saved 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json new file mode 100644 index 00000000..d7d1c29d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo de entrada de texto", + "info": "Básicamente es igual a las propiedades de TextField, con la adición de validación de campo y devolución de llamada de envío. El save de FormState activará la devolución de llamada onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextFormField", + "desc": [ + "Las propiedades básicas son las mismas que las de TextField, consulte los detalles", + "【validator】 : Función de validación 【FormFieldValidator 】", + "【onFieldSubmitted】 : Devolución de llamada de envío 【ValueChanged】", + "【onSaved】 : Devolución de llamada cuando se guarda el formulario 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json new file mode 100644 index 00000000..100a2351 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Champ de formulaire de texte", + "info": "Les propriétés sont fondamentalement les mêmes que celles de TextField, avec en plus des validations de champ et des rappels de soumission. Le save de FormState déclenche le rappel onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextFormField", + "desc": [ + "Les propriétés de base sont les mêmes que celles de TextField, voir les détails", + "【validator】 : Fonction de validation 【FormFieldValidator 】", + "【onFieldSubmitted】 : Rappel de soumission 【ValueChanged】", + "【onSaved】 : Rappel lors de la sauvegarde du formulaire 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json new file mode 100644 index 00000000..3c20c0b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo di input di testo", + "info": "Le proprietà sono fondamentalmente le stesse di TextField, con l'aggiunta di callback per la validazione e l'invio dei campi. Il save di FormState attiverà la callback onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TextFormField", + "desc": [ + "Le proprietà di base sono le stesse di TextField, vedi dettagli", + "【validator】 : funzione di validazione 【FormFieldValidator 】", + "【onFieldSubmitted】 : callback di invio 【ValueChanged】", + "【onSaved】 : callback quando il modulo viene salvato 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json new file mode 100644 index 00000000..d1909f13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "テキストフォーム入力", + "info": "TextFieldの属性と基本的に同じで、それに基づいてフィールドの検証と送信のコールバックが追加されています。FormStateのsaveはonSavedコールバックをトリガーします。", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormFieldの基本使用", + "desc": [ + "基本属性はTextFieldと一致します。詳細はそちらをご覧ください", + "【validator】 : 検証関数 【FormFieldValidator 】", + "【onFieldSubmitted】 : 送信コールバック 【ValueChanged】", + "【onSaved】 : フォームsave時のコールバック 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json new file mode 100644 index 00000000..01894f41 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "텍스트 폼 입력", + "info": "TextField 속성과 기본적으로 동일하며, 여기에 필드 검증 및 제출 콜백이 추가되었습니다. FormState의 save는 onSaved 콜백을 트리거합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormField 기본 사용", + "desc": [ + "기본 속성은 TextField와 동일하며, 자세한 내용은 해당 항목을 참조하세요", + "【validator】 : 검증 함수 【FormFieldValidator 】", + "【onFieldSubmitted】 : 제출 콜백 【ValueChanged】", + "【onSaved】 : 폼 save 시 콜백 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json new file mode 100644 index 00000000..b70a87a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo de Entrada de Texto", + "info": "As propriedades são basicamente as mesmas que o TextField, com a adição de validação de campo e callbacks de envio. O save do FormState irá acionar o callback onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TextFormField", + "desc": [ + "As propriedades básicas são as mesmas que o TextField, consulte-o para mais detalhes", + "【validator】: Função de validação 【FormFieldValidator】", + "【onFieldSubmitted】: Callback de envio 【ValueChanged】", + "【onSaved】: Callback quando o formulário é salvo 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json new file mode 100644 index 00000000..47b202b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Текстовое поле формы", + "info": "Свойства аналогичны TextField, с добавлением проверки поля и обратного вызова отправки. Сохранение FormState вызовет обратный вызов onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextFormField", + "desc": [ + "Основные свойства аналогичны TextField, подробнее см. там", + "【validator】 : Функция проверки 【FormFieldValidator 】", + "【onFieldSubmitted】 : Обратный вызов отправки 【ValueChanged】", + "【onSaved】 : Обратный вызов при сохранении формы 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json new file mode 100644 index 00000000..26a01201 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "文字表单输入", + "info": "和TextField属性基本一致,在其基础上增加字段的校验和提交的回调,FormState的save会触发onSaved回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormField基本使用", + "desc": [ + "基本属性和TextField一致,详见之", + "【validator】 : 验证函数 【FormFieldValidator 】", + "【onFieldSubmitted】 : 提交回调 【ValueChanged】", + "【onSaved】 : 表单save时回调 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart new file mode 100644 index 00000000..0e8dc173 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class CustomTextFormField extends StatefulWidget { + const CustomTextFormField({Key? key}) : super(key: key); + + @override + _CustomTextFormFieldState createState() => _CustomTextFormFieldState(); +} + +class _CustomTextFormFieldState extends State { + final GlobalKey _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SizedBox(width: 40), + Expanded( + child: TextFormField( + style: const TextStyle(textBaseline: TextBaseline.alphabetic), + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'username', + ), + validator: _validateUsername, + onFieldSubmitted: _onFieldSubmitted, + onSaved: _onSaved, + ), + ), + _buildSubmitButton(context), + ], + ); + } + + String? _validateUsername(value) { + if (value.isEmpty) { + return '用户名不能为空'; + } + return null; + } + + void _onSaved(value) { + print('onSaved:' + value); + } + + void _onFieldSubmitted(value) { + print('onFieldSubmitted:' + value); + } + + Widget _buildSubmitButton(BuildContext context) => ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )), + onPressed: _onSubmit, + child: const Icon( + Icons.check, + color: Colors.white, + ), + ); + + void _onSubmit() { + if (_formKey.currentState == null) return; + _formKey.currentState!.save(); + if (_formKey.currentState!.validate()) { + FocusScope.of(context).requestFocus(FocusNode()); + } + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json new file mode 100644 index 00000000..36f681f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Timer-Modus", + "info": "Deaktiviert/Aktiviert den Timer (Ticker) des Unterbaums, der Animationscontroller basiert auf Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animation einheitlich deaktivieren/aktivieren", + "desc": [ + "Das enabled von TickerMode kann die Animationseffekte des Unterbaums einheitlich aktivieren/deaktivieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json new file mode 100644 index 00000000..a1a0961e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Timer Mode", + "info": "Enable/disable the timer (Ticker) for the subtree, the animation controller is implemented based on Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Unified Enable/Disable Animation", + "desc": [ + "The enabled property of TickerMode can uniformly enable/disable the animation effects of the subtree." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json new file mode 100644 index 00000000..d5b3baf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modo Ticker", + "info": "Deshabilitar/habilitar el Ticker del subárbol, el controlador de animación se basa en Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Deshabilitar/Habilitar Animación Unificada", + "desc": [ + "El enabled de TickerMode puede habilitar/deshabilitar uniformemente los efectos de animación del subárbol." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json new file mode 100644 index 00000000..04167417 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Mode Ticker", + "info": "Activer/Désactiver le Ticker du sous-arbre, le contrôleur d'animation est basé sur Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Activer/Désactiver l'animation de manière uniforme", + "desc": [ + "Le paramètre enabled de TickerMode peut activer/désactiver de manière uniforme les effets d'animation du sous-arbre." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json new file mode 100644 index 00000000..1c5b2323 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modalità Timer", + "info": "Disabilita/abilita il timer (Ticker) del sottoalbero, il controller di animazione è basato su Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Disabilita/Abilita Animazione Unificata", + "desc": [ + "L'attributo enabled di TickerMode può abilitare/disabilitare in modo unificato gli effetti di animazione del sottoalbero." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json new file mode 100644 index 00000000..2cd5ca73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "タイカーモード", + "info": "サブツリーのタイマー(Ticker)を無効/有効にします。アニメーションコントローラーは Ticker に基づいて実装されています。", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "アニメーションの一括無効/有効", + "desc": [ + "TickerMode の enabled は、サブツリーのアニメーション効果を一括して有効/無効にすることができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json new file mode 100644 index 00000000..f6520841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "타이머 모드", + "info": "서브트리의 타이머(Ticker)를 비활성화/활성화합니다. 애니메이션 컨트롤러는 Ticker를 기반으로 구현됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "통합 비활성화/활성화 애니메이션", + "desc": [ + "TickerMode의 enabled는 서브트리의 애니메이션 효과를 통합적으로 활성화/비활성화할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json new file mode 100644 index 00000000..4eae5689 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modo de Temporizador", + "info": "Desativar/ativar o temporizador (Ticker) da subárvore, o controlador de animação é implementado com base no Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Desativar/Ativar Animação Uniformemente", + "desc": [ + "O enabled do TickerMode pode ativar/desativar uniformemente os efeitos de animação da subárvore." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json new file mode 100644 index 00000000..25a8a650 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Режим таймера", + "info": "Отключить/включить таймер (Ticker) для поддерева, контроллер анимации реализован на основе Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Единое отключение/включение анимации", + "desc": [ + "Свойство enabled TickerMode позволяет единообразно включить/отключить анимацию для поддерева." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json new file mode 100644 index 00000000..4cd210d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "计时器模式", + "info": "禁用/启用子树的计时器(Ticker),动画控制器基于 Ticker 实现。", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "统一禁用/启用动画", + "desc": [ + "TickerMode 的 enabled 可以统一启用/禁用子树的动画效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart new file mode 100644 index 00000000..f602baac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart @@ -0,0 +1,51 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class TickerModeDemo1 extends StatefulWidget { + const TickerModeDemo1({super.key}); + + @override + State createState() => _TickerModeDemo1State(); +} + +class _TickerModeDemo1State extends State { + bool _disable = false; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + buildOutSwitch(), + const SizedBox(height: 4), + TickerMode(enabled: !_disable, child: buildTestContent()), + ], + ); + } + + Widget buildOutSwitch() => Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text('TickerMode外的Switch:'), + Switch(value: _disable, onChanged: _onChanged) + ], + ); + + Widget buildTestContent() => Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 20, + children: [ + Switch(value: _disable, onChanged: _onChanged), + const CupertinoActivityIndicator(), + const CircularProgressIndicator(), + ], + ); + + void _onChanged(bool value) { + setState(() { + _disable = value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json new file mode 100644 index 00000000..47c9c3c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Hinweiswerkzeug", + "info": "Eine Komponente zur Anzeige von Hinweistexten, die bei längerem Drücken Informationen anzeigt. Kann Rand, Anzeigedauer, Textstil und Dekorationseigenschaften festlegen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Tooltip", + "desc": [ + "【preferBelow】 : Bevorzugt unten 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【message】 : Nachrichteninhalt 【String】", + "【showDuration】 : Anzeigedauer 【Duration】", + "【waitDuration】 : Schwebeerscheinungszeit 【Duration】", + "【child】 : Kind 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Dekoration von Tooltip", + "desc": [ + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【textStyle】 : Textstil 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json new file mode 100644 index 00000000..1d33e3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Tooltip", + "info": "A component that displays tooltip information, showing the information when long-pressed. You can specify margins, display duration, text style, and decoration properties.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Tooltip", + "desc": [ + "【preferBelow】: Whether to prefer below 【bool】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【margin】: Margin 【EdgeInsetsGeometry】", + "【message】: Message content 【String】", + "【showDuration】: Display duration 【Duration】", + "【waitDuration】: Hover appearance time 【Duration】", + "【child】: Child 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoration of Tooltip", + "desc": [ + "【decoration】: Decoration object 【Decoration】", + "【textStyle】: Text style 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json new file mode 100644 index 00000000..c631b386 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Herramienta de sugerencia", + "info": "Componente para mostrar información de sugerencia, muestra información al mantener presionado. Se pueden especificar márgenes, duración de visualización, estilo de texto, propiedades de decoración.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Tooltip", + "desc": [ + "【preferBelow】 : ¿Prefiere abajo? 【bool】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【margin】 : Margen externo 【EdgeInsetsGeometry】", + "【message】 : Contenido del mensaje 【String】", + "【showDuration】 : Duración de la visualización 【Duration】", + "【waitDuration】 : Tiempo de aparición al flotar 【Duration】", + "【child】 : Hijo 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoración de Tooltip", + "desc": [ + "【decoration】 : Objeto de decoración 【Decoration】", + "【textStyle】 : Estilo de texto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json new file mode 100644 index 00000000..6eb37d21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Info-bulle", + "info": "Composant pour afficher des informations d'aide, affiche les informations lors d'un appui long. Peut spécifier les marges, la durée d'affichage, le style du texte, les propriétés de décoration, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Tooltip", + "desc": [ + "【preferBelow】 : Préfère en dessous 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【message】 : Contenu du message 【String】", + "【showDuration】 : Durée d'affichage 【Duration】", + "【waitDuration】 : Temps d'apparition au survol 【Duration】", + "【child】 : Enfant 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Décoration de Tooltip", + "desc": [ + "【decoration】 : Objet de décoration 【Decoration】", + "【textStyle】 : Style du texte 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json new file mode 100644 index 00000000..6467bfe4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Strumento di suggerimento", + "info": "Componente per visualizzare informazioni di suggerimento, mostra le informazioni quando viene premuto a lungo. È possibile specificare margini, durata di visualizzazione, stile del testo, proprietà delle luci decorative.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Tooltip", + "desc": [ + "【preferBelow】 : Preferenza per la posizione inferiore 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【margin】 : Spaziatura esterna 【EdgeInsetsGeometry】", + "【message】 : Contenuto del messaggio 【String】", + "【showDuration】 : Durata della visualizzazione 【Duration】", + "【waitDuration】 : Tempo di comparsa al passaggio del mouse 【Duration】", + "【child】 : Figlio 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decorazione di Tooltip", + "desc": [ + "【decoration】 : Oggetto di decorazione 【Decoration】", + "【textStyle】 : Stile del testo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json new file mode 100644 index 00000000..4e0713fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "ツールチップ", + "info": "ヒント情報を表示するためのコンポーネントで、長押しすると情報が表示されます。余白、表示時間、テキストスタイル、装飾などの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltipの基本使用", + "desc": [ + "【preferBelow】 : 下方を優先するか 【bool】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【message】 : メッセージ内容 【String】", + "【showDuration】 : 表示時間 【Duration】", + "【waitDuration】 : ホバーして表示されるまでの時間 【Duration】", + "【child】 : 子 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltipの装飾", + "desc": [ + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【textStyle】 : テキストスタイル 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json new file mode 100644 index 00000000..8b98ca5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "툴팁", + "info": "툴팁 정보를 표시하는 컴포넌트로, 길게 누를 때 정보를 표시합니다. 여백, 표시 시간, 텍스트 스타일, 장식 속성 등을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltip 기본 사용", + "desc": [ + "【preferBelow】 : 아래쪽을 우선할지 여부 【bool】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【message】 : 메시지 내용 【String】", + "【showDuration】 : 표시 시간 【Duration】", + "【waitDuration】 : 나타나는 시간 【Duration】", + "【child】 : 자식 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltip의 장식", + "desc": [ + "【decoration】 : 장식 객체 【Decoration】", + "【textStyle】 : 텍스트 스타일 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json new file mode 100644 index 00000000..f2239a7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Ferramenta de Dica", + "info": "Componente que exibe informações de dica, exibindo informações ao pressionar e segurar. Pode especificar margens, duração de exibição, estilo de texto, propriedades de decoração, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Tooltip", + "desc": [ + "【preferBelow】 : Preferir abaixo 【bool】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【margin】 : Margem externa 【EdgeInsetsGeometry】", + "【message】 : Conteúdo da mensagem 【String】", + "【showDuration】 : Duração da exibição 【Duration】", + "【waitDuration】 : Tempo de aparecimento ao pairar 【Duration】", + "【child】 : Filho 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoração do Tooltip", + "desc": [ + "【decoration】 : Objeto de decoração 【Decoration】", + "【textStyle】 : Estilo de texto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json new file mode 100644 index 00000000..e535f7ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Всплывающая подсказка", + "info": "Компонент для отображения всплывающих подсказок, информация отображается при длительном нажатии. Можно указать отступы, время отображения, стиль текста, свойства декорации.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Tooltip", + "desc": [ + "【preferBelow】 : Предпочтительно снизу 【bool】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【margin】 : Внешние отступы 【EdgeInsetsGeometry】", + "【message】 : Содержание сообщения 【String】", + "【showDuration】 : Время отображения 【Duration】", + "【waitDuration】 : Время появления при наведении 【Duration】", + "【child】 : Дочерний элемент 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Декорация Tooltip", + "desc": [ + "【decoration】 : Объект декорации 【Decoration】", + "【textStyle】 : Стиль текста 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json new file mode 100644 index 00000000..570a1548 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "提示工具", + "info": "由于显示提示信息的组件,长按时显示信息。可指定边距、显示时长、文字样式、装饰灯属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltip基本使用", + "desc": [ + "【preferBelow】 : 是否首选下方 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【message】 : 消息内容 【String】", + "【showDuration】 : 展示时间 【Duration】", + "【waitDuration】 : 悬浮出现时间 【Duration】", + "【child】 : 孩子 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltip的装饰", + "desc": [ + "【decoration】 : 装饰对象 【Decoration】", + "【textStyle】 : 文字样式 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart new file mode 100644 index 00000000..29953fdb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class CustomTooltip extends StatelessWidget { + const CustomTooltip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Tooltip( + preferBelow: true, + padding: EdgeInsets.all(5), + margin: EdgeInsets.all(5), + message: "天王盖地虎", + showDuration: Duration(seconds: 3), + waitDuration: Duration(milliseconds: 200), + child: Icon(Icons.info_outline), + ); + } +} diff --git a/packages/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart similarity index 76% rename from packages/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart index 7e6d2207..c850cb18 100644 --- a/packages/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 50, -// "name": 'Tooltip的装饰', -// "priority": 2, -// "subtitle": -// "【decoration】 : 装饰对象 【Decoration】\n" -// "【textStyle】 : 文字样式 【double】", -// } class DecorationTooltip extends StatelessWidget { const DecorationTooltip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json new file mode 100644 index 00000000..8e819173 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Tween-Animation Builder", + "info": "Verwendet den Tween-Interpolator, um Animationen für verwandte Eigenschaften zu erstellen, und führt über den Builder lokale Builds durch, um den Aktualisierungsbereich zu reduzieren. Benötigt keinen benutzerdefinierten Animator, kann Animationsdauer, Kurve und Endrückruf angeben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder Anwendungsbeispiel", + "desc": [ + "【tween】 : *Interpolator 【Tween】", + "【duration】 : *Dauer 【Duration】", + "【builder】 : *Builder 【ValueWidgetBuilder】", + "【curve】 : Animationskurve 【Curve】", + "【onEnd】 : Endrückruf 【VoidCallback】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json new file mode 100644 index 00000000..0a142ac1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Tween Animation Builder", + "info": "Animates related properties through the Tween, and performs partial builds through the builder to reduce the refresh scope. No need for custom animators, you can specify animation duration, curve, and end callback.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder Usage Example", + "desc": [ + "【tween】 : *Tween 【Tween】", + "【duration】 : *Duration 【Duration】", + "【builder】 : *Builder 【ValueWidgetBuilder】", + "【curve】 : Animation Curve 【Curve】", + "【onEnd】 : End Callback 【VoidCallback】", + "【child】 : Child Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json new file mode 100644 index 00000000..ea4cb852 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Constructor de animación de interpolación", + "info": "Realiza una animación de interpolación en las propiedades relacionadas a través del interpolador Tween, y construye parcialmente a través del builder para reducir el alcance de la actualización. No es necesario un animador personalizado, se puede especificar la duración de la animación, la curva y la devolución de llamada al finalizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ejemplo de uso de TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolador 【Tween】", + "【duration】 : *duración 【Duration】", + "【builder】 : *constructor 【ValueWidgetBuilder】", + "【curve】 : curva de animación 【Curve】", + "【onEnd】 : devolución de llamada al finalizar 【VoidCallback】", + "【child】 : componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json new file mode 100644 index 00000000..4fb05263 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Constructeur d'animation par interpolation", + "info": "Utilise un interpolateur Tween pour animer les propriétés associées, et utilise un builder pour une construction partielle, réduisant ainsi la portée du rafraîchissement. Ne nécessite pas de personnalisation de l'animateur, permet de spécifier la durée de l'animation, la courbe, et le rappel de fin.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemple d'utilisation de TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolateur 【Tween】", + "【duration】 : *durée 【Duration】", + "【builder】 : *constructeur 【ValueWidgetBuilder】", + "【curve】 : courbe d'animation 【Curve】", + "【onEnd】 : rappel de fin 【VoidCallback】", + "【child】 : composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json new file mode 100644 index 00000000..cefd525a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Costruttore di animazione a interpolazione", + "info": "Esegue un'animazione a interpolazione sulle proprietà correlate tramite l'interpolatore Tween, costruendo localmente tramite il builder per ridurre l'ambito di aggiornamento. Non è necessario un animatore personalizzato, è possibile specificare la durata dell'animazione, la curva e il callback di fine.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Esempio di utilizzo di TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolatore 【Tween】", + "【duration】 : *durata 【Duration】", + "【builder】 : *costruttore 【ValueWidgetBuilder】", + "【curve】 : curva di animazione 【Curve】", + "【onEnd】 : callback di fine 【VoidCallback】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json new file mode 100644 index 00000000..487e035d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "トゥイーンアニメーションビルダー", + "info": "トゥイーンを使用して関連するプロパティのアニメーションを行い、ビルダーを使用して部分的な構築を行い、更新範囲を減らします。カスタムアニメーターは不要で、アニメーションの時間、曲線、終了コールバックを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 使用例", + "desc": [ + "【tween】 : *トゥイーン 【Tween】", + "【duration】 : *時間 【Duration】", + "【builder】 : *ビルダー 【ValueWidgetBuilder】", + "【curve】 : アニメーション曲線 【Curve】", + "【onEnd】 : 終了コールバック 【VoidCallback】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json new file mode 100644 index 00000000..29440f4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "트윈 애니메이션 빌더", + "info": "트윈을 사용하여 관련 속성에 대한 애니메이션을 생성하고, 빌더를 통해 부분적으로 빌드하여 새로고침 범위를 줄입니다. 사용자 정의 애니메이터가 필요 없으며, 애니메이션 지속 시간, 곡선, 종료 콜백을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 사용 예제", + "desc": [ + "【tween】 : *트윈 【Tween】", + "【duration】 : *지속 시간 【Duration】", + "【builder】 : *빌더 【ValueWidgetBuilder】", + "【curve】 : 애니메이션 곡선 【Curve】", + "【onEnd】 : 종료 콜백 【VoidCallback】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json new file mode 100644 index 00000000..a459fbfd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Construtor de Animação de Interpolação", + "info": "Realiza animações de interpolação nas propriedades relacionadas através do interpolador Tween, utilizando o builder para construir localmente e reduzir o escopo de atualização. Não é necessário personalizar o animador, podendo especificar a duração da animação, a curva e o callback de término.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemplo de uso do TweenAnimationBuilder", + "desc": [ + "【tween】 : *Interpolador 【Tween】", + "【duration】 : *Duração 【Duration】", + "【builder】 : *Construtor 【ValueWidgetBuilder】", + "【curve】 : Curva de animação 【Curve】", + "【onEnd】 : Callback de término 【VoidCallback】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f9fac07e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Построитель анимации с интерполяцией", + "info": "Анимация свойств через интерполятор Tween, локальное построение через builder для уменьшения области обновления. Не требует пользовательского аниматора, позволяет указать длительность анимации, кривую и обратный вызов по завершению.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Пример использования TweenAnimationBuilder", + "desc": [ + "【tween】 : *интерполятор 【Tween】", + "【duration】 : *длительность 【Duration】", + "【builder】 : *построитель 【ValueWidgetBuilder】", + "【curve】 : кривая анимации 【Curve】", + "【onEnd】 : обратный вызов по завершению 【VoidCallback】", + "【child】 : дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json new file mode 100644 index 00000000..9631b0ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "渐变动画构造器", + "info": "通过渐变器 Tween 对相关属性进行渐变动画,通过 builder 进行局部构建,减少刷新范围。不需要自定义动画器,可指定动画时长、曲线、结束回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 使用案例", + "desc": [ + "【tween】 : *渐变器 【Tween】", + "【duration】 : *时长 【Duration】", + "【builder】 : *构造器 【ValueWidgetBuilder】", + "【curve】 : 动画曲线 【Curve】", + "【onEnd】 : 结束回调 【VoidCallback】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart new file mode 100644 index 00000000..384ed3cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart @@ -0,0 +1,58 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class TweenAnimationBuilderDemo extends StatefulWidget { + const TweenAnimationBuilderDemo({Key? key}) : super(key: key); + + @override + State createState() => + _TweenAnimationBuilderDemoState(); +} + +class _TweenAnimationBuilderDemoState extends State { + List get colors => const [ + Colors.red, + Colors.orange, + Colors.yellow, + Colors.green, + Colors.blue, + Colors.indigo, + Colors.purple + ]; + + int _activeIndex = 0; + + Color get begin => colors[_activeIndex % colors.length]; + + Color get end => colors[(_activeIndex + 1) % colors.length]; + + void nextColor(){ + _activeIndex++; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: nextColor, + child: TweenAnimationBuilder( + tween: ColorTween(begin: begin, end: end), + duration: const Duration(milliseconds: 800), + builder: (BuildContext context, Color? color, Widget? child) { + return Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: color, borderRadius: BorderRadius.circular(5)), + child: child, + ); + }, + child: const Icon(Icons.android_outlined, color: Colors.white), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json new file mode 100644 index 00000000..545a7973 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Verlauf rückgängig machen", + "info": "Empfängt einen ValueNotifier, um den Wert zu überwachen und bietet die Funktionen Rückgängig/Wiederholen für diesen Wert; wird in der Quellcode der TextField-Komponente verwendet.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von UndoHistory in TextField", + "desc": [ + "In diesem Beispiel wird die Rückgängig/Wiederholen-Funktion von TextField über eine externe Schaltfläche gesteuert. Der Parameter undoController kann ein UndoHistoryController-Objekt übernehmen, um den eingegebenen Textinhalt zu steuern und zu beeinflussen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json new file mode 100644 index 00000000..c50f8921 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Undo History", + "info": "Receives ValueNotifier to listen to the value, providing undo/redo functionality for that value; used in the source code of the TextField component.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Using UndoHistory in TextField", + "desc": [ + "In this example, the undo/redo functionality of the TextField is controlled via an external button. The undoController parameter can be passed an UndoHistoryController object to control and influence the input text content." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json new file mode 100644 index 00000000..f3138ef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Historial de Deshacer", + "info": "Recibe un ValueNotifier para escuchar valores, proporcionando funcionalidad de deshacer/rehacer para ese valor; utilizado en el código fuente del componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de UndoHistory en TextField", + "desc": [ + "En este caso, se controla la funcionalidad de deshacer/rehacer del TextField mediante un botón externo. El parámetro undoController puede recibir un objeto UndoHistoryController, utilizado para controlar y afectar el contenido del texto ingresado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json new file mode 100644 index 00000000..a20fcbca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Historique d'annulation", + "info": "Reçoit une valeur observable ValueNotifier et fournit des fonctionnalités d'annulation/réexécution pour cette valeur ; utilisé dans le code source du composant TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation d'UndoHistory dans TextField", + "desc": [ + "Dans cet exemple, un bouton externe est utilisé pour contrôler les fonctionnalités d'annulation/réexécution de TextField. Le paramètre undoController peut recevoir un objet UndoHistoryController pour contrôler et influencer le contenu du texte saisi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json new file mode 100644 index 00000000..563747f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Cronologia Annulla", + "info": "Riceve un ValueNotifier per valori osservabili, fornendo funzionalità di annullamento/ripetizione per tale valore; utilizzato nel codice sorgente del componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilizzo di UndoHistory in TextField", + "desc": [ + "In questo caso, attraverso un pulsante esterno, si controlla la funzione di annullamento/ripetizione di TextField. Il parametro undoController può essere passato come oggetto UndoHistoryController, utilizzato per controllare e influenzare il contenuto del testo inserito." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json new file mode 100644 index 00000000..628a2393 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "取り消し履歴", + "info": "ValueNotifierの監視可能な値を受け取り、その値に取り消し/やり直し機能を提供します;TextFieldコンポーネントのソースコードで使用されています。", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextFieldでのUndoHistoryの使用", + "desc": [ + "このケースでは、外部ボタンを使用してTextFieldの取り消し/やり直し機能を制御します。undoControllerパラメータにUndoHistoryControllerオブジェクトを渡すことができ、入力テキストの内容を制御および影響を与えるために使用されます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json new file mode 100644 index 00000000..f8524478 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "실행 취소 기록", + "info": "ValueNotifier를 통해 값을 감지하고, 해당 값에 대해 실행 취소/다시 실행 기능을 제공합니다; TextField 컴포넌트 소스 코드에서 사용됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextField에서 UndoHistory 사용", + "desc": [ + "이 예제에서는 외부 버튼을 통해 TextField의 실행 취소/다시 실행 기능을 제어합니다. undoController 매개변수에 UndoHistoryController 객체를 전달하여 입력 텍스트 내용을 제어하고 영향을 줄 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json new file mode 100644 index 00000000..c1ee62f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Histórico de Desfazer", + "info": "Recebe um ValueNotifier para monitorar valores, fornecendo funcionalidades de desfazer/refazer para esse valor; utilizado no código-fonte do componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Usando UndoHistory no TextField", + "desc": [ + "Neste exemplo, um botão externo é usado para controlar as funcionalidades de desfazer/refazer do TextField. O parâmetro undoController pode receber um objeto UndoHistoryController, que é usado para controlar e influenciar o conteúdo do texto inserido." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json new file mode 100644 index 00000000..e1aeecc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "История отмены", + "info": "Принимает ValueNotifier для отслеживания значений и предоставляет функциональность отмены/повтора для этого значения; используется в исходном коде компонента TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование UndoHistory в TextField", + "desc": [ + "В этом примере с помощью внешней кнопки управляется функциональность отмены/повтора в TextField. Параметр undoController может принимать объект UndoHistoryController для управления и влияния на вводимый текст." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json new file mode 100644 index 00000000..c2ae9df9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "撤销历史", + "info": "接收 ValueNotifier 可监听值,为该值提供撤销/重做功能;被用于 TextField 组件源码中。", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextField 中使用 UndoHistory", + "desc": [ + "该案例中通过外界按钮,进行控制 TextField 的撤销/重做功能。其中 undoController 参数可以传入 UndoHistoryController 对象,用于控制并影响输入文本内容。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart new file mode 100644 index 00000000..85a654a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + +class UndoHistoryDemo1 extends StatefulWidget { + const UndoHistoryDemo1({super.key}); + + @override + State createState() => _UndoHistoryDemo1State(); +} + +class _UndoHistoryDemo1State extends State { + final UndoHistoryController _undoController = UndoHistoryController(); + + @override + void dispose() { + _undoController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildToolBar(), + const Divider(height: 0.5), + Expanded( + child: TextField( + undoController: _undoController, + expands: true, + maxLines: null, + minLines: null, + decoration: InputDecoration( + filled: true, + hintText: '请输入...', + fillColor: Colors.white, + hoverColor: Colors.transparent, + border: InputBorder.none, + ), + )) + ], + ), + ); + } + + Widget _buildToolBar() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4), + child: ValueListenableBuilder( + valueListenable: _undoController, + builder: (BuildContext context, UndoHistoryValue value, Widget? child) { + return Wrap( + spacing: 4, + children: [ + _IconAction( + icon: Icons.undo, + onTap: value.canUndo ? _undoController.undo : null), + _IconAction( + icon: Icons.redo, + onTap: value.canRedo ? _undoController.redo : null), + ], + ); + }, + ), + ); + } +} + +class _IconAction extends StatefulWidget { + final IconData icon; + final VoidCallback? onTap; + + const _IconAction({super.key, required this.icon, this.onTap}); + + @override + State<_IconAction> createState() => _IconActionState(); +} + +class _IconActionState extends State<_IconAction> { + bool _hover = false; + + bool get enable => widget.onTap != null; + + Color? get color => (_hover && enable) ? Colors.grey.withOpacity(0.2) : null; + + @override + Widget build(BuildContext context) { + MouseCursor cursor = (_hover && enable) ? SystemMouseCursors.click : SystemMouseCursors.basic; + return MouseRegion( + cursor: cursor , + onExit: (_) => setState(() => _hover = false), + onEnter: (_) => setState(() => _hover = true), + child: GestureDetector( + onTap: widget.onTap, + child: Container( + decoration: BoxDecoration( + color: color, borderRadius: BorderRadius.circular(4)), + padding: const EdgeInsets.all(4.0), + child: Icon( + widget.icon, + size: 20, + color: enable ? null : Colors.grey, + )), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json new file mode 100644 index 00000000..fd18752f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Einzigartige Komponente", + "info": "Abstrakte Klasse, muss einen GlobalKey zur Identifikation bereitstellen. Diese Art von Komponente wird nur als eine Instanz inflated und hat zu jedem Zeitpunkt nur einen Zustand, der über die currentState-Eigenschaft abgerufen werden kann.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in UniqueWidget", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json new file mode 100644 index 00000000..4e81b96f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Unique Component", + "info": "Abstract class, must provide a GlobalKey for identification. This type of component will only inflate one instance and will only have one state at any given time. The state can be obtained through the currentState property.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to UniqueWidget", + "desc": [ + "【child】 : Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json new file mode 100644 index 00000000..9a4178f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Único", + "info": "Clase abstracta, debe proporcionar una GlobalKey para la identificación. Este tipo de componente solo se inflará en una instancia y solo tendrá un estado en un momento dado. El estado se puede obtener a través de la propiedad currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a UniqueWidget", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json new file mode 100644 index 00000000..276b12f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Widget Unique", + "info": "Classe abstraite, doit fournir une GlobalKey pour l'identification. Ce type de widget ne sera instancié qu'une seule fois et aura un seul état à la fois. L'état peut être obtenu via la propriété currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à UniqueWidget", + "desc": [ + "【child】 : Widget enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json new file mode 100644 index 00000000..705120b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Unico", + "info": "Classe astratta, deve fornire una GlobalKey per l'identificazione. Questo tipo di componente verrà inflato solo una volta e avrà solo uno stato alla volta. Lo stato può essere ottenuto tramite la proprietà currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a UniqueWidget", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json new file mode 100644 index 00000000..956984b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "ユニークウィジェット", + "info": "抽象クラス、GlobalKeyを提供して識別する必要があります。このタイプのウィジェットは1つのインスタンスのみがinflatedされ、同時に1つの状態のみを持ちます。currentStateプロパティを通じて状態を取得できます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 紹介", + "desc": [ + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json new file mode 100644 index 00000000..5b57d463 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "유니크 위젯", + "info": "추상 클래스, GlobalKey를 제공하여 식별해야 합니다. 이 유형의 위젯은 하나의 인스턴스만 inflated되며, 동시에 하나의 상태만 가질 수 있습니다. currentState 속성을 통해 상태를 가져올 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json new file mode 100644 index 00000000..1e73e8cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Único", + "info": "Classe abstrata, deve fornecer uma GlobalKey para identificação, este tipo de componente só será inflated uma instância, e terá apenas um estado de cada vez, o estado pode ser obtido através da propriedade currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao UniqueWidget", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json new file mode 100644 index 00000000..77b6eb84 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Уникальный компонент", + "info": "Абстрактный класс, должен предоставлять GlobalKey для идентификации. Этот тип компонента будет inflated только один экземпляр, и в любой момент времени будет только одно состояние, которое можно получить через свойство currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в UniqueWidget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json new file mode 100644 index 00000000..362d6b53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "唯一组件", + "info": "抽象类,必须提供一个 GlobalKey 进行身份标识,该类型组件只会 inflated 一个实例,同一时刻也只会有一个状态,可以通过 currentState 属性获取状态。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 介绍", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart new file mode 100644 index 00000000..e31fce22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class UniqueWidgetDemo extends StatelessWidget { + const UniqueWidgetDemo({Key? key}) : super(key: key); + + final String info = + '该类是抽象类,在 Flutter 框架层没有实现类,也没有其他源码使用到它,说明它基本上没啥用。' + '本质上它也非常简单,就是为组件添加一个 GlobalKey,在 Element#inflateWidget 时,会校验组件是否有 GlobalKey ,' + '如果有,则根据 key 找到之前的对应的 Element,就不会触发 Widget#createElement。为了方便获取 State,该类暴露 currentState 属性。' + '你瞄一下源码,就能看到这个组件是多么简单,简单到可以自己完成,以至于没什么大用。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json new file mode 100644 index 00000000..98e60698 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Wertüberwachungs-Builder", + "info": "Kann einen Wert überwachen und bei Änderungen die Benutzeroberfläche über den Builder-Callback neu aufbauen, wodurch die Verwendung von setState zur Aktualisierung vermieden wird.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ValueListenableBuilder", + "desc": [ + "【builder】: Komponenten-Builder 【ValueWidgetBuilder】", + "【valueListenable】: Überwachungswert 【ValueListenable】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json new file mode 100644 index 00000000..8230410d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Value Listener Builder", + "info": "Can listen to a value, and when it changes, the interface can be rebuilt through the builder callback, avoiding the use of setState for refreshing.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ValueListenableBuilder", + "desc": [ + "【builder】: Component builder 【ValueWidgetBuilder】", + "【valueListenable】: Listened value 【ValueListenable】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json new file mode 100644 index 00000000..6597d7f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Constructor de Escucha de Valor", + "info": "Puede escuchar un valor y, cuando cambia, reconstruir la interfaz a través de la devolución de llamada del constructor, evitando el uso de setState para actualizar.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de ValueListenableBuilder", + "desc": [ + "【builder】: Constructor de componentes 【ValueWidgetBuilder】", + "【valueListenable】: Valor de escucha 【ValueListenable】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json new file mode 100644 index 00000000..44726e9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Constructeur de valeur écoutable", + "info": "Peut écouter une valeur, et lorsque celle-ci change, il peut reconstruire l'interface via un rappel builder, évitant ainsi l'utilisation de setState pour rafraîchir.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ValueListenableBuilder", + "desc": [ + "【builder】: Constructeur de composant 【ValueWidgetBuilder】", + "【valueListenable】: Valeur écoutée 【ValueListenable】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json new file mode 100644 index 00000000..4a4785b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Costruttore di ascolto del valore", + "info": "Può ascoltare un valore e, quando cambia, ricostruire l'interfaccia attraverso il callback del builder, evitando l'uso di setState per aggiornare.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ValueListenableBuilder", + "desc": [ + "【builder】: Costruttore del componente 【ValueWidgetBuilder】", + "【valueListenable】: Valore di ascolto 【ValueListenable】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json new file mode 100644 index 00000000..21e7ccf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "値リスナービルダー", + "info": "値を監視し、その値が変化したときにbuilderコールバックを通じてUIを再構築し、setStateを使用せずに更新を避けることができます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilderの基本使用", + "desc": [ + "【builder】: コンポーネントビルダー 【ValueWidgetBuilder】", + "【valueListenable】: 監視値 【ValueListenable】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json new file mode 100644 index 00000000..b8e33579 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "값 리스너 빌더", + "info": "값을 리스닝하고, 값이 변경될 때 builder 콜백을 통해 UI를 재구성할 수 있으며, setState를 사용하지 않고도 화면을 갱신할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilder 기본 사용법", + "desc": [ + "【builder】: 컴포넌트 빌더 【ValueWidgetBuilder】", + "【valueListenable】: 리스닝 값 【ValueListenable】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json new file mode 100644 index 00000000..2dfd9ab6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Construtor de Valor Escutável", + "info": "Pode escutar um valor e, quando ele muda, reconstruir a interface através do callback do builder, evitando o uso de setState para atualizar.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ValueListenableBuilder", + "desc": [ + "【builder】: Construtor de Componentes 【ValueWidgetBuilder】", + "【valueListenable】: Valor Escutável 【ValueListenable】", + "【child】: Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f014ac90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Слушатель значений", + "info": "Может отслеживать значение и перестраивать интерфейс через обратный вызов builder при его изменении, избегая использования setState для обновления.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ValueListenableBuilder", + "desc": [ + "【builder】: Конструктор компонента 【ValueWidgetBuilder】", + "【valueListenable】: Отслеживаемое значение 【ValueListenable】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json new file mode 100644 index 00000000..190489a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "监听值构造器", + "info": "可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilder基本使用", + "desc": [ + "【builder】: 组件构造器 【ValueWidgetBuilder】", + "【valueListenable】: 监听值 【ValueListenable】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart new file mode 100644 index 00000000..0d81ba90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com + +final ValueNotifier _counter = ValueNotifier(0); + +class ValueListenableBuilderDemo extends StatelessWidget { + const ValueListenableBuilderDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Scaffold( + appBar: AppBar(title: const Text("ValueListenableBuilder")), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('You have pushed the button this many times:'), + ValueListenableBuilder( + builder: _buildWithValue, + valueListenable: _counter, + child: const Text('I am Child!'), + ) + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.plus_one), + onPressed: () => _counter.value += 1, + ), + ), + ); + } + + Widget _buildWithValue(BuildContext context, int value, Widget? child) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('$value'), + child ?? const SizedBox.shrink(), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json new file mode 100644 index 00000000..a428050a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Widget-Inspektor", + "info": "Diese Komponente ermöglicht es Ihnen, die Hierarchie der Unterkomponenten bequem anzuzeigen und ist eine der Funktionen des Flutter Inspector-Plugins.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des WidgetInspectors", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "【selectButtonBuilder】: *Auswahlschalter-Builder 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json new file mode 100644 index 00000000..d060acd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Widget Inspector", + "info": "This component allows you to easily view the hierarchy of child components and is one of the features of the Flutter Inspector plugin.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of WidgetInspector", + "desc": [ + "【child】 : Child component 【Widget】", + "【selectButtonBuilder】: *Select button builder 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json new file mode 100644 index 00000000..9995d77f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspector de Componentes", + "info": "Este componente te permite ver fácilmente la jerarquía de los componentes hijos, es una de las funciones del plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de WidgetInspector", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【selectButtonBuilder】: *Constructor del botón de selección 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json new file mode 100644 index 00000000..16bdc06f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspecteur de widgets", + "info": "Ce composant vous permet de visualiser facilement la structure hiérarchique des composants enfants, c'est l'une des fonctionnalités de l'extension Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de WidgetInspector", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【selectButtonBuilder】: *Constructeur de bouton de sélection 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json new file mode 100644 index 00000000..267ae04e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Ispezione dei componenti", + "info": "Questo componente ti permette di visualizzare facilmente la struttura gerarchica dei componenti figli, è una delle funzionalità del plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di WidgetInspector", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【selectButtonBuilder】: *Costruttore del pulsante di selezione 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json new file mode 100644 index 00000000..90ee326d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "ウィジェットインスペクター", + "info": "このコンポーネントは、子コンポーネントの階層構造を簡単に確認できるようにするもので、Flutter Inspectorプラグインの機能の一つです。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspectorの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【selectButtonBuilder】: *選択ボタンビルダー 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json new file mode 100644 index 00000000..d11114b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "위젯 인스펙터", + "info": "이 컴포넌트는 하위 컴포넌트 계층 구조를 쉽게 확인할 수 있게 해주며, Flutter Inspector 플러그인의 기능 중 하나입니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspector 기본 사용법", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【selectButtonBuilder】: *선택 버튼 생성기 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json new file mode 100644 index 00000000..ec01c1fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspetor de Componentes", + "info": "Este componente permite visualizar facilmente a estrutura hierárquica dos componentes filhos, sendo uma das funcionalidades do plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do WidgetInspector", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【selectButtonBuilder】: *Construtor do botão de seleção 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json new file mode 100644 index 00000000..e4fce636 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Инспектор виджетов", + "info": "Этот компонент позволяет вам легко просматривать иерархию дочерних компонентов, что является одной из функций плагина Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование WidgetInspector", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【selectButtonBuilder】: *Конструктор кнопки выбора 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json new file mode 100644 index 00000000..2a829b29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "组件检查器", + "info": "该组件可以让你很方便地查看子组件层级结构,是Flutter Inspector插件的功能之一。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspector基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【selectButtonBuilder】: *选择按钮构造器 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart new file mode 100644 index 00000000..ed7ae3c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/16 +/// contact me by email 1981462002@qq.com + +class WidgetInspectorDemo extends StatelessWidget { + const WidgetInspectorDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: WidgetInspector( + child: const HomePage(), + tapBehaviorButtonBuilder: _tapBehaviorButtonBuilder, + exitWidgetSelectionButtonBuilder: null, + moveExitWidgetSelectionButtonBuilder: _selectButtonBuilder, + ), + ); + } + + // Widget _selectButtonBuilder(BuildContext context, + // {required VoidCallback onPressed, bool? isLeftAligned}) { + // onPressed(); + // return Container(); + // } + + Widget _tapBehaviorButtonBuilder(BuildContext context, + {required VoidCallback onPressed, + required bool selectionOnTapEnabled, + required String semanticLabel}) { + return Container(); + } + + Widget _selectButtonBuilder(BuildContext context, + {bool? isLeftAligned, + required VoidCallback onPressed, + required String semanticLabel}) { + return Container(); + } +} + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + int _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: const Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json new file mode 100644 index 00000000..0386443e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Widget-Anwendung", + "info": "Sammelt die Komponenten, die eine Anwendung benötigt, wie Routing, Sprache, einige Debug-Schalter usw. Es ist auch die Kernkomponente zur Implementierung von MaterialApp und CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Routing-Konstruktor 【PageRouteFactory】", + "【color】: *Farbe 【Color】", + "【debugShowWidgetInspector】: Ob der Widget-Inspektor angezeigt werden soll 【bool】", + "Andere Eigenschaften sind im Wesentlichen dieselben wie bei MaterialApp, siehe dort für weitere Details." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json new file mode 100644 index 00000000..66c99748 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Widget Application", + "info": "Collects the components needed for an application, such as routing, language, some debugging switches, etc. It is also the core component for implementing MaterialApp and CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Route Builder 【PageRouteFactory】", + "【color】: *Color 【Color】", + "【debugShowWidgetInspector】: Whether to display the widget inspector 【bool】", + "Other properties are basically the same as MaterialApp, see details there." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json new file mode 100644 index 00000000..cd9836e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Aplicación de Componentes", + "info": "Agrupa los componentes necesarios para una aplicación, como el enrutamiento, el idioma, algunos interruptores de depuración, etc. También es el componente central para implementar MaterialApp y CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Constructor de rutas 【PageRouteFactory】", + "【color】: *Color 【Color】", + "【debugShowWidgetInspector】: Mostrar el inspector de componentes z 【bool】", + "Otras propiedades son básicamente las mismas que MaterialApp, consulte allí para más detalles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json new file mode 100644 index 00000000..408c1220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Application de widgets", + "info": "Rassemble les composants nécessaires pour une application, tels que le routage, la langue, certains commutateurs de débogage, etc. C'est également le composant central pour la mise en œuvre de MaterialApp et CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *constructeur de route 【PageRouteFactory】", + "【color】: *couleur 【Color】", + "【debugShowWidgetInspector】: afficher l'inspecteur de widgets 【bool】", + "Les autres propriétés sont essentiellement les mêmes que MaterialApp, voir cela pour plus de détails." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json new file mode 100644 index 00000000..f5bc7c8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Applicazione Componenti", + "info": "Raccoglie i componenti necessari per un'applicazione, come il routing, la lingua, alcuni interruttori di debug, ecc. È anche il componente centrale per implementare MaterialApp e CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Costruttore di routing 【PageRouteFactory】", + "【color】: *Colore 【Color】", + "【debugShowWidgetInspector】: Mostra l'ispettore dei componenti 【bool】", + "Le altre proprietà sono fondamentalmente le stesse di MaterialApp, vedi dettagli." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json new file mode 100644 index 00000000..dca35af4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "ウィジェットアプリ", + "info": "アプリケーションに必要な部品、例えばルーティング、言語、いくつかのデバッグスイッチなどを集めたものです。また、MaterialAppとCupertinoAppを実現するためのコアコンポーネントでもあります。", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp基本使用", + "desc": [ + "【pageRouteBuilder】 : *ルーティングビルダー 【PageRouteFactory】", + "【color】: *色 【Color】", + "【debugShowWidgetInspector】: ウィジェットインスペクターを表示するかどうか 【bool】", + "その他の属性は基本的にMaterialAppと同じです。詳細はそちらをご覧ください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json new file mode 100644 index 00000000..709d0d73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "위젯 앱", + "info": "앱에 필요한 구성 요소, 예를 들어 라우팅, 언어, 일부 디버그 스위치 등을 모아놓은 것입니다. 또한 MaterialApp과 CupertinoApp을 구현하는 핵심 구성 요소입니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp 기본 사용법", + "desc": [ + "【pageRouteBuilder】 : *라우트 빌더 【PageRouteFactory】", + "【color】: *색상 【Color】", + "【debugShowWidgetInspector】: 위젯 인스펙터 표시 여부 【bool】", + "기타 속성은 기본적으로 MaterialApp과 동일하므로 자세한 내용은 해당 문서를 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json new file mode 100644 index 00000000..0d9c1031 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Aplicação de Componentes", + "info": "Agrega os componentes necessários para uma aplicação, como roteamento, idioma, alguns interruptores de depuração, etc. Também é o componente central para implementar MaterialApp e CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Construtor de Rota 【PageRouteFactory】", + "【color】: *Cor 【Color】", + "【debugShowWidgetInspector】: Mostrar o inspetor de componentes 【bool】", + "Outras propriedades são basicamente as mesmas que MaterialApp, consulte para mais detalhes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json new file mode 100644 index 00000000..b72df5d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Приложение виджетов", + "info": "Собирает компоненты, необходимые для приложения, такие как маршрутизация, язык, некоторые отладочные переключатели и т.д. Также является основным компонентом для реализации MaterialApp и CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Конструктор маршрутов 【PageRouteFactory】", + "【color】: *Цвет 【Color】", + "【debugShowWidgetInspector】: Показывать ли инспектор виджетов 【bool】", + "Другие свойства в основном совпадают с MaterialApp, подробнее см. там." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json new file mode 100644 index 00000000..6c4c0011 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "组件应用", + "info": "集合一个应用程序需要的部件,如路由、语言、一些调试开关等。也是实现MaterialApp和CupertinoApp的核心组件。", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp基本使用", + "desc": [ + "【pageRouteBuilder】 : *路由构造器 【PageRouteFactory】", + "【color】: *颜色 【Color】", + "【debugShowWidgetInspector】: 是否显示z组件查看器 【bool】", + "其他属性基本上同MaterialApp,详见之。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart new file mode 100644 index 00000000..608948c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/16 +/// contact me by email 1981462002@qq.com + +class WidgetsAppDemo extends StatefulWidget { + const WidgetsAppDemo({Key? key}) : super(key: key); + + @override + _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); +} + +class _WidgetsAppDemoState extends State { + bool _debugShowCheckedModeBanner = false; + bool _debugShowWidgetInspector = false; + bool _showPerformanceOverlay = false; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildSwitchers(), + SizedBox( + height: 250, + child: WidgetsApp( + color: Colors.blue, + debugShowCheckedModeBanner: _debugShowCheckedModeBanner, + showPerformanceOverlay: _showPerformanceOverlay, + debugShowWidgetInspector: _debugShowWidgetInspector, + pageRouteBuilder: + (RouteSettings settings, WidgetBuilder builder) { + return MaterialPageRoute(settings: settings, builder: builder); + }, + home: const HomePage(), + ), + ), + ], + ); + } + + Widget _buildSwitchers() { + return DefaultTextStyle( + style: const TextStyle(color: Colors.blue), + child: Wrap( + spacing: 10, + children: [ + Column( + children: [ + Switch( + value: _showPerformanceOverlay, + onChanged: (v) { + setState(() { + _showPerformanceOverlay = v; + }); + }, + ), + const Text('性能浮层') + ], + ), + Column( + children: [ + Switch( + value: _debugShowCheckedModeBanner, + onChanged: (v) { + setState(() { + _debugShowCheckedModeBanner = v; + }); + }, + ), + const Text('开启角标') + ], + ), + Column( + children: [ + Switch( + value: _debugShowWidgetInspector, + onChanged: (v) { + setState(() { + _debugShowWidgetInspector = v; + }); + }, + ), + const Text('检查器') + ], + ) + ], + ), + ); + } +} + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + int _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: const Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json new file mode 100644 index 00000000..90b0bf14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Rückkehrblockierung", + "info": "Wenn eine Oberfläche eine WillPopScope-Komponente enthält, wird beim Zurückkehren der Seite ein Callback ausgelöst, um zu entscheiden, ob zurückgekehrt werden soll. Kann für Szenarien verwendet werden, in denen ein erneutes Bestätigen des Verlassens erforderlich ist.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onWillPop】 : Rückkehr-Callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json new file mode 100644 index 00000000..f1db277e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Return Intercept", + "info": "When a WillPopScope component is present in an interface, a callback is triggered when the page returns, determining whether to return. It can be used for scenarios requiring secondary confirmation before exiting.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope Usage", + "desc": [ + "【child】: Child component 【Widget】", + "【onWillPop】: Return callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json new file mode 100644 index 00000000..64fbbb6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Intercepción de retorno", + "info": "Cuando hay un componente WillPopScope en una interfaz, se activará una devolución de llamada al regresar de la página para decidir si se debe regresar. Se puede utilizar en escenarios de confirmación secundaria para salir.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de WillPopScope", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onWillPop】 : Devolución de llamada 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json new file mode 100644 index 00000000..539be6bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Interception de retour", + "info": "Lorsqu'un composant WillPopScope est présent dans une interface, un rappel est déclenché lors du retour à la page pour décider si le retour doit être effectué. Peut être utilisé pour des scénarios de confirmation de sortie.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de WillPopScope", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onWillPop】 : Rappel de retour 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json new file mode 100644 index 00000000..2ab9a79c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Intercettazione di ritorno", + "info": "Quando un'interfaccia contiene il componente WillPopScope, viene attivato un callback al momento del ritorno alla pagina, decidendo se tornare indietro. Può essere utilizzato per scenari di conferma di uscita secondaria.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di WillPopScope", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onWillPop】 : Callback di ritorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json new file mode 100644 index 00000000..9044470a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "戻り防止", + "info": "インターフェースにWillPopScopeコンポーネントがある場合、ページが戻るときにコールバックがトリガーされ、戻るかどうかを決定します。二次確認して退出するシナリオに使用できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScopeの使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onWillPop】 : 戻りコールバック 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json new file mode 100644 index 00000000..66971d92 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "뒤로 가기 차단", + "info": "인터페이스에 WillPopScope 컴포넌트가 있을 때, 페이지에서 뒤로 가기를 시도하면 콜백이 트리거되어 뒤로 갈지 여부를 결정합니다. 이는 두 번째로 종료를 확인하는 시나리오에 사용할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onWillPop】 : 뒤로 가기 콜백 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json new file mode 100644 index 00000000..e99f8965 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Interceptar Retorno", + "info": "Quando há um componente WillPopScope numa interface, o callback é acionado ao retornar à página, decidindo se deve retornar. Pode ser usado em cenários de confirmação secundária de saída.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do WillPopScope", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onWillPop】 : Callback de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json new file mode 100644 index 00000000..cf2110df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Перехват возврата", + "info": "Когда на интерфейсе присутствует компонент WillPopScope, при возврате на страницу срабатывает обратный вызов, который определяет, следует ли возвращаться. Может использоваться для сценариев повторного подтверждения выхода.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование WillPopScope", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onWillPop】 : Обратный вызов возврата 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json new file mode 100644 index 00000000..bc4572ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "返回拦截", + "info": "当一个界面中有WillPopScope组件时,在页面返回时会触发回调,决定是否返回。可用于二次确认退出的场景。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onWillPop】 : 返回回调 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart new file mode 100644 index 00000000..46b0e827 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class CustomWillPopScope extends StatelessWidget { + const CustomWillPopScope({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return WillPopScope( + child: const BackButton(), + onWillPop: () => _willPop(context), + ); + } + + Future _willPop(context) async { + bool? exit = await showDialog( + context: context, + builder: (ctx) => AlertDialog( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + title: const Text('提示'), + content: const Text('你确定要离开此页吗?'), + actions: [ + ElevatedButton( + onPressed: () => Navigator.of(ctx).pop(true), + child: const Text('确定'), + ), + ElevatedButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: const Text('取消'), + ), + ], + ), + ); + print('====_willPop==:$exit========'); + + return exit??false; + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json new file mode 100644 index 00000000..6503e5cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Jahresauswahl", + "info": "Komponente zur Auswahl des Jahres, sieht etwas bescheiden aus. Kann den auszuwählenden Datumsbereich, das ausgewählte Datum usw. festlegen und empfängt jedes Auswahlereignis", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von YearPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【onChanged】 : Klick-Rückruf 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json new file mode 100644 index 00000000..429a2828 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Year Picker", + "info": "A component for selecting years, with a rather modest appearance. It allows specifying the date range for selection, selected dates, etc., and receives each selection event.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of YearPicker", + "desc": [ + "【selectedDate】: Selected date 【DateTime】", + "【firstDate】: First date limit 【DateTime】", + "【lastDate】: Last date limit 【DateTime】", + "【onChanged】: Click callback 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json new file mode 100644 index 00000000..119ce942 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Selector de año", + "info": "Componente de selección de año, de apariencia modesta. Permite especificar el rango de fechas seleccionables, la fecha seleccionada, etc., y recibe cada evento de selección.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de YearPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【firstDate】 : Límite de la primera fecha 【DateTime】", + "【lastDate】 : Límite de la última fecha 【DateTime】", + "【onChanged】 : Callback al hacer clic 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json new file mode 100644 index 00000000..a4c3fa06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Sélecteur d'année", + "info": "Composant de sélection d'année, d'apparence modeste. Permet de spécifier la plage de dates sélectionnables, la date sélectionnée, etc., et reçoit chaque événement de sélection.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de YearPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【onChanged】 : Rappel au clic 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json new file mode 100644 index 00000000..40602596 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Selettore Anno", + "info": "Componente per la selezione dell'anno, dall'aspetto modesto. Consente di specificare l'intervallo di date selezionabili, la data selezionata, ecc., e riceve ogni evento di selezione.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo Base di YearPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【firstDate】 : Limite data iniziale 【DateTime】", + "【lastDate】 : Limite data finale 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json new file mode 100644 index 00000000..e7ea91c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "年ピッカー", + "info": "年の選択コンポーネントで、見た目はやや地味です。選択可能な日付範囲や選択された日付などを指定でき、選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPickerの基本使用", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json new file mode 100644 index 00000000..5c0dadd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "연도 선택기", + "info": "연도를 선택하는 컴포넌트로, 외관이 다소 허술합니다. 선택 가능한 날짜 범위, 선택된 날짜 등을 지정할 수 있으며, 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPicker 기본 사용법", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【firstDate】 : 최초 날짜 제한 【DateTime】", + "【lastDate】 : 최종 날짜 제한 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json new file mode 100644 index 00000000..93948873 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Seletor de Ano", + "info": "Componente de seleção de ano, com uma aparência bastante simples. Permite especificar o intervalo de datas, a data selecionada, entre outros, e recebe eventos de seleção.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do YearPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json new file mode 100644 index 00000000..3b713079 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Выбор года", + "info": "Компонент для выбора года, выглядит довольно скромно. Можно указать диапазон дат, выбранную дату и т.д., принимает каждое событие выбора", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование YearPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【onChanged】 : Обратный вызов при нажатии 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json new file mode 100644 index 00000000..d8332463 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "年份选择器", + "info": "年份的选择组件,长相比较寒酸。可指定选择的日期范围、选中日期等,接收每份选中事件", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart new file mode 100644 index 00000000..a3e83334 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomYearPicker extends StatefulWidget { + const CustomYearPicker({Key? key}) : super(key: key); + + @override + _CustomYearPickerState createState() => _CustomYearPickerState(); +} + +class _CustomYearPickerState extends State { + DateTime _date = DateTime.now(); + + @override + Widget build(BuildContext context) { + return SizedBox( + height:150, + child: YearPicker( + selectedDate: _date, + onChanged: (date) => setState(() => _date = date), + firstDate: DateTime(2018), + lastDate: DateTime(2030), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json new file mode 100644 index 00000000..9bd458ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Über Dialog", + "info": "Ein Dialogfeld zur Anwendungsbeschreibung, in dem das Anwendungssymbol, der Anwendungsname, die Anwendungsversionsnummer und andere Informationen sowie eine Liste von internen Unterkomponenten angegeben werden können. Durch Klicken auf die Schaltfläche auf der linken Seite gelangen Sie zur Zertifikatsseite.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AboutDialog", + "desc": [ + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Anwendungsrecht 【String】", + "【children】 : Liste der Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json new file mode 100644 index 00000000..f21a172c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "About Dialog", + "info": "The application's introduction dialog, which can specify the application icon, application name, application version number, and other information, as well as the internal sub-component list. Clicking the button on the left can navigate to the certificate page.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AboutDialog", + "desc": [ + "【applicationIcon】: Top-left icon 【Widget】", + "【applicationVersion】: Version number 【String】", + "【applicationName】: Application name 【String】", + "【applicationLegalese】: Application legal terms 【String】", + "【children】: Sub-component list 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json new file mode 100644 index 00000000..ba17fb88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Diálogo Acerca de", + "info": "Diálogo de introducción de la aplicación, donde se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión de la aplicación y otra información, así como una lista de subcomponentes internos. Al hacer clic en el botón de la izquierda, se puede acceder a la página de certificados.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AboutDialog", + "desc": [ + "【applicationIcon】 : Icono superior izquierdo 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Legalidad de la aplicación 【String】", + "【children】 : Lista de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json new file mode 100644 index 00000000..d249dda3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Dialogue À Propos", + "info": "La boîte de dialogue de présentation de l'application, qui peut spécifier l'icône de l'application, le nom de l'application, le numéro de version de l'application et d'autres informations ainsi que la liste des sous-composants internes. Cliquer sur le bouton de gauche permet de naviguer vers la page des licences.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AboutDialog", + "desc": [ + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Mentions légales de l'application 【String】", + "【children】 : Liste des sous-composants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json new file mode 100644 index 00000000..cbae88ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Finestra Informazioni", + "info": "La finestra di dialogo delle informazioni sull'applicazione, che consente di specificare l'icona dell'applicazione, il nome dell'applicazione, il numero di versione dell'applicazione e altre informazioni, nonché l'elenco dei componenti interni. Cliccando sul pulsante a sinistra è possibile accedere alla pagina delle licenze.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AboutDialog", + "desc": [ + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Informazioni legali dell'applicazione 【String】", + "【children】 : Lista dei componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json new file mode 100644 index 00000000..b0ca3505 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "ダイアログについて", + "info": "アプリケーションの概要ダイアログで、アプリケーションのアイコン、アプリケーション名、アプリケーションのバージョン番号などの情報と内部のサブコンポーネントリストを指定できます。左側のボタンをクリックすると、証明書ページにジャンプします。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialogの基本使用", + "desc": [ + "【applicationIcon】 : 左上アイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリケーション名 【String】", + "【applicationLegalese】 : アプリケーションの法律 【String】", + "【children】 : サブコンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json new file mode 100644 index 00000000..453ec339 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "정보 대화 상자", + "info": "애플리케이션의 정보 대화 상자로, 애플리케이션 아이콘, 애플리케이션 이름, 애플리케이션 버전 번호 등의 정보와 내부의 하위 구성 요소 목록을 지정할 수 있습니다. 왼쪽 버튼을 클릭하면 인증서 페이지로 이동할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialog 기본 사용", + "desc": [ + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 애플리케이션 이름 【String】", + "【applicationLegalese】 : 애플리케이션 법률 정보 【String】", + "【children】 : 하위 구성 요소 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json new file mode 100644 index 00000000..996e65a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Diálogo Sobre", + "info": "Diálogo de introdução da aplicação, que pode especificar o ícone da aplicação, nome da aplicação, número da versão da aplicação e outras informações, bem como a lista de subcomponentes internos. Clicar no botão esquerdo pode saltar para a página de licenças.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AboutDialog", + "desc": [ + "【applicationIcon】 : Ícone superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legislação da aplicação 【String】", + "【children】 : Lista de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json new file mode 100644 index 00000000..d1fda7b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "О диалоговом окне", + "info": "Диалоговое окно с описанием приложения, в котором можно указать значок приложения, название приложения, версию приложения и другие данные, а также список внутренних дочерних компонентов. Нажатие на кнопку слева позволяет перейти на страницу лицензии.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AboutDialog", + "desc": [ + "【applicationIcon】 : Иконка в верхнем левом углу 【Widget】", + "【applicationVersion】 : Номер версии 【String】", + "【applicationName】 : Название приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】", + "【children】 : Список дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json new file mode 100644 index 00000000..8dd6cffe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "关于对话框", + "info": "应用的简介对话框,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表,点击左侧按钮可以跳转到证书页。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialog基本使用", + "desc": [ + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】", + "【children】 : 子组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart new file mode 100644 index 00000000..2a1cb902 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +class CustomAboutDialog extends StatelessWidget { + const CustomAboutDialog({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + _buildAboutDialog(), + Positioned(top: 50, right: 20, child: _buildRaisedButton(context)), + ], + ); + } + + Widget _buildRaisedButton(BuildContext context) => ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () { + showDialog(context: context, builder: (ctx) => _buildAboutDialog()); + }, + child: const Text( + 'Just Show It', + style: TextStyle(color: Colors.white), + ), + ); + + AboutDialog _buildAboutDialog() { + return AboutDialog( + applicationIcon: const FlutterLogo(), + applicationVersion: 'v0.0.1', + applicationName: 'Flutter Unit', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', + children: [ + Container( + margin: const EdgeInsets.only(top: 20), + width: 80, + height: 80, + child: Image.asset('assets/images/icon_head.webp')), + Container( + margin: const EdgeInsets.only(top: 10), + alignment: Alignment.center, + child: const Text( + 'The King Of Coder.', + style: TextStyle( + color: Colors.white, + fontSize: 20, + shadows: [ + Shadow( + color: Colors.blue, offset: Offset(.5, .5), blurRadius: 3) + ], + ), + )) + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json new file mode 100644 index 00000000..2b309c55 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Über App-Eintrag", + "info": "Ein Klickelement, das beim Klicken Anwendungsinformationen anzeigen kann. Es können Anwendungssymbole, Anwendungsname, Anwendungsversionsnummer und andere Informationen sowie die interne Liste der Unterkomponenten angegeben werden.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AboutListTile", + "desc": [ + "【icon】 : Linkes Symbol 【Widget】", + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Anwendungsrecht 【String】", + "【aboutBoxChildren】 : Inhaltskomponenten des Popup-Fensters 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json new file mode 100644 index 00000000..2897d009 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "About App Entry", + "info": "A clickable entry that can pop up application-related information when clicked. It can specify the application icon, application name, application version number, and other information, as well as a list of internal child components.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AboutListTile", + "desc": [ + "【icon】 : Left icon 【Widget】", + "【applicationIcon】 : Top-left icon 【Widget】", + "【applicationVersion】 : Version number 【String】", + "【applicationName】 : Application name 【String】", + "【applicationLegalese】 : Application legalese 【String】", + "【aboutBoxChildren】 : Dialog content components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json new file mode 100644 index 00000000..7a964f25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Entrada sobre la aplicación", + "info": "Una entrada en la que se puede hacer clic para mostrar información relacionada con la aplicación. Se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión y otros detalles, así como una lista de componentes internos.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AboutListTile", + "desc": [ + "【icon】 : Icono izquierdo 【Widget】", + "【applicationIcon】 : Icono superior izquierdo 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Legal de la aplicación 【String】", + "【aboutBoxChildren】 : Componentes del contenido del cuadro emergente 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json new file mode 100644 index 00000000..579c45e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Élément À Propos de l'Application", + "info": "Un élément cliquable qui peut afficher des informations sur l'application lorsqu'il est cliqué. Peut spécifier l'icône de l'application, le nom de l'application, le numéro de version de l'application et d'autres informations ainsi qu'une liste de composants internes.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AboutListTile", + "desc": [ + "【icon】 : Icône gauche 【Widget】", + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Législation de l'application 【String】", + "【aboutBoxChildren】 : Composants du contenu de la boîte de dialogue 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json new file mode 100644 index 00000000..79a4be64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Voce di menu Informazioni", + "info": "Una voce cliccabile che, quando viene cliccata, può visualizzare informazioni relative all'applicazione, specificando icone dell'applicazione, nome dell'applicazione, numero di versione e un elenco di componenti interni.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AboutListTile", + "desc": [ + "【icon】 : Icona a sinistra 【Widget】", + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Legale dell'applicazione 【String】", + "【aboutBoxChildren】 : Componenti del contenuto della finestra 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json new file mode 100644 index 00000000..f1a37846 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "アプリについてのリストアイテム", + "info": "クリックするとアプリの関連情報をポップアップ表示するアイテムで、アプリアイコン、アプリ名、アプリバージョン番号などの情報と内部のサブコンポーネントリストを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTileの基本的な使用", + "desc": [ + "【icon】 : 左アイコン 【Widget】", + "【applicationIcon】 : 左上アイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリ名 【String】", + "【applicationLegalese】 : アプリの法律情報 【String】", + "【aboutBoxChildren】 : ポップアップボックスの内容コンポーネント 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json new file mode 100644 index 00000000..1d3800ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "앱 정보 항목", + "info": "클릭 시 앱 관련 정보를 팝업할 수 있는 클릭 항목으로, 앱 아이콘, 앱 이름, 앱 버전 번호 등의 정보와 내부 하위 컴포넌트 목록을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTile 기본 사용법", + "desc": [ + "【icon】 : 왼쪽 아이콘 【Widget】", + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 앱 이름 【String】", + "【applicationLegalese】 : 앱 법률 정보 【String】", + "【aboutBoxChildren】 : 팝업 내용 컴포넌트 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json new file mode 100644 index 00000000..28794038 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Item sobre a aplicação", + "info": "Um item clicável que, ao ser clicado, exibe informações sobre a aplicação, podendo especificar ícone da aplicação, nome da aplicação, número da versão e uma lista de componentes internos.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AboutListTile", + "desc": [ + "【icon】 : Ícone esquerdo 【Widget】", + "【applicationIcon】 : Ícone superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legislação da aplicação 【String】", + "【aboutBoxChildren】 : Componentes do conteúdo da caixa de diálogo 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json new file mode 100644 index 00000000..ad830b43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "О приложении", + "info": "Элемент, при нажатии на который отображается информация о приложении, можно указать значок приложения, имя приложения, версию приложения и другие данные, а также список внутренних компонентов.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AboutListTile", + "desc": [ + "【icon】 : Левый значок 【Widget】", + "【applicationIcon】 : Левый верхний значок 【Widget】", + "【applicationVersion】 : Номер версии 【String】", + "【applicationName】 : Имя приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】", + "【aboutBoxChildren】 : Компоненты содержимого всплывающего окна 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json new file mode 100644 index 00000000..5fe2f3b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "关于应用条目", + "info": "一个点击条目,点击时可以弹出应用相关信息,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表。", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTile基本使用", + "desc": [ + "【icon】 : 左图标 【Widget】", + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】", + "【aboutBoxChildren】 : 弹框内容组件 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart new file mode 100644 index 00000000..29266545 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart @@ -0,0 +1,34 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +class AboutListTileDemo extends StatelessWidget { + const AboutListTileDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const AboutListTile( + icon: Icon(Icons.info), + applicationIcon: FlutterLogo(), + applicationName: 'Flutter Unit', + applicationVersion: 'v0.0.1', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', + aboutBoxChildren: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Text( + ' FlutterUnit是【张风捷特烈】的开源项目,' + '收录Flutter的300+组件,并附加详细介绍以及操作交互,' + '希望帮助广大编程爱好者入门Flutter。' + '更多知识可以关注掘金账号、公众号【编程之王】。', + style: TextStyle(color: Color(0xff999999), fontSize: 16), + textAlign: TextAlign.justify, + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json new file mode 100644 index 00000000..69685553 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Ereignis-Chip", + "info": "Ähnlich wie die Chip-Komponente, aber mit einigen Klick-Eigenschaften. Kann die Schattentiefe beim Klicken und das Klick-Ereignis festlegen.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Normale Darstellung des ActionChip", + "desc": [ + "【onPressed】: Klick-Ereignis 【Function】", + "【pressElevation】: Schattentiefe beim Drücken 【double】", + "Andere Eigenschaften sind identisch mit der Chip-Komponente, keine rechte Komponente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json new file mode 100644 index 00000000..245828d9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Action Chip", + "info": "Similar style to the Chip component, with some clickable properties. You can specify the shadow depth and click event when pressed.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal performance of ActionChip is as follows", + "desc": [ + "【onPressed】: Click event 【Function】", + "【pressElevation】: Shadow depth when pressed 【double】", + "Other properties are the same as the Chip component, no right component." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json new file mode 100644 index 00000000..c7865162 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip de Acción", + "info": "Estilo similar al componente Chip, con algunas propiedades de clic. Puede especificar la profundidad de la sombra al hacer clic y el evento de clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de ActionChip es el siguiente", + "desc": [ + "【onPressed】: Evento de clic 【Function】", + "【pressElevation】: Profundidad de la sombra al presionar 【double】", + "Otras propiedades son iguales al componente Chip, sin componente derecho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json new file mode 100644 index 00000000..6dc10d3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip d'action", + "info": "Un style similaire au composant Chip, avec des propriétés de clic. Vous pouvez spécifier la profondeur de l'ombre lors du clic et l'événement de clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La représentation normale de l'ActionChip est la suivante", + "desc": [ + "【onPressed】: Événement de clic 【Function】", + "【pressElevation】: Profondeur de l'ombre lors de la pression 【double】", + "Les autres propriétés sont identiques au composant Chip, sans composant à droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json new file mode 100644 index 00000000..02508a48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip di Azione", + "info": "Uno stile simile al componente Chip, con alcune proprietà di clic. È possibile specificare la profondità dell'ombra al clic e l'evento di clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione normale di ActionChip è la seguente", + "desc": [ + "【onPressed】: Evento di clic 【Function】", + "【pressElevation】: Profondità dell'ombra al clic 【double】", + "Altre proprietà sono simili al componente Chip, senza componente a destra." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json new file mode 100644 index 00000000..cd38faba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "アクションチップ", + "info": "Chipコンポーネントに似たスタイルで、いくつかのクリック属性があります。クリック時の影の深さやクリックイベントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChipの通常の表現は以下の通りです", + "desc": [ + "【onPressed】: クリックイベント 【Function】", + "【pressElevation】: 押下時の影の深さ 【double】", + "その他の属性はChipコンポーネントと同じで、右側のコンポーネントはありません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json new file mode 100644 index 00000000..de66f073 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "이벤트 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 클릭 속성이 있습니다. 클릭 시 그림자 깊이와 클릭 이벤트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChip의 일반적인 표현은 다음과 같습니다", + "desc": [ + "【onPressed】: 클릭 이벤트 【Function】", + "【pressElevation】: 눌렀을 때 그림자 깊이 【double】", + "기타 속성은 Chip 컴포넌트와 동일하며, 오른쪽 컴포넌트가 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json new file mode 100644 index 00000000..b11af7dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip de Ação", + "info": "Estilo semelhante ao componente Chip, com algumas propriedades de clique. Pode especificar a profundidade da sombra ao clicar e o evento de clique.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A aparência normal do ActionChip é a seguinte", + "desc": [ + "【onPressed】: Evento de clique 【Function】", + "【pressElevation】: Profundidade da sombra ao pressionar 【double】", + "Outras propriedades são iguais ao componente Chip, sem componente à direita." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json new file mode 100644 index 00000000..5c34b9fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Чип действия", + "info": "Стиль, похожий на компонент Chip, с некоторыми свойствами для нажатия. Можно указать глубину тени при нажатии и событие нажатия.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное поведение ActionChip выглядит следующим образом", + "desc": [ + "【onPressed】: Событие нажатия 【Function】", + "【pressElevation】: Глубина тени при нажатии 【double】", + "Другие свойства такие же, как у компонента Chip, без правого компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json new file mode 100644 index 00000000..64440ef3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "事件小条", + "info": "和Chip组件类似的样式,有一些点击的属性。可以指定点击时的阴影深、点击事件。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChip的普通表现如下", + "desc": [ + "【onPressed】: 点击事件 【Function】", + "【pressElevation】: 按下时影深 【double】", + "其他属性同Chip组件,无右侧组件。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart new file mode 100644 index 00000000..b384b890 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart @@ -0,0 +1,29 @@ + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +/// + + +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + + +class CustomActionChip extends StatelessWidget { + const CustomActionChip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ActionChip( + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + label: const Text("This is a ActionChip."), + backgroundColor: Colors.grey.withAlpha(66), + avatar: Image.asset("assets/images/icon_head.webp"), + shadowColor: Colors.orangeAccent, + elevation: 3, + pressElevation: 5, + onPressed: ()=> DialogAbout.show(context), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json new file mode 100644 index 00000000..2cf8152a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Dialogfeld", + "info": "Eine allgemeine Dialogstruktur, die Komponenten im Kopf-, Mittel- und Fußbereich angeben kann. Verfügt über Textstile und Ränder für Titel und Inhalt, Schattentiefe, Form und andere Attribute.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AlertDialog", + "desc": [ + "【title】 : Oberste Komponente 【Widget】", + "【content】 : Inhaltskomponente 【Widget】", + "【titleTextStyle】 : Textstil für den Titel 【TextStyle】", + "【contentTextStyle】 : Textstil für den Inhalt 【TextStyle】", + "【titlePadding】 : Innenabstand für den Titel 【EdgeInsetsGeometry】", + "【contentPadding】 : Innenabstand für den Inhalt 【EdgeInsetsGeometry】", + "【actions】 : Liste der Komponenten in der unteren rechten Ecke 【List】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json new file mode 100644 index 00000000..fbfa30c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Popup Dialog", + "info": "A general dialog structure that can specify components at the head, middle, and tail. It has text styles and margins for the title and content, as well as properties such as elevation and shape.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AlertDialog", + "desc": [ + "【title】 : Top component 【Widget】", + "【content】 : Content component 【Widget】", + "【titleTextStyle】 : Top text style 【TextStyle】", + "【contentTextStyle】 : Content text style 【TextStyle】", + "【titlePadding】 : Top padding 【EdgeInsetsGeometry】", + "【contentPadding】 : Content padding 【EdgeInsetsGeometry】", + "【actions】 : Bottom right component list 【List】", + "【backgroundColor】 : Background color 【Color】", + "【elevation】 : Elevation 【double】", + "【shape】 : Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json new file mode 100644 index 00000000..b41ad91d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Cuadro de diálogo emergente", + "info": "Una estructura de diálogo genérica que permite especificar componentes en la parte superior, media e inferior. Tiene propiedades como el estilo de texto y los márgenes del título y el contenido, la profundidad de la sombra, la forma, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AlertDialog", + "desc": [ + "【title】 : Componente superior 【Widget】", + "【content】 : Componente de contenido 【Widget】", + "【titleTextStyle】 : Estilo de texto del título 【TextStyle】", + "【contentTextStyle】 : Estilo de texto del contenido 【TextStyle】", + "【titlePadding】 : Relleno superior 【EdgeInsetsGeometry】", + "【contentPadding】 : Relleno del contenido 【EdgeInsetsGeometry】", + "【actions】 : Lista de componentes en la esquina inferior derecha 【List】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de la sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json new file mode 100644 index 00000000..fa306c88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Boîte de dialogue contextuelle", + "info": "Une structure de dialogue générique qui permet de spécifier des composants en haut, au milieu et en bas. Possède des styles de texte et des marges pour le titre et le contenu, ainsi que des propriétés telles que la profondeur d'ombre, la forme, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AlertDialog", + "desc": [ + "【title】 : Composant du haut 【Widget】", + "【content】 : Composant du contenu 【Widget】", + "【titleTextStyle】 : Style de texte du titre 【TextStyle】", + "【contentTextStyle】 : Style de texte du contenu 【TextStyle】", + "【titlePadding】 : Marge intérieure du titre 【EdgeInsetsGeometry】", + "【contentPadding】 : Marge intérieure du contenu 【EdgeInsetsGeometry】", + "【actions】 : Liste des composants en bas à droite 【List】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur d'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json new file mode 100644 index 00000000..8566bdcd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Finestra di dialogo pop-up", + "info": "Una struttura di dialogo generica che consente di specificare componenti nella parte superiore, centrale e inferiore. Possiede stili di testo e margini per il titolo e il contenuto, oltre a proprietà come profondità dell'ombra, forma, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di AlertDialog", + "desc": [ + "【title】 : Componente superiore 【Widget】", + "【content】 : Componente del contenuto 【Widget】", + "【titleTextStyle】 : Stile del testo superiore 【TextStyle】", + "【contentTextStyle】 : Stile del testo del contenuto 【TextStyle】", + "【titlePadding】 : Spaziatura interna superiore 【EdgeInsetsGeometry】", + "【contentPadding】 : Spaziatura interna del contenuto 【EdgeInsetsGeometry】", + "【actions】 : Lista dei componenti nell'angolo inferiore destro 【List】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json new file mode 100644 index 00000000..188f972f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "ポップアップダイアログ", + "info": "一般的なダイアログ構造で、上部、中央、下部にコンポーネントを指定できます。タイトル、内容のテキストスタイルと余白、影の深さ、形状などの属性を持っています。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialogの基本使用", + "desc": [ + "【title】 : 上部コンポーネント 【Widget】", + "【content】 : 内容コンポーネント 【Widget】", + "【titleTextStyle】 : 上部テキストスタイル 【TextStyle】", + "【contentTextStyle】 : 内容テキストスタイル 【TextStyle】", + "【titlePadding】 : 上部内側余白 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内側余白 【EdgeInsetsGeometry】", + "【actions】 : 右下コンポーネントリスト 【List】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json new file mode 100644 index 00000000..0d50477a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "팝업 대화 상자", + "info": "일반적인 대화 상자 구조로, 상단, 중간, 하단의 구성 요소를 지정할 수 있습니다. 제목, 내용의 텍스트 스타일과 여백, 그림자 깊이, 모양 등의 속성을 가지고 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialog 기본 사용", + "desc": [ + "【title】 : 상단 구성 요소 【Widget】", + "【content】 : 내용 구성 요소 【Widget】", + "【titleTextStyle】 : 상단 텍스트 스타일 【TextStyle】", + "【contentTextStyle】 : 내용 텍스트 스타일 【TextStyle】", + "【titlePadding】 : 상단 내부 여백 【EdgeInsetsGeometry】", + "【contentPadding】 : 내용 내부 여백 【EdgeInsetsGeometry】", + "【actions】 : 오른쪽 하단 구성 요소 목록 【List】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json new file mode 100644 index 00000000..b8a726c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Diálogo de Alerta", + "info": "Uma estrutura de diálogo genérica que permite especificar componentes no topo, meio e fim. Possui estilos de texto e margens para o título e conteúdo, além de propriedades como profundidade de sombra, forma, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AlertDialog", + "desc": [ + "【title】 : Componente do topo 【Widget】", + "【content】 : Componente de conteúdo 【Widget】", + "【titleTextStyle】 : Estilo de texto do topo 【TextStyle】", + "【contentTextStyle】 : Estilo de texto do conteúdo 【TextStyle】", + "【titlePadding】 : Margem interna do topo 【EdgeInsetsGeometry】", + "【contentPadding】 : Margem interna do conteúdo 【EdgeInsetsGeometry】", + "【actions】 : Lista de componentes no canto inferior direito 【List】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json new file mode 100644 index 00000000..f9cbc251 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Всплывающее диалоговое окно", + "info": "Универсальная структура диалогового окна, позволяющая указать компоненты в верхней, средней и нижней частях. Имеет стили текста и отступы для заголовка и содержимого, а также свойства, такие как тень, форма и другие.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AlertDialog", + "desc": [ + "【title】 : Верхний компонент 【Widget】", + "【content】 : Компонент содержимого 【Widget】", + "【titleTextStyle】 : Стиль текста заголовка 【TextStyle】", + "【contentTextStyle】 : Стиль текста содержимого 【TextStyle】", + "【titlePadding】 : Внутренний отступ заголовка 【EdgeInsetsGeometry】", + "【contentPadding】 : Внутренний отступ содержимого 【EdgeInsetsGeometry】", + "【actions】 : Список компонентов в правом нижнем углу 【List】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Тень 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json new file mode 100644 index 00000000..6d8bb8d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "弹出对话框", + "info": "一个通用的对话框结构,可指定头、中、尾处的组件。拥有标题、内容的文字样式和边距,影深、形状等属性。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialog基本使用", + "desc": [ + "【title】 : 顶部组件 【Widget】", + "【content】 : 内容组件 【Widget】", + "【titleTextStyle】 : 顶部文字样式 【TextStyle】", + "【contentTextStyle】 : 内容文字样式 【TextStyle】", + "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】", + "【actions】 : 右下角组件列表 【List】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart new file mode 100644 index 00000000..ada7cf5c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart @@ -0,0 +1,99 @@ + + +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; + +class CustomAlertDialog extends StatelessWidget { + const CustomAlertDialog({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildRaisedButton(context), + _buildAlertDialog(), + ], + ); + } + + Widget _buildRaisedButton(BuildContext context) => ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () { + showDialog(context: context, builder: (ctx) => _buildAlertDialog()); + }, + child: const Text( + 'Just Show It !', + style: TextStyle(color: Colors.white), + ), + ); + + Widget _buildAlertDialog() { + return AlertDialog( + title: _buildTitle(), + titleTextStyle: const TextStyle(fontSize: 20, color: Colors.black), + titlePadding: const EdgeInsets.only( + top: 5, + left: 20, + ), + contentPadding: const EdgeInsets.symmetric(horizontal: 5), + backgroundColor: Colors.white, + content: _buildContent(), + actions: const [ + Icon(Icons.android, color: Colors.blue,), + Icon(Icons.add, color: Colors.blue,), + Icon(Icons.g_translate, color: Colors.blue,), + Icon(Icons.games, color: Colors.blue,), + ], + elevation: 4, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + ); + } + + Widget _buildTitle() { + return Row( + //标题 + children: [ + Image.asset( + "assets/images/icon_head.webp", + width: 30, + height: 30, + ), + const SizedBox(width: 10,), + const Expanded( + child: Text( + "关于", + style: TextStyle(fontSize: 18), + )), + const CloseButton() + ], + ); + } + + Widget _buildContent() { + return Column( + mainAxisSize: MainAxisSize.min, + children: const [ + Padding( + padding: EdgeInsets.all(10.0), + child: Text( + ' FlutterUnit是【张风捷特烈】的开源项目,' + '收录Flutter的200+组件,并附加详细介绍以及操作交互,' + '希望帮助广大编程爱好者入门Flutter。' + '更多知识可以关注掘金账号、公众号【编程之王】。', + style: TextStyle(color: Color(0xff999999), fontSize: 16), + textAlign: TextAlign.justify, + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json new file mode 100644 index 00000000..bd93fd19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Animiertes Symbol", + "info": "Verwenden Sie die Symboldaten von AnimatedIcons, um Symbole mit einem Animationscontroller zu animieren. Größe, Farbe usw. können angegeben werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedIcon", + "desc": [ + "【icon】 : Animationssymboldaten 【AnimatedIcons】", + "【size】 : Größe 【double】", + "【color】 : Farbe 【Color】", + "【progress】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json new file mode 100644 index 00000000..beed3414 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icon Animation", + "info": "Using the icon data of AnimatedIcons, you can animate the icon based on an animation controller. The icon size, color, etc., can be specified.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedIcon", + "desc": [ + "【icon】: Animation icon data 【AnimatedIcons】", + "【size】: Size 【double】", + "【color】: Color 【Color】", + "【progress】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json new file mode 100644 index 00000000..d9cada14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icono animado", + "info": "Utiliza los datos de iconos de AnimatedIcons para crear efectos de animación en los iconos basados en un controlador de animación. Se puede especificar el tamaño del icono, el color, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedIcon", + "desc": [ + "【icon】: Datos del icono animado 【AnimatedIcons】", + "【size】: Tamaño 【double】", + "【color】: Color 【Color】", + "【progress】: Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json new file mode 100644 index 00000000..583ef6c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icône animée", + "info": "Utilisez les données d'icône d'AnimatedIcons pour animer une icône en fonction d'un contrôleur d'animation. Vous pouvez spécifier la taille, la couleur, etc. de l'icône.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedIcon", + "desc": [ + "【icon】 : Données de l'icône animée 【AnimatedIcons】", + "【size】 : Taille 【double】", + "【color】 : Couleur 【Color】", + "【progress】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json new file mode 100644 index 00000000..60a5bc1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icona Animata", + "info": "Utilizza i dati delle icone di AnimatedIcons per creare effetti di animazione delle icone basati su un controller di animazione. È possibile specificare dimensioni, colore, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedIcon", + "desc": [ + "【icon】 : Dati dell'icona animata 【AnimatedIcons】", + "【size】 : Dimensione 【double】", + "【color】 : Colore 【Color】", + "【progress】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json new file mode 100644 index 00000000..49b64808 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "アイコンアニメーション", + "info": "AnimatedIconsのアイコンデータを使用して、アニメーションコントローラーに基づいてアイコンにアニメーション効果を与えることができます。アイコンのサイズや色などを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIconの基本使用", + "desc": [ + "【icon】 : アニメーションアイコンデータ 【AnimatedIcons】", + "【size】 : サイズ 【double】", + "【color】 : 色 【Color】", + "【progress】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json new file mode 100644 index 00000000..25b5ed60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "아이콘 애니메이션", + "info": "AnimatedIcons의 아이콘 데이터를 사용하여 애니메이션 컨트롤러에 따라 아이콘에 애니메이션 효과를 적용할 수 있습니다. 아이콘 크기, 색상 등을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIcon 기본 사용", + "desc": [ + "【icon】 : 애니메이션 아이콘 데이터 【AnimatedIcons】", + "【size】 : 크기 【double】", + "【color】 : 색상 【Color】", + "【progress】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json new file mode 100644 index 00000000..fad0bab6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Ícone Animado", + "info": "Utiliza os dados de ícones de AnimatedIcons para criar efeitos de animação com base em um controlador de animação. Permite especificar o tamanho, cor e outros atributos do ícone.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedIcon", + "desc": [ + "【icon】 : Dados do ícone animado 【AnimatedIcons】", + "【size】 : Tamanho 【double】", + "【color】 : Cor 【Color】", + "【progress】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json new file mode 100644 index 00000000..414e42a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Анимированная иконка", + "info": "Используйте данные иконки AnimatedIcons для создания анимации иконки с помощью контроллера анимации. Можно указать размер и цвет иконки.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedIcon", + "desc": [ + "【icon】 : Данные анимированной иконки 【AnimatedIcons】", + "【size】 : Размер 【double】", + "【color】 : Цвет 【Color】", + "【progress】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json new file mode 100644 index 00000000..d9f9c3aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "图标动画", + "info": "使用AnimatedIcons的图标数据,可以根据一个动画控制器来使图标进行动画效果。可指定图标大小、颜色等。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIcon基本使用", + "desc": [ + "【icon】 : 动画图标数据 【AnimatedIcons】", + "【size】 : 大小 【double】", + "【color】 : 颜色 【Color】", + "【progress】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart new file mode 100644 index 00000000..4e96eb8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class CustomAnimatedIcon extends StatefulWidget { + const CustomAnimatedIcon({Key? key}) : super(key: key); + + @override + _CustomAnimatedIconState createState() => _CustomAnimatedIconState(); +} + +class _CustomAnimatedIconState extends State + with SingleTickerProviderStateMixin { + late AnimationController _ctrl; + + @override + void initState() { + _ctrl = AnimationController(vsync: this, duration: const Duration(seconds: 1)); + _ctrl.forward(); + super.initState(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _ctrl.forward(from: 0), + child: Wrap( + runSpacing: 30, + children: _buildChildren(), + ), + ); + } + + final Map data = { + Colors.orange: AnimatedIcons.menu_arrow, + Colors.blue: AnimatedIcons.ellipsis_search, + Colors.red: AnimatedIcons.close_menu, + Colors.green: AnimatedIcons.arrow_menu, + Colors.cyanAccent: AnimatedIcons.play_pause, + Colors.purple: AnimatedIcons.pause_play, + }; + + List _buildChildren() => + data.keys + .map((Color color) => AnimatedIcon( + size: 50, + color: color, + icon: data[color]!, + progress: _ctrl, + )) + .toList(); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json new file mode 100644 index 00000000..aa565405 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Automatische Vervollständigung", + "info": "Bietet während der Eingabe eine Überlagerung mit Vorschlägen an, damit Benutzer auswählen können, und bietet ein hohes Maß an Anpassbarkeit.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Autocomplete", + "desc": [ + "【optionsBuilder】: Optionen-Builder 【AutocompleteOptionsBuilder】", + "【onSelected】: Rückruf bei Auswahl 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generika von Autocomplete", + "desc": [ + "【optionsViewBuilder】: Panel-Builder 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Eingabe-Builder 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Textanzeige 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json new file mode 100644 index 00000000..221f824b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Autocomplete", + "info": "During input, provides a suggestion overlay for users to select from, with a high degree of customization.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Autocomplete", + "desc": [ + "【optionsBuilder】: Option builder 【AutocompleteOptionsBuilder】", + "【onSelected】: Callback when selected 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generics of Autocomplete", + "desc": [ + "【optionsViewBuilder】: Panel builder 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Input builder 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Text display 【AutocompleteOptionToString】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json new file mode 100644 index 00000000..8e9cdf04 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Autocompletado", + "info": "Proporciona una capa de sugerencias durante la entrada para que el usuario pueda seleccionar, con un alto grado de personalización.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Autocomplete", + "desc": [ + "【optionsBuilder】: Constructor de opciones 【AutocompleteOptionsBuilder】", + "【onSelected】: Devolución de llamada al seleccionar 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Genéricos de Autocomplete", + "desc": [ + "【optionsViewBuilder】: Constructor del panel 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Constructor de entrada 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Visualización de texto 【AutocompleteOptionToString】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json new file mode 100644 index 00000000..1c2b6d1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Remplissage automatique", + "info": "Pendant la saisie, fournit une superposition de suggestions pour que l'utilisateur puisse choisir, avec un haut degré de personnalisation.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Autocomplete", + "desc": [ + "【optionsBuilder】 : Constructeur d'options 【AutocompleteOptionsBuilder】", + "【onSelected】 : Rappel lors de la sélection 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Génériques d'Autocomplete", + "desc": [ + "【optionsViewBuilder】 : Constructeur de panneau 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : Constructeur de saisie 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : Affichage de texte 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json new file mode 100644 index 00000000..921cc9f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Completamento automatico", + "info": "Durante l'immissione, fornisce un overlay di suggerimenti per la selezione dell'utente, con un alto grado di personalizzazione.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Autocomplete", + "desc": [ + "【optionsBuilder】 : Costruttore di opzioni 【AutocompleteOptionsBuilder】", + "【onSelected】 : Callback alla selezione 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generics di Autocomplete", + "desc": [ + "【optionsViewBuilder】 : Costruttore del pannello 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : Costruttore di input 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : Visualizzazione del testo 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json new file mode 100644 index 00000000..74cbbfed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "オートコンプリート", + "info": "入力中に、ユーザーが選択できるように連想語をフローティングレイヤーで表示し、高いカスタマイズ性を持っています。", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocompleteの基本使用", + "desc": [ + "【optionsBuilder】 : オプション構築器 【AutocompleteOptionsBuilder】", + "【onSelected】 : 選択時のコールバック 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocompleteのジェネリック", + "desc": [ + "【optionsViewBuilder】 : パネル構築器 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 入力構築器 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : テキスト表示 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json new file mode 100644 index 00000000..b86cad62 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "자동 완성", + "info": "입력 중에, 사용자가 선택할 수 있도록 연관어를 보여주는 레이어를 제공하며, 높은 수준의 커스터마이징이 가능합니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocomplete 기본 사용", + "desc": [ + "【optionsBuilder】 : 옵션 빌더 【AutocompleteOptionsBuilder】", + "【onSelected】 : 선택 시 콜백 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocomplete의 제네릭", + "desc": [ + "【optionsViewBuilder】 : 패널 빌더 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 입력 빌더 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : 텍스트 표시 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json new file mode 100644 index 00000000..cf85c697 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Preenchimento automático", + "info": "Durante a entrada, fornece uma sobreposição de sugestões para o usuário escolher, com alto grau de personalização.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Autocomplete", + "desc": [ + "【optionsBuilder】: Construtor de opções 【AutocompleteOptionsBuilder】", + "【onSelected】: Callback de seleção 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Genéricos do Autocomplete", + "desc": [ + "【optionsViewBuilder】: Construtor de painel 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Construtor de entrada 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Exibição de texto 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json new file mode 100644 index 00000000..7d6e3425 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Автозаполнение", + "info": "Во время ввода предоставляет всплывающий слой с подсказками для выбора пользователем, обладает высокой степенью настройки.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Autocomplete", + "desc": [ + "【optionsBuilder】 : конструктор опций 【AutocompleteOptionsBuilder】", + "【onSelected】 : обратный вызов при выборе 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Обобщение Autocomplete", + "desc": [ + "【optionsViewBuilder】 : конструктор панели 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : конструктор ввода 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : отображение текста 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json new file mode 100644 index 00000000..3f7fe013 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "自动填充", + "info": "在输入期间,提供联想词浮层展示,以便用户选择,拥有高度的可定制性。", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocomplete基本使用", + "desc": [ + "【optionsBuilder】 : 选项构造器 【AutocompleteOptionsBuilder】", + "【onSelected】 : 选择时回调 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocomplete的泛型", + "desc": [ + "【optionsViewBuilder】 : 面板构造器 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 输入构造器 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : 文字展示 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart new file mode 100644 index 00000000..b9abae50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart @@ -0,0 +1,40 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2022-04-18 +/// contact me by email 1981462002@qq.com + +class AutocompleteDemo extends StatelessWidget { + const AutocompleteDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Autocomplete( + optionsBuilder: buildOptions, + onSelected: onSelected, + ); + } + + void onSelected(String selection) { + debugPrint('当前选择了 $selection'); + } + + Future> buildOptions( + TextEditingValue textEditingValue, + ) async { + if (textEditingValue.text == '') { + return const Iterable.empty(); + } + return searchByArgs(textEditingValue.text); + } + + Future> searchByArgs(String args) async{ + // 模拟网络请求 + await Future.delayed(const Duration(milliseconds: 200)); + const List data = [ + 'toly', 'toly49', 'toly42', 'toly56', + 'card', 'ls', 'alex', 'fan sha', + ]; + return data.where((String name) => name.contains(args)); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart new file mode 100644 index 00000000..d48fe1bd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart @@ -0,0 +1,219 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2022-04-18 +/// contact me by email 1981462002@qq.com + +class AutocompleteType extends StatefulWidget { + const AutocompleteType({Key? key}) : super(key: key); + + @override + State createState() => _AutocompleteTypeState(); +} + +class _AutocompleteTypeState extends State { + late TextEditingController _controller; + _User? user; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: buildAutocomplete(), + ), + body: Center( + child: Text( + user != null ? user!.name : '未选择', + style: const TextStyle(fontSize: 40), + )), + ), + ); + } + + Widget buildAutocomplete() { + return Autocomplete<_User>( + optionsBuilder: buildOptions, + onSelected: onSelected, + optionsViewBuilder: _buildOptionsView, + fieldViewBuilder: _buildFieldView, + displayStringForOption: (user) => user.name, + ); + } + + @override + void dispose() { + // _controller.dispose(); + super.dispose(); + } + + void onSelected(_User selection) { + debugPrint('当前选择了 $selection'); + setState(() { + user = selection; + }); + } + + Future> buildOptions( + TextEditingValue textEditingValue, + ) async { + if (textEditingValue.text == '') { + return const Iterable<_User>.empty(); + } + return searchByArgs(textEditingValue.text); + } + + Future> searchByArgs(String args) async { + // 模拟网络请求 + await Future.delayed(const Duration(milliseconds: 200)); + const List<_User> data = [ + _User('toly', true, 'icon_5.webp'), + _User('toly49', false, 'icon_6.webp'), + _User('toly42', true, 'icon_7.webp'), + _User('toly56', false, 'icon_8.webp'), + _User('card', true, 'icon_5.webp'), + _User('ls', true, 'icon_6.webp'), + _User('alex', true, 'icon_7.webp'), + _User('fan sha', false, 'icon_8.webp'), + ]; + return data.where((_User user) => user.name.contains(args)); + } + + Widget _buildFieldView( + BuildContext context, + TextEditingController textEditingController, + FocusNode focusNode, + VoidCallback onFieldSubmitted) { + _controller = textEditingController; + return SizedBox( + height: 34, + child: TextFormField( + controller: textEditingController, + decoration: const InputDecoration( + filled: true, + fillColor: Color(0xffF7F8FA), + prefixIcon: Icon(Icons.search), + contentPadding: EdgeInsets.only(top: 1), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(19)), + ), + hintText: "输入用户名 (toly)", + hintStyle: TextStyle(fontSize: 13)), + focusNode: focusNode, + onFieldSubmitted: (String value) { + onFieldSubmitted(); + }, + ), + ); + } + + Widget _buildOptionsView(BuildContext context, + AutocompleteOnSelected<_User> onSelected, Iterable<_User> options) { + return Align( + alignment: Alignment.topCenter, + child: Padding( + padding: const EdgeInsets.only(top: 20), + child: Material( + child: ConstrainedBox( + constraints: BoxConstraints(maxHeight: 150), + child: ListView.builder( + padding: EdgeInsets.zero, + itemBuilder: (_, index) { + final _User option = options.elementAt(index); + return _UserItem( + onSelected: onSelected, + user: option, + args: _controller.text, + ); + }, + itemCount: options.length, + ), + ), + ), + ), + ); + } +} + +class _UserItem extends StatelessWidget { + final AutocompleteOnSelected<_User>? onSelected; + final String args; + final _User user; + + const _UserItem({ + Key? key, + this.onSelected, + required this.user, + required this.args, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => onSelected?.call(user), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 6), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${user.image}'), + ), + const SizedBox(width: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text.rich(formSpan(user.name, args)), + Text( + '性别: ${user.man ? '男' : '女'}', + style: const TextStyle(color: Colors.grey), + ), + ], + ), + ], + ), + ), + ); + } + + final TextStyle lightTextStyle = const TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ); + + InlineSpan formSpan(String src, String pattern) { + List span = []; + List parts = src.split(pattern); + if (parts.length > 1) { + for (int i = 0; i < parts.length; i++) { + span.add(TextSpan(text: parts[i])); + if (i != parts.length - 1) { + span.add(TextSpan(text: pattern, style: lightTextStyle)); + } + } + } else { + span.add(TextSpan(text: src)); + } + return TextSpan(children: span); + } +} + +class _User { + final String name; + final bool man; + final String image; + + const _User(this.name, this.man, this.image); + + @override + String toString() { + return '_User{name: $name, man: $man, image: $image}'; + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json new file mode 100644 index 00000000..2110748f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Zurück-Button", + "info": "Ein IconButton mit Rückkehrfunktion, das Rückkehrsymbol kann nicht geändert werden. Verhält sich in iOS und Android unterschiedlich.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton Attribute", + "desc": [ + "【color】: Farbe 【Color】", + "【style】: Button-Stil 【ButtonStyle?】", + "【onPressed】: Klick-Ereignis 【Function】", + " Wenn onPressed leer ist, wird der aktuelle Stack verlassen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json new file mode 100644 index 00000000..5827f1c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Back Button", + "info": "An IconButton with a back function, the back icon cannot be changed. It behaves differently in iOS and Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton Properties", + "desc": [ + "【color】: Color 【Color】", + "【style】: Button Style 【ButtonStyle?】", + "【onPressed】: Click Event 【Function】", + " If onPressed is empty, it will exit the current stack." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json new file mode 100644 index 00000000..d776911e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Botón de retroceso", + "info": "Un IconButton con función de retroceso, el icono de retroceso no se puede cambiar. Se comporta de manera diferente en iOS y Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades de BackButton", + "desc": [ + "【color】: Color 【Color】", + "【style】: Estilo del botón 【ButtonStyle?】", + "【onPressed】: Evento de clic 【Function】", + "Si onPressed está vacío, saldrá de la pila actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json new file mode 100644 index 00000000..67ab49af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Bouton Retour", + "info": "Un IconButton avec une fonction de retour, l'icône de retour ne peut pas être modifiée. Se comporte différemment sur iOS et Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés du BackButton", + "desc": [ + "【color】: Couleur 【Color】", + "【style】: Style du bouton 【ButtonStyle?】", + "【onPressed】: Événement de clic 【Function】", + " Si onPressed est vide, la pile actuelle sera quittée" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json new file mode 100644 index 00000000..15d82d52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Pulsante Indietro", + "info": "Un IconButton con funzionalità di ritorno, l'icona di ritorno non può essere modificata. Si comporta diversamente in iOS e Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà del BackButton", + "desc": [ + "【color】: Colore 【Color】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "【onPressed】: Evento di clic 【Function】", + " Se onPressed è vuoto, uscirà dallo stack corrente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json new file mode 100644 index 00000000..12bbc9f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "戻るボタン", + "info": "戻る機能を持つIconButtonで、戻るアイコンは変更できません。iOSとAndroidでは異なる動作をします。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton属性", + "desc": [ + "【color】: 色 【Color】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "【onPressed】: クリックイベント 【Function】", + " onPressedが空の場合、現在のスタックを終了します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json new file mode 100644 index 00000000..52da8131 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "뒤로 가기 버튼", + "info": "뒤로 가기 기능을 가진 IconButton, 뒤로 가기 아이콘은 변경할 수 없습니다. iOS와 Android에서 다르게 동작합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton 속성", + "desc": [ + "【color】: 색상 【Color】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "【onPressed】: 클릭 이벤트 【Function】", + "onPressed가 비어 있으면 현재 스택에서 빠져나옵니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json new file mode 100644 index 00000000..17115929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Botão de Voltar", + "info": "Um IconButton com função de voltar, o ícone de voltar não pode ser alterado. Comporta-se de forma diferente no iOS e no Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades do BackButton", + "desc": [ + "【color】: Cor 【Color】", + "【style】: Estilo do botão 【ButtonStyle?】", + "【onPressed】: Evento de clique 【Function】", + "Se onPressed estiver vazio, a pilha atual será encerrada" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json new file mode 100644 index 00000000..310f813d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Кнопка возврата", + "info": "IconButton с функцией возврата, значок возврата нельзя изменить. По-разному ведет себя в iOS и Android", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Свойства BackButton", + "desc": [ + "【color】: Цвет 【Color】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "【onPressed】: Событие нажатия 【Function】", + "Если onPressed пуст, текущий стек будет завершен" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json new file mode 100644 index 00000000..4806e8bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "返回按钮", + "info": "一个具有返回功能的IconButton,返回图标不可更改。在iOS和Android中表现不同", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton属性", + "desc": [ + "【color】: 颜色 【Color】", + "【style】: 按钮样式 【ButtonStyle?】", + "【onPressed】: 点击事件 【Function】", + " onPressed为空会退出当前栈" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart new file mode 100644 index 00000000..e51f70a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class CustomBackButton extends StatelessWidget { + const CustomBackButton({super.key}); + + List get data => [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: data + .map((e) => BackButton( + color: e, + )) + .toList()); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..cfce90a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Zurück-Button-Icon", + "info": "Ein Rück-Icon, das je nach Plattform das entsprechende Icon anzeigt. Das Thema kann über ActionIconTheme angepasst werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon-Effekt", + "desc": [ + "Das _ActionIcon-Widget passt das Rück-Button-Icon basierend auf dem ActionIconTheme an die jeweilige Plattform an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json new file mode 100644 index 00000000..013efdd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Back Button Icon", + "info": "A return Icon icon, displaying the corresponding icon according to the platform, and the theme can be customized through ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the back button icon for different platforms according to the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..b4dcc7b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icono de botón de retroceso", + "info": "Un icono de retroceso, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de BackButtonIcon", + "desc": [ + "El componente _ActionIcon adapta el icono del botón de retroceso para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..2448d289 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icône de bouton de retour", + "info": "Une icône de retour, affichant l'icône correspondante selon la plateforme, qui peut être personnalisée via ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de BackButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône de bouton de retour à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..9754d610 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icona del pulsante Indietro", + "info": "Un'icona di ritorno, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto BackButtonIcon", + "desc": [ + "Attraverso il componente _ActionIcon, adatta l'icona del pulsante Indietro per diverse piattaforme in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..71e0b52a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "戻るボタンアイコン", + "info": "戻るアイコンで、プラットフォームに応じたアイコンを表示し、ActionIconThemeでテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 効果", + "desc": [ + "_ActionIconコンポーネントを使用して、ActionIconThemeテーマに基づいて、異なるプラットフォームの戻るボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..64ea426a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "뒤로 가기 버튼 아이콘", + "info": "플랫폼에 따라 해당 아이콘을 표시하는 뒤로 가기 Icon 아이콘입니다. ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 효과", + "desc": [ + "ActionIconTheme 테마에 따라 _ActionIcon 컴포넌트를 사용하여 다른 플랫폼의 뒤로 가기 버튼 아이콘을 적응시킵니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..598f57cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Ícone do botão de voltar", + "info": "Um ícone de retorno, que exibe o ícone correspondente de acordo com a plataforma, pode ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do BackButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão de voltar para diferentes plataformas com base no tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..2d572f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Иконка кнопки возврата", + "info": "Иконка возврата, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект BackButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки возврата для разных платформ в соответствии с темой ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..1a3a4273 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "返回按钮图标", + "info": "一个返回 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的返回按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart new file mode 100644 index 00000000..1f39e563 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + +class BackButtonIconDemo extends StatelessWidget { + const BackButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const BackButtonIcon(); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json new file mode 100644 index 00000000..a3f26622 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Kennzeichnungskomponente", + "info": "Badge ist eine Komponente im Material-Stil, die eine Markierung über einem Kindelement hinzufügen kann. Beim Aufbau wird die Stack-Komponente für die Überlagerung verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Verwendung von Badge-Punktmarkierungen", + "desc": [ + "【backgroundColor】 : Hintergrundfarbe 【Color?】", + "【isLabelVisible】 : Sichtbarkeit der Markierung 【bool】", + "【smallSize】 : Durchmesser ohne Label 【double?】", + "【child】 : Kindelement 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge-Label-Markierung", + "desc": [ + "【label】 : Titelkomponente 【Widget?】", + "【textStyle】 : Titeltextstil 【TextStyle?】", + "【textColor】 : Titeltextfarbe 【Color?】", + "【padding】 : Titelabstand 【EdgeInsetsGeometry?】", + "【largeSize】 : Höhe mit Label 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Versatz von Badge", + "desc": [ + "【offset】 : Versatz der Markierung 【Offset?】", + "【alignment】 : Titelversatz 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json new file mode 100644 index 00000000..662c3bc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Badge Component", + "info": "Badge is a Material-style component that can add markers on top of the child. It relies on the Stack component for layering during construction.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Usage of Badge Dot Marker", + "desc": [ + "【backgroundColor】: Background color 【Color?】", + "【isLabelVisible】: Whether to display the marker 【bool】", + "【smallSize】: Diameter when there is no label 【double?】", + "【child】: Child component 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge Label Marker", + "desc": [ + "【label】: Title component 【Widget?】", + "【textStyle】: Title color 【TextStyle?】", + "【textColor】: Title style 【Color?】", + "【padding】: Title margin 【EdgeInsetsGeometry?】", + "【largeSize】: Height when there is a label 【double?】" + ] + }, + { + "file": "node_3.dart", + "name": "Badge Offset", + "desc": [ + "【offset】: Marker offset 【Offset?】", + "【alignment】: Title offset 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json new file mode 100644 index 00000000..54ab567e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente de marcador", + "info": "Badge es un componente de estilo Material que puede agregar un marcador sobre el child, dependiendo del componente Stack para la superposición durante la construcción.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso del marcador de punto Badge", + "desc": [ + "【backgroundColor】 : Color de fondo 【Color?】", + "【isLabelVisible】 : Si se muestra el marcador 【bool】", + "【smallSize】 : Diámetro sin etiqueta 【double?】", + "【child】 : Componente hijo 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Marcador de etiqueta Badge", + "desc": [ + "【label】 : Componente de título 【Widget?】", + "【textStyle】 : Color del título 【TextStyle?】", + "【textColor】 : Estilo del título 【Color?】", + "【padding】 : Márgenes del título 【EdgeInsetsGeometry?】", + "【largeSize】 : Altura con etiqueta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Desplazamiento del Badge", + "desc": [ + "【offset】 : Desplazamiento del marcador 【Offset?】", + "【alignment】 : Desplazamiento del título 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json new file mode 100644 index 00000000..081f1981 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Composant de marquage", + "info": "Badge est un composant de style Material qui peut ajouter des marqueurs au-dessus d'un enfant, dépendant du composant Stack pour l'empilement lors de la construction.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Utilisation du badge en point", + "desc": [ + "【backgroundColor】 : Couleur de fond 【Color?】", + "【isLabelVisible】 : Afficher le marqueur 【bool】", + "【smallSize】 : Diamètre sans étiquette 【double?】", + "【child】 : Composant enfant 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge avec étiquette", + "desc": [ + "【label】 : Composant de titre 【Widget?】", + "【textStyle】 : Couleur du titre 【TextStyle?】", + "【textColor】 : Style du titre 【Color?】", + "【padding】 : Marge du titre 【EdgeInsetsGeometry?】", + "【largeSize】 : Hauteur avec étiquette 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Décalage du badge", + "desc": [ + "【offset】 : Décalage du marqueur 【Offset?】", + "【alignment】 : Décalage du titre 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json new file mode 100644 index 00000000..ad52a654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente Badge", + "info": "Badge è un componente in stile Material che aggiunge un segnalino sopra il child, dipendendo dal componente Stack per la sovrapposizione durante la costruzione.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso del Badge con punto", + "desc": [ + "【backgroundColor】 : Colore di sfondo 【Color?】", + "【isLabelVisible】 : Visibilità del segnalino 【bool】", + "【smallSize】 : Diametro senza etichetta 【double?】", + "【child】 : Componente figlio 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge con etichetta", + "desc": [ + "【label】 : Componente del titolo 【Widget?】", + "【textStyle】 : Colore del titolo 【TextStyle?】", + "【textColor】 : Stile del titolo 【Color?】", + "【padding】 : Margine del titolo 【EdgeInsetsGeometry?】", + "【largeSize】 : Altezza con etichetta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Offset del Badge", + "desc": [ + "【offset】 : Offset del segnalino 【Offset?】", + "【alignment】 : Offset del titolo 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json new file mode 100644 index 00000000..5a80853c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "バッジコンポーネント", + "info": "Badge は Material スタイルのコンポーネントで、child の上にマーカーを追加できます。構築時には Stack コンポーネントに依存して重ねられます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge ドットマーカーの使用", + "desc": [ + "【backgroundColor】 : 背景色 【Color?】", + "【isLabelVisible】 : マーカーを表示するかどうか 【bool】", + "【smallSize】 : ラベルがない場合の直径 【double?】", + "【child】 : 子コンポーネント 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge ラベルマーカー", + "desc": [ + "【label】 : タイトルコンポーネント 【Widget?】", + "【textStyle】 : タイトルの色 【TextStyle?】", + "【textColor】 : タイトルのスタイル 【Color?】", + "【padding】 : タイトルの余白 【EdgeInsetsGeometry?】", + "【largeSize】 : ラベルがある場合の高さ 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge のオフセット", + "desc": [ + "【offset】 : マーカーのオフセット 【Offset?】", + "【alignment】 : タイトルのオフセット 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json new file mode 100644 index 00000000..56527a31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "배지 컴포넌트", + "info": "Badge는 Material 스타일의 컴포넌트로, child 위에 배지를 추가할 수 있으며, Stack 컴포넌트를 사용하여 겹쳐서 구성됩니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge 점 표시 사용", + "desc": [ + "【backgroundColor】 : 배경색 【Color?】", + "【isLabelVisible】 : 표시 여부 【bool】", + "【smallSize】 : 라벨 없을 때 직경 【double?】", + "【child】 : 하위 컴포넌트 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge 라벨 표시", + "desc": [ + "【label】 : 제목 컴포넌트 【Widget?】", + "【textStyle】 : 제목 색상 【TextStyle?】", + "【textColor】 : 제목 스타일 【Color?】", + "【padding】 : 제목 여백 【EdgeInsetsGeometry?】", + "【largeSize】 : 라벨 있을 때 높이 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge의 오프셋", + "desc": [ + "【offset】 : 배지 오프셋 【Offset?】", + "【alignment】 : 제목 오프셋 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json new file mode 100644 index 00000000..e53be402 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente de Marcação", + "info": "O Badge é um componente de estilo Material que pode adicionar uma marcação sobreposta a um filho, dependendo do componente Stack para sobreposição durante a construção.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso do Badge com Marcação de Ponto", + "desc": [ + "【backgroundColor】 : Cor de fundo 【Color?】", + "【isLabelVisible】 : Se a marcação é visível 【bool】", + "【smallSize】 : Diâmetro sem etiqueta 【double?】", + "【child】 : Componente filho 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge com Marcação de Etiqueta", + "desc": [ + "【label】 : Componente de título 【Widget?】", + "【textStyle】 : Cor do título 【TextStyle?】", + "【textColor】 : Estilo do título 【Color?】", + "【padding】 : Margem do título 【EdgeInsetsGeometry?】", + "【largeSize】 : Altura com etiqueta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Deslocamento do Badge", + "desc": [ + "【offset】 : Deslocamento da marcação 【Offset?】", + "【alignment】 : Deslocamento do título 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json new file mode 100644 index 00000000..8e577d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Компонент метки", + "info": "Badge — это компонент в стиле Material, который может добавлять маркеры поверх дочернего элемента, при построении он зависит от компонента Stack для наложения.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Использование круглой метки Badge", + "desc": [ + "【backgroundColor】 : Цвет фона 【Color?】", + "【isLabelVisible】 : Видимость метки 【bool】", + "【smallSize】 : Диаметр без метки 【double?】", + "【child】 : Дочерний компонент 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Метка Badge с текстом", + "desc": [ + "【label】 : Компонент заголовка 【Widget?】", + "【textStyle】 : Цвет заголовка 【TextStyle?】", + "【textColor】 : Стиль заголовка 【Color?】", + "【padding】 : Отступы заголовка 【EdgeInsetsGeometry?】", + "【largeSize】 : Высота с меткой 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Смещение Badge", + "desc": [ + "【offset】 : Смещение метки 【Offset?】", + "【alignment】 : Смещение заголовка 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json new file mode 100644 index 00000000..c14d74fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "标记组件", + "info": "Badge 是一种 Material 风格的组件,可以在 child 上层添加标记物,构建时依赖 Stack 组件进行叠放。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge 圆点标记的使用", + "desc": [ + "【backgroundColor】 : 背景色 【Color?】", + "【isLabelVisible】 : 是否显示标记 【bool】", + "【smallSize】 : 无标签时直径 【double?】", + "【child】 : 子组件 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge 标签标记", + "desc": [ + "【label】 : 标题组件 【Widget?】", + "【textStyle】 : 标题颜色 【TextStyle?】", + "【textColor】 : 标题样式 【Color?】", + "【padding】 : 标题边距 【EdgeInsetsGeometry?】", + "【largeSize】 : 有标签时高度 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge 的偏移量", + "desc": [ + "【offset】 : 标记偏移量 【Offset?】", + "【alignment】 : 标题偏移 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart new file mode 100644 index 00000000..f5173c38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/01/27 +/// contact me by email 1981462002@qq.com + + +class BadgeDemo extends StatelessWidget { + const BadgeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Wrap( + spacing: 20, + children: [ + Badge( + backgroundColor: Colors.redAccent, + smallSize: 10, + child: Icon(Icons.update,size: 36,color: Colors.green,), + ), + Badge( + backgroundColor: Colors.redAccent, + smallSize: 10, + isLabelVisible: false, + child: Icon(Icons.update,size: 36,color: Colors.green,), + ), + ], + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart new file mode 100644 index 00000000..73cf887d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/01/27 +/// contact me by email 1981462002@qq.com + + +class BadgeLabelDemo extends StatelessWidget { + const BadgeLabelDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Badge( + backgroundColor: Colors.red, + label: Text('99'), + textStyle: TextStyle(fontSize: 8,color: Colors.red), + padding: EdgeInsets.symmetric(horizontal: 8,vertical: 2), + largeSize: 14, + child: Icon(Icons.message,size: 36,color: Colors.indigo,), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart new file mode 100644 index 00000000..e815b239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/01/27 +/// contact me by email 1981462002@qq.com + + +class BadgeAlignOffsetDemo extends StatelessWidget { + const BadgeAlignOffsetDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final List info = ['默认偏移和对齐', '偏移-4,-4', '偏移-2,-2;右下角']; + final List offsets = [ + null, + const Offset(-4, -4), + const Offset(-2, -2) + ]; + final List alignments = [null, null, Alignment.bottomRight]; + + return Wrap( + spacing: 40, + children: info + .asMap() + .keys + .map((int i) => _buildShowItem(info[i], offsets[i], alignments[i])) + .toList(), + ); + } + + Widget _buildShowItem(String info, Offset? offset, Alignment? alignment) { + return Wrap( + spacing: 8, + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Badge( + backgroundColor: Colors.red, + label: const Text('99'), + textStyle: const TextStyle(fontSize: 8, color: Colors.red), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + largeSize: 14, + offset: offset, + alignment: alignment, + child: const Icon(Icons.message, size: 36, color: Colors.indigo), + ), + Text( + info, + style: const TextStyle(fontSize: 10, color: Colors.grey), + ) + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json new file mode 100644 index 00000000..dac9cc9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Banner-Komponente", + "info": "Komponente zur Anzeige von Bannern. Kann eine Unterkomponente aufnehmen, ermöglicht die Auswahl der Position für das Banner und den Text sowie die Einstellung der Farbe.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Zur Anzeige eines Banners", + "desc": [ + "【message】 : Angezeigte Textnachricht 【String】", + "【location】 : Position*4 【BannerLocation】", + "【color】: Bannerfarbe 【Color】", + "【child】: Kind 【Widget】", + "【textStyle】: Textstil 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json new file mode 100644 index 00000000..a5111306 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Badge Component", + "info": "A component for displaying badges. It can accommodate one child component, allows for the selection of orientation to add badges and informational text, and can set colors.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a badge", + "desc": [ + "【message】: The text message to display 【String】", + "【location】: Position*4 【BannerLocation】", + "【color】: Badge color 【Color】", + "【child】: Child 【Widget】", + "【textStyle】: Text style 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json new file mode 100644 index 00000000..237d2e60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente de insignia", + "info": "Componente para mostrar insignias. Puede contener un subcomponente, permite elegir la ubicación para agregar la insignia y el texto informativo, y permite configurar el color.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Para mostrar una insignia", + "desc": [ + "【message】 : Información de texto a mostrar 【String】", + "【location】 : Ubicación*4 【BannerLocation】", + "【color】: Color de la insignia 【Color】", + "【child】: Hijo 【Widget】", + "【textStyle】: Estilo del texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json new file mode 100644 index 00000000..90aa4a5c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Composant de badge", + "info": "Composant pour l'affichage de badges. Peut contenir un composant enfant, permet de choisir l'emplacement pour ajouter un badge et du texte d'information, et de définir la couleur.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher un badge", + "desc": [ + "【message】 : Informations textuelles affichées 【String】", + "【location】 : Position*4 【BannerLocation】", + "【color】: Couleur du badge 【Color】", + "【child】: Enfant 【Widget】", + "【textStyle】: Style de texte 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json new file mode 100644 index 00000000..c3155408 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente Banner", + "info": "Componente per la visualizzazione di banner. Può contenere un componente figlio, permette di scegliere la posizione del banner e il testo informativo, e di impostare il colore.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un banner", + "desc": [ + "【message】 : Informazioni di testo visualizzate 【String】", + "【location】 : Posizione*4 【BannerLocation】", + "【color】: Colore del banner 【Color】", + "【child】: Figlio 【Widget】", + "【textStyle】: Stile del testo 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json new file mode 100644 index 00000000..c36e9bd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "バナーコンポーネント", + "info": "バナー表示用のコンポーネントです。1つの子コンポーネントを収容でき、バナーと情報テキストを追加する位置を選択し、色を設定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "バナーを表示するために使用されます", + "desc": [ + "【message】 : 表示するテキスト情報 【String】", + "【location】 : 位置*4 【BannerLocation】", + "【color】: バナー色 【Color】", + "【child】: 子 【Widget】", + "【textStyle】: テキストスタイル 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json new file mode 100644 index 00000000..e264df6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "배너 컴포넌트", + "info": "배너 표시를 위한 컴포넌트입니다. 하나의 자식 컴포넌트를 포함할 수 있으며, 배너 및 정보 텍스트를 추가할 위치를 선택할 수 있고, 색상을 설정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "배너를 표시하는 데 사용", + "desc": [ + "【message】 : 표시할 텍스트 정보 【String】", + "【location】 : 위치*4 【BannerLocation】", + "【color】: 배너 색상 【Color】", + "【child】: 자식 【Widget】", + "【textStyle】: 텍스트 스타일 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json new file mode 100644 index 00000000..ed640258 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente de Banner", + "info": "Componente para exibição de banner. Pode conter um componente filho, permite escolher a posição para adicionar o banner e o texto informativo, e permite definir a cor.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um banner", + "desc": [ + "【message】 : Informação de texto exibida 【String】", + "【location】 : Posição*4 【BannerLocation】", + "【color】: Cor do banner 【Color】", + "【child】: Filho 【Widget】", + "【textStyle】: Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json new file mode 100644 index 00000000..cbdc7915 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Компонент для отображения уголка", + "info": "Компонент для отображения уголка. Может содержать один дочерний компонент, позволяет выбрать место для добавления уголка и текстовой информации, можно настроить цвет.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Для отображения уголка", + "desc": [ + "【message】 : Отображаемое текстовое сообщение 【String】", + "【location】 : Позиция*4 【BannerLocation】", + "【color】: Цвет уголка 【Color】", + "【child】: Дочерний элемент 【Widget】", + "【textStyle】: Стиль текста 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json new file mode 100644 index 00000000..7b2765d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "角标组件", + "info": "用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个角标", + "desc": [ + "【message】 : 显示的文字信息 【String】", + "【location】 : 位置*4 【BannerLocation】", + "【color】: 角标颜色 【Color】", + "【child】: 孩子 【Widget】", + "【textStyle】: 文字样式 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart new file mode 100644 index 00000000..884b6103 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com + + +class CustomBanner extends StatelessWidget { + const CustomBanner({super.key}); + + Map get data => { + BannerLocation.topStart: Colors.red, + BannerLocation.bottomStart: Colors.green, + BannerLocation.bottomEnd: Colors.orange, + BannerLocation.topEnd: Colors.blue, + + }; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + runSpacing: 10, + children: data.keys + .map((BannerLocation location) => Container( + color: const Color(0xffD8F5FF), + width: 150, + height: 150 * 0.618, + child: Banner( + message: "Flutter 3.29.0 发布", + location: location, + textStyle: TextStyle(fontSize: 8,height: 1), + color: data[location]!, + child: const Padding( + padding: EdgeInsets.all(20), + child: FlutterLogo( + textColor: Colors.blue, + style: FlutterLogoStyle.horizontal, + )), + ), + )).toList()); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json new file mode 100644 index 00000000..24a1898b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Unterer Schublade", + "info": "Als Komponente ist es eine einfache Strukturkomponente, die Form, Schattentiefe, Hintergrundfarbe und interne Komponentenkonstruktoren angeben kann. Es wird normalerweise durch die showBottomSheet-Methode von ScaffoldState von unten eingeblendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomSheet", + "desc": [ + "【builder】 : Komponentenkonstruktor 【WidgetBuilder】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【onClosing】 : Schließrückruf 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json new file mode 100644 index 00000000..6c7e7bb9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Bottom Drawer", + "info": "As a component, it is a simple structural component that can specify shape, shadow depth, background color, and internal component constructors. It generally pops up from the bottom through the showBottomSheet method of ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomSheet", + "desc": [ + "【builder】: Component constructor 【WidgetBuilder】", + "【backgroundColor】: Background color 【Color】", + "【elevation】: Shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】", + "【onClosing】: Closing callback 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json new file mode 100644 index 00000000..d919c811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Cajón Inferior", + "info": "Como componente, es una estructura simple que puede especificar forma, profundidad de sombra, color de fondo y constructor de componentes internos. Generalmente se despliega desde la parte inferior mediante el método showBottomSheet de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de BottomSheet", + "desc": [ + "【builder】 : Constructor de componentes 【WidgetBuilder】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onClosing】 : Callback de cierre 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json new file mode 100644 index 00000000..05e874ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Tiroir inférieur", + "info": "En tant que composant, il s'agit d'un composant structurel simple qui peut spécifier la forme, la profondeur de l'ombre, la couleur de fond, le constructeur de composants internes, etc. Il est généralement affiché à partir du bas via la méthode showBottomSheet de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomSheet", + "desc": [ + "【builder】 : Constructeur de composant 【WidgetBuilder】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【onClosing】 : Rappel de fermeture 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json new file mode 100644 index 00000000..9bf4f91d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Cassetto inferiore", + "info": "Come componente, è una struttura semplice che può specificare forma, profondità dell'ombra, colore di sfondo, costruttore di componenti interni. Di solito viene visualizzato dal basso tramite il metodo showBottomSheet di ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BottomSheet", + "desc": [ + "【builder】 : Costruttore del componente 【WidgetBuilder】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onClosing】 : Callback di chiusura 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json new file mode 100644 index 00000000..1bf8340a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "ボトムシート", + "info": "コンポーネントとして、シンプルな構造コンポーネントであり、形状、影の深さ、背景色、内部コンポーネントのビルダーなどを指定できます。一般的にはScaffoldStateのshowBottomSheetメソッドを使用して下部からポップアップします。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheetの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【WidgetBuilder】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onClosing】 : 閉じるコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json new file mode 100644 index 00000000..d6ea73ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "하단 서랍", + "info": "컴포넌트로서는 간단한 구조 컴포넌트이며, 모양, 그림자 깊이, 배경색, 내부 컴포넌트 빌더 등을 지정할 수 있습니다. 일반적으로 ScaffoldState의 showBottomSheet 메소드를 통해 하단에서 팝업됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheet 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【WidgetBuilder】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【onClosing】 : 닫기 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json new file mode 100644 index 00000000..252fc7b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Gaveta Inferior", + "info": "Como componente, é uma estrutura simples que pode especificar forma, profundidade de sombra, cor de fundo, construtor de componentes internos, etc. Geralmente é exibido a partir da parte inferior através do método showBottomSheet do ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomSheet", + "desc": [ + "【builder】: Construtor de Componentes 【WidgetBuilder】", + "【backgroundColor】: Cor de Fundo 【Color】", + "【elevation】: Profundidade de Sombra 【double】", + "【shape】: Forma 【ShapeBorder】", + "【onClosing】: Callback de Fechamento 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json new file mode 100644 index 00000000..777a625a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Нижний ящик", + "info": "Как компонент, это простая структурная компонента, которая может быть настроена по форме, глубине тени, цвету фона и конструктору внутренних компонентов. Обычно появляется снизу с помощью метода showBottomSheet ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomSheet", + "desc": [ + "【builder】 : Конструктор компонентов 【WidgetBuilder】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【onClosing】 : Обратный вызов при закрытии 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json new file mode 100644 index 00000000..afe4e499 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "底部抽屉", + "info": "作为组件来说是一个简单的结构组件,可指定形状、影深、背景色、内部组件构造器等。一般通过ScaffoldState的showBottomSheet方法从底部弹出。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheet基本使用", + "desc": [ + "【builder】 : 组件构造器 【WidgetBuilder】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onClosing】 : 关闭回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart new file mode 100644 index 00000000..36364e8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart @@ -0,0 +1,53 @@ +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; + +class CustomBottomSheet extends StatefulWidget { + const CustomBottomSheet({Key? key}) : super(key: key); + + @override + _CustomBottomSheetState createState() => _CustomBottomSheetState(); +} + +class _CustomBottomSheetState extends State { + bool opened = false; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: () { + opened = !opened; + opened + ? Scaffold.of(context).showBottomSheet((_) => _buildBottomSheet()) + : Navigator.of(context).pop(); + }, + child: const Text( + '点我显隐BottomSheet', + style: TextStyle(color: Colors.white), + )); + } + + Widget _buildBottomSheet() => BottomSheet( + enableDrag: true, + elevation: 4, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topRight: Radius.circular(60), + topLeft: Radius.circular(60), + )), + backgroundColor: Colors.transparent, + onClosing: () => print('onClosing'), + builder: (_) => (Container( + height: 250, + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/sabar_bar.webp'), + fit: BoxFit.cover), + borderRadius: BorderRadius.only( + topRight: Radius.circular(60), + topLeft: Radius.circular(60), + )), + ))); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json new file mode 100644 index 00000000..5d5b14ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "BoxScrollView", + "info": "BoxScrollView ist eine abstrakte Klasse, die von ScrollView erbt und daher nicht direkt verwendet werden kann. Seine Unterklassen sind ListView und GridView. Normalerweise wird keine eigene Unterklasse implementiert, um es zu verwenden.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView Einführung", + "desc": [ + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【cacheExtent】 : Cache-Länge 【double】", + "【dragStartBehavior】 : Ziehverhalten 【DragStartBehavior】", + "【clipBehavior】 : Beschneidungsverhalten 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json new file mode 100644 index 00000000..b1f43857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Box Scroll View", + "info": "BoxScrollView is an abstract class that inherits from ScrollView, so it cannot be used directly. Its subclasses include ListView and GridView. Generally, you do not implement subclasses to use it.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to BoxScrollView", + "desc": [ + "【reverse】 : Whether to reverse 【bool】", + "【scrollDirection】 : Scroll direction 【Axis】", + "【cacheExtent】 : Cache length 【double】", + "【dragStartBehavior】 : Drag start behavior 【DragStartBehavior】", + "【clipBehavior】 : Clip behavior 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json new file mode 100644 index 00000000..a121e0ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vista de desplazamiento de caja", + "info": "BoxScrollView es una clase abstracta que hereda de ScrollView, por lo que no se puede usar directamente. Sus subclases son ListView y GridView. Generalmente no se implementa una subclase para usarla", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a BoxScrollView", + "desc": [ + "【reverse】 : ¿Invertido? 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【cacheExtent】 : Longitud de caché 【double】", + "【dragStartBehavior】 : Comportamiento de arrastre 【DragStartBehavior】", + "【clipBehavior】 : Comportamiento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json new file mode 100644 index 00000000..3e555427 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vue de défilement de boîte", + "info": "BoxScrollView est une classe abstraite héritée de ScrollView, donc elle ne peut pas être utilisée directement. Ses sous-classes incluent ListView et GridView. Généralement, on ne l'utilise pas en implémentant une sous-classe soi-même.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à BoxScrollView", + "desc": [ + "【reverse】 : Inverser ou non 【bool】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【cacheExtent】 : Longueur du cache 【double】", + "【dragStartBehavior】 : Comportement de glissement 【DragStartBehavior】", + "【clipBehavior】 : Comportement de découpage 【ClipBehavior】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json new file mode 100644 index 00000000..72c02fbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vista a scorrimento a scatola", + "info": "BoxScrollView è una classe astratta che eredita da ScrollView, quindi non può essere utilizzata direttamente. Le sue sottoclassi includono ListView e GridView. Generalmente non si implementa una sottoclasse per utilizzarla", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a BoxScrollView", + "desc": [ + "【reverse】 : Se invertire 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【cacheExtent】 : Estensione della cache 【double】", + "【dragStartBehavior】 : Comportamento di trascinamento 【DragStartBehavior】", + "【clipBehavior】 : Comportamento di ritaglio 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json new file mode 100644 index 00000000..7c974d57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "ボックススクロールビュー", + "info": "BoxScrollView は ScrollView を継承した抽象クラスであるため、直接使用することはできません。そのサブクラスには ListView や GridView があります。通常、自分でサブクラスを実装して使用することはありません。", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 紹介", + "desc": [ + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【cacheExtent】 : キャッシュの長さ 【double】", + "【dragStartBehavior】 : ドラッグ開始の動作 【DragStartBehavior】", + "【clipBehavior】 : クリップ動作 【ClipBehavior】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json new file mode 100644 index 00000000..116839dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "박스 스크롤 뷰", + "info": "BoxScrollView는 ScrollView에서 상속된 추상 클래스이므로 직접 사용할 수 없습니다. 그 하위 클래스로는 ListView, GridView가 있습니다. 일반적으로 직접 하위 클래스를 구현하여 사용하지 않습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 소개", + "desc": [ + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【cacheExtent】 : 캐시 길이 【double】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【clipBehavior】 : 클리핑 동작 【ClipBehavior】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json new file mode 100644 index 00000000..7f91210a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Visualização de Rolagem de Caixa", + "info": "BoxScrollView é uma classe abstrata que herda de ScrollView, portanto, não pode ser usada diretamente. Suas subclasses incluem ListView e GridView. Geralmente, não se implementa subclasses para usá-la.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao BoxScrollView", + "desc": [ + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【cacheExtent】 : Extensão do cache 【double】", + "【dragStartBehavior】 : Comportamento de arrasto 【DragStartBehavior】", + "【clipBehavior】 : Comportamento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json new file mode 100644 index 00000000..e0fd153b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Прокручиваемое представление коробки", + "info": "BoxScrollView — это абстрактный класс, который наследуется от ScrollView, поэтому его нельзя использовать напрямую. Его подклассы включают ListView и GridView. Обычно не рекомендуется самостоятельно реализовывать подклассы для его использования.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в BoxScrollView", + "desc": [ + "【reverse】 : Обратный порядок 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【cacheExtent】 : Размер кэша 【double】", + "【dragStartBehavior】 : Поведение при перетаскивании 【DragStartBehavior】", + "【clipBehavior】 : Поведение обрезки 【ClipBehavior】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json new file mode 100644 index 00000000..398232fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "盒滑动视图", + "info": "BoxScrollView 是一个继承自 ScrollView 的抽象类,所以无法直接使用,它的子类有 ListView、GridView。一般不自己实现子类使用它", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 介绍", + "desc": [ + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【cacheExtent】 : 缓存长 【double】", + "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】", + "【clipBehavior】 : 裁剪行为 【ClipBehavior】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart new file mode 100644 index 00000000..af29d47a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class BoxScrollViewDemo extends StatelessWidget { + const BoxScrollViewDemo({Key? key}) : super(key: key); + + final String info = + 'BoxScrollView 是 ScrollView 的子类,实现了它的抽象方法,且暴露出另一个抽象方法 buildChildLayout,返回 Sliver 家族 Widget,' + '其子类有 ListView 和 GridView,分别使用 Sliver 家族相关List、Gird列表组件实现的。'; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: Column( + children: [ + Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ), + Expanded(child: MyBoxScrollView()), + ], + ), + ); + } +} + +class MyBoxScrollView extends BoxScrollView { + MyBoxScrollView({Key? key}) : super(key: key); + + final List data = [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + + @override + Widget buildChildLayout(BuildContext context)=> SliverFixedExtentList( + itemExtent: 60, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json new file mode 100644 index 00000000..19ad0ac4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Konstruktor", + "info": "Eine Komponente, die den Platzbedarf von Unterkomponenten nicht beeinflusst und keine Anzeigeeigenschaften hat. Ihr einziger Wert besteht darin, den Kontext für das entsprechende Element der aktuellen Komponente bereitzustellen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von Builder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【WidgetBuilder】", + "Die Verwendung der Methode `XXX.of(context)` in derselben Klasse, um ein Zustandsobjekt einer bestimmten Klasse zu erhalten, kann zu einem `Kontextverzögerungsfehler` führen. Verwenden Sie Builder, um dies zu beheben." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json new file mode 100644 index 00000000..71fff413 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructor", + "info": "A component that does not affect the space occupied by child components and has no display properties. Its sole value is to provide the context for the corresponding element of the current component.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usage of Builder", + "desc": [ + "【builder】: Component Constructor 【WidgetBuilder】", + "Using `XXX.of(context)` to obtain a state object of a certain class within the same class may result in a 'context lag' error, which can be resolved using Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json new file mode 100644 index 00000000..899c3ee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructor", + "info": "Un componente que no afecta el espacio ocupado por los componentes secundarios y no tiene visibilidad, cuyo único valor es proporcionar el contexto del elemento correspondiente al componente actual.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de Builder", + "desc": [ + "【builder】: Constructor de componentes 【WidgetBuilder】", + "El uso del método `XXX.of(context)` para obtener un objeto de estado de una clase en la misma clase puede resultar en un error de `contexto desfasado`, que se resuelve utilizando Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json new file mode 100644 index 00000000..8db8b920 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructeur", + "info": "Un composant qui n'affecte pas l'espace occupé par les composants enfants et n'a pas de visibilité, dont la seule valeur est de fournir le contexte de l'élément correspondant au composant actuel.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de Builder", + "desc": [ + "【builder】 : Constructeur de composant 【WidgetBuilder】", + "L'utilisation de la méthode `XXX.of(context)` pour obtenir un objet d'état dans la même classe peut entraîner une erreur de `contexte en retard`, résolue en utilisant Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json new file mode 100644 index 00000000..dd8f1a8b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Costruttore", + "info": "Un componente che non influisce sullo spazio occupato dai componenti figli e non ha una visualizzazione, il cui unico scopo è fornire il contesto per l'elemento corrispondente del componente corrente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso del Builder", + "desc": [ + "【builder】 : Costruttore del componente 【WidgetBuilder】", + "L'uso del metodo `XXX.of(context)` per ottenere un oggetto di stato di un certo tipo nella stessa classe può causare un errore di `contesto in ritardo`, che viene risolto utilizzando Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json new file mode 100644 index 00000000..5483ea42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "ビルダー", + "info": "子コンポーネントのスペースに影響を与えず、表示性を持たないコンポーネントで、唯一の価値は現在のコンポーネントに対応する要素のコンテキストを提供することです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builderの使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【WidgetBuilder】", + "同じクラス内で`XXX.of(context)`を使用して特定の状態オブジェクトを取得する方法には`コンテキストの遅延`というエラーが存在し、Builderを使用して解決します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json new file mode 100644 index 00000000..4a7d1878 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "빌더", + "info": "하위 컴포넌트의 공간을 차지하지 않고, 시각적으로 표시되지 않는 컴포넌트로, 현재 컴포넌트에 해당하는 요소의 컨텍스트를 제공하는 유일한 가치가 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builder 사용법", + "desc": [ + "【builder】 : 컴포넌트 빌더 【WidgetBuilder】", + "동일한 클래스에서 `XXX.of(context)`를 사용하여 특정 상태 객체를 가져오는 방법은 `컨텍스트 지연` 오류가 발생할 수 있으며, 이를 해결하기 위해 Builder를 사용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json new file mode 100644 index 00000000..90fa2ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Construtor", + "info": "Um componente que não afeta o espaço ocupado pelos componentes filhos e não tem visibilidade, cujo único valor é fornecer o contexto do elemento correspondente ao componente atual.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do Builder", + "desc": [ + "【builder】 : Construtor de componentes 【WidgetBuilder】", + "O uso do método `XXX.of(context)` para obter o objeto de estado de uma classe dentro da mesma classe pode resultar em um erro de `contexto atrasado`, que é resolvido usando o Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json new file mode 100644 index 00000000..e08118e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Конструктор", + "info": "Компонент, который не влияет на занимаемое пространство дочерних компонентов и не имеет визуального отображения. Его единственная цель - предоставить контекст для соответствующего элемента текущего компонента.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование Builder", + "desc": [ + "【builder】 : Конструктор компонента 【WidgetBuilder】", + "Использование метода `XXX.of(context)` для получения объекта состояния определенного класса в одном и том же классе может привести к ошибке `задержки контекста`. Используйте Builder для решения этой проблемы." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json new file mode 100644 index 00000000..93bbb25f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "构造器", + "info": "一个不影响子组件占位空间,不具有显示性的组件,存在的唯一价值是提供当前组件对应元素的上下文。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builder的使用", + "desc": [ + "【builder】 : 组件构造器 【WidgetBuilder】", + "同一个类中使用`XXX.of(context)`获取某类状态对象方法会存在`上下文滞后`的错误,使用Builder解决。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart new file mode 100644 index 00000000..83e7e8ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com + + +class BuilderDemo extends StatelessWidget { + const BuilderDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Scaffold( + appBar: AppBar( + title: const Text('Builder'), + ), + floatingActionButton: Builder( + builder: (ctx) => FloatingActionButton( + onPressed: () { + ScaffoldMessenger.of(ctx).showSnackBar(const SnackBar(content: Text('hello builder'))); + }, + child: const Icon(Icons.add), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json new file mode 100644 index 00000000..a4ab2fa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Schaltflächenleiste", + "info": "Empfängt eine Liste von Komponenten, die häufig verwendet wird, um mehrere Schaltflächen zu enthalten. Kann Ausrichtung, Ränder usw. angeben.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar-Ausrichtung", + "desc": [ + "【alignment】: Ausrichtung 【MainAxisAlignment】", + "【children】: Untergeordnete Komponenten 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar-Ränder und Höhe", + "desc": [ + "【buttonPadding】: Innenabstand 【EdgeInsetsGeometry】", + "【buttonHeight】: Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json new file mode 100644 index 00000000..5a3eddd8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Button Bar", + "info": "Receives a list of components, often used to hold several buttons. You can specify alignment, margins, and other information.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar Alignment", + "desc": [ + "【alignment】: Alignment 【MainAxisAlignment】", + "【children】: Child components 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar Margin and Height", + "desc": [ + "【buttonPadding】: Padding 【EdgeInsetsGeometry】", + "【buttonHeight】: Height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json new file mode 100644 index 00000000..c2ddb366 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra de botones", + "info": "Recibe una lista de componentes, comúnmente utilizada para contener varios botones. Se pueden especificar la alineación, los márgenes, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alineación de la Barra de botones", + "desc": [ + "【alignment】: Alineación 【MainAxisAlignment】", + "【children】: Conjunto de componentes hijos 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Márgenes y altura de la Barra de botones", + "desc": [ + "【buttonPadding】: Relleno interno 【EdgeInsetsGeometry】", + "【buttonHeight】: Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json new file mode 100644 index 00000000..329762a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barre de boutons", + "info": "Reçoit une liste de composants, souvent utilisée pour contenir plusieurs boutons. Peut spécifier l'alignement, les marges, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alignement de la barre de boutons", + "desc": [ + "【alignment】: Alignement 【MainAxisAlignment】", + "【children】: Ensemble de composants enfants 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Marge et hauteur de la barre de boutons", + "desc": [ + "【buttonPadding】: Marge intérieure 【EdgeInsetsGeometry】", + "【buttonHeight】: Hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json new file mode 100644 index 00000000..f976469f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra dei pulsanti", + "info": "Riceve un elenco di componenti, spesso utilizzato per contenere diversi pulsanti. È possibile specificare l'allineamento, i margini, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Allineamento della ButtonBar", + "desc": [ + "【alignment】: Allineamento 【MainAxisAlignment】", + "【children】: Insieme di componenti figli 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Margini e altezza della ButtonBar", + "desc": [ + "【buttonPadding】: Margine interno 【EdgeInsetsGeometry】", + "【buttonHeight】: Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json new file mode 100644 index 00000000..e2a5b021 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "ボタンバー", + "info": "コンポーネントリストを受け取り、通常はいくつかのボタンを配置するために使用されます。配置方法や余白などを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarの配置方法", + "desc": [ + "【alignment】: 配置方法 【MainAxisAlignment】", + "【children】: 子コンポーネントセット 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBarの余白と高さ", + "desc": [ + "【buttonPadding】: 内側の余白 【EdgeInsetsGeometry】", + "【buttonHeight】: 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json new file mode 100644 index 00000000..cc7d57b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "버튼 바", + "info": "컴포넌트 리스트를 받아들이며, 주로 여러 버튼을 담는 데 사용됩니다. 정렬 방식, 여백 등을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar 정렬 방식", + "desc": [ + "【alignment】: 정렬 방식 【MainAxisAlignment】", + "【children】: 자식 컴포넌트 집합 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar 여백과 높이", + "desc": [ + "【buttonPadding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【buttonHeight】: 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json new file mode 100644 index 00000000..31ef2efc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra de Botões", + "info": "Recebe uma lista de componentes, frequentemente usada para conter vários botões. Pode especificar alinhamento, margens, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alinhamento da Barra de Botões", + "desc": [ + "【alignment】: Alinhamento 【MainAxisAlignment】", + "【children】: Conjunto de componentes filhos 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Margens e Altura da Barra de Botões", + "desc": [ + "【buttonPadding】: Margem interna 【EdgeInsetsGeometry】", + "【buttonHeight】: Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json new file mode 100644 index 00000000..7a57b239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Панель кнопок", + "info": "Принимает список компонентов, часто используется для размещения нескольких кнопок. Можно указать выравнивание, отступы и другую информацию.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Выравнивание ButtonBar", + "desc": [ + "【alignment】: Выравнивание 【MainAxisAlignment】", + "【children】: Набор дочерних компонентов 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Отступы и высота ButtonBar", + "desc": [ + "【buttonPadding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【buttonHeight】: Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json new file mode 100644 index 00000000..afbc8471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "按钮栏", + "info": "接收组件列表,常用于盛放若干个按钮。可指定对齐方式、边距等信息。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar对齐方式", + "desc": [ + "【alignment】: 对齐方式 【MainAxisAlignment】", + "【children】: 子组件集 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar边距和高", + "desc": [ + "【buttonPadding】: 内边距 【EdgeInsetsGeometry】", + "【buttonHeight】: 高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart new file mode 100644 index 00000000..12c2f4ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart @@ -0,0 +1,31 @@ +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + + +class CustomButtonBar extends StatelessWidget { + const CustomButtonBar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ButtonBar( + alignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + child: const Text("ElevatedButton"), + onPressed: () => DialogAbout.show(context)), + OutlinedButton( + child: const Text("Outlined"), + onPressed: () => DialogAbout.show(context)), + TextButton( + onPressed: () => DialogAbout.show(context), + child: const Text("TextButton"), + ) + ], + ); + } +} + diff --git a/packages/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart similarity index 78% rename from packages/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart index 113943da..7c35a8db 100644 --- a/packages/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart @@ -5,14 +5,7 @@ import 'package:widgets/utils/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 29, -// "priority": 2, -// "name": "ButtonBar边距和高", -// "subtitle": "【buttonPadding】: 内边距 【EdgeInsetsGeometry】\n" -// "【buttonHeight】: 高 【double】", -// } + class PaddingButtonBar extends StatelessWidget { const PaddingButtonBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json new file mode 100644 index 00000000..350077f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Kartenkomponente", + "info": " Basierend auf Material-Komponenten implementiert, wird verwendet, um eine einzelne Komponente zu karten. Es verleiht ihr einen Schatteneffekt, kann Außenabstände hinzufügen und die Form der Karte anpassen.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card kann eine Komponente karten", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【margin】: Außenabstand 【double】", + "【color】: Farbe 【Color】", + "【child】: Kind 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Kann durch die shape-Eigenschaft einen Zuschneideeffekt erzielen", + "desc": [ + "【shape】 : Form 【ShapeBorder】", + "【margin】: Außenabstand 【double】", + "【color】: Farbe 【Color】", + "【child】: Kind 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json new file mode 100644 index 00000000..0e2687aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Card Component", + "info": "Implemented based on Material components, used to cardify a single component. It has a shadow effect, can add margin, and can customize the shape of the card.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card can cardify a component", + "desc": [ + "【elevation】: Shadow depth 【double】", + "【margin】: Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Can achieve clipping effect through the shape property", + "desc": [ + "【shape】: Shape 【ShapeBorder】", + "【margin】: Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json new file mode 100644 index 00000000..1306be48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente de tarjeta", + "info": "Implementado basado en componentes Material, utilizado para convertir un solo componente en una tarjeta. Y hacer que tenga un efecto de sombra, se puede agregar margen exterior y también se puede personalizar la forma de la tarjeta.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card puede convertir un componente en una tarjeta", + "desc": [ + "【elevation】 : profundidad de la sombra 【double】", + "【margin】: margen exterior 【double】", + "【color】: color 【Color】", + "【child】: hijo 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Se puede lograr un efecto de recorte a través de la propiedad shape", + "desc": [ + "【shape】 : forma 【ShapeBorder】", + "【margin】: margen exterior 【double】", + "【color】: color 【Color】", + "【child】: hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json new file mode 100644 index 00000000..4430a0d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Composant Carte", + "info": " Basé sur les composants Material, utilisé pour transformer un composant unique en carte. Il peut avoir un effet d'ombre, peut ajouter des marges extérieures, et peut également personnaliser la forme de la carte.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card peut transformer un composant en carte", + "desc": [ + "【elevation】 : profondeur de l'ombre 【double】", + "【margin】: marge extérieure 【double】", + "【color】: couleur 【Color】", + "【child】: enfant 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Peut réaliser un effet de découpe via la propriété shape", + "desc": [ + "【shape】 : forme 【ShapeBorder】", + "【margin】: marge extérieure 【double】", + "【color】: couleur 【Color】", + "【child】: enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json new file mode 100644 index 00000000..d1c82e19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente Carta", + "info": "Implementato basandosi sui componenti Material, utilizzato per trasformare un singolo componente in una carta. Con effetti di ombreggiatura, può includere margini esterni e consente la personalizzazione della forma della carta.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card può trasformare un componente in una carta", + "desc": [ + "【elevation】 : profondità dell'ombra 【double】", + "【margin】: margine esterno 【double】", + "【color】: colore 【Color】", + "【child】: figlio 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "È possibile ottenere effetti di ritaglio attraverso la proprietà shape", + "desc": [ + "【shape】 : forma 【ShapeBorder】", + "【margin】: margine esterno 【double】", + "【color】: colore 【Color】", + "【child】: figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json new file mode 100644 index 00000000..f3c87b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "カードコンポーネント", + "info": "Materialコンポーネントに基づいて実装され、単一のコンポーネントをカード化するために使用されます。また、投影効果を持たせることができ、外側の余白を追加したり、カードの形状をカスタマイズすることもできます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cardはコンポーネントをカード化することができます", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【margin】: 外側の余満 【double】", + "【color】: 色 【Color】", + "【child】: 子 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "shapeプロパティを使用して切り取り効果を実現できます", + "desc": [ + "【shape】 : 形状 【ShapeBorder】", + "【margin】: 外側の余満 【double】", + "【color】: 色 【Color】", + "【child】: 子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json new file mode 100644 index 00000000..3bd5e796 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "카드 컴포넌트", + "info": "Material 컴포넌트를 기반으로 구현되었으며, 단일 컴포넌트를 카드화하는 데 사용됩니다. 그림자 효과를 가지며, 외부 여백을 추가할 수 있고, 카드 모양을 사용자 정의할 수도 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card는 컴포넌트를 카드화할 수 있습니다", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【margin】: 외부 여백 【double】", + "【color】: 색상 【Color】", + "【child】: 자식 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "shape 속성을 통해 잘라내기 효과를 구현할 수 있습니다", + "desc": [ + "【shape】 : 모양 【ShapeBorder】", + "【margin】: 외부 여백 【double】", + "【color】: 색상 【Color】", + "【child】: 자식 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json new file mode 100644 index 00000000..5dd17b24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente de Cartão", + "info": "Implementado com base em componentes Material, usado para transformar um único componente em um cartão. E fazê-lo ter um efeito de sombra, pode adicionar margem externa e também pode personalizar a forma do cartão.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O Card pode transformar um componente em um cartão", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【margin】: Margem externa 【double】", + "【color】: Cor 【Color】", + "【child】: Filho 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Pode-se alcançar o efeito de corte através da propriedade shape", + "desc": [ + "【shape】 : Forma 【ShapeBorder】", + "【margin】: Margem externa 【double】", + "【color】: Cor 【Color】", + "【child】: Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json new file mode 100644 index 00000000..7b304d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Карточка", + "info": "Реализовано на основе компонентов Material, используется для карточного оформления отдельного компонента. Имеет эффект тени, можно добавить внешние отступы, также можно настроить форму карточки.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card может сделать компонент карточным", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【margin】: Внешний отступ 【double】", + "【color】: Цвет 【Color】", + "【child】: Дочерний элемент 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Можно реализовать эффект обрезки с помощью свойства shape", + "desc": [ + "【shape】 : Форма 【ShapeBorder】", + "【margin】: Внешний отступ 【double】", + "【color】: Цвет 【Color】", + "【child】: Дочерний элемент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json new file mode 100644 index 00000000..f0de12b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "卡片组件", + "info": " 基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card可以让一个组件卡片化", + "desc": [ + "【elevation】 : 影深 【double】", + "【margin】: 外边距 【double】", + "【color】: 颜色 【Color】", + "【child】: 孩子 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "可以通过shape属性实现裁切效果", + "desc": [ + "【shape】 : 形状 【ShapeBorder】", + "【margin】: 外边距 【double】", + "【color】: 颜色 【Color】", + "【child】: 孩子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart new file mode 100644 index 00000000..eb27e7f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class CustomCard extends StatelessWidget { + const CustomCard({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + color: const Color(0xffB3FE65), + elevation: 4, + margin: const EdgeInsets.all(10), + child: Container( + alignment: Alignment.topLeft, + width: 200, + height: 0.618 * 200, + margin: const EdgeInsets.all(10), + child: const Text("Card", style: TextStyle(fontSize: 20)), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart new file mode 100644 index 00000000..a5845018 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart @@ -0,0 +1,50 @@ + + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; +import 'package:widgets/utils/pather.dart'; + +class ShapeCard extends StatelessWidget { + const ShapeCard({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + color: const Color(0xffB3FE65), + elevation: 6, + shape: StarShapeBorder(), + child: Container( + alignment: Alignment.center, + width: 100, + height: 100, + child: const Text("Card", style: TextStyle(fontSize: 20)), + ), + ); + } +} + +class StarShapeBorder extends ShapeBorder { + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) { + return Path(); + } + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) => + Pather.create.nStarPath(9, 50, 40, dx: 50, dy: 50); + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) { + } + + @override + ShapeBorder scale(double t) { + return this; + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json new file mode 100644 index 00000000..327dfa24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Kachel mit Kontrollkästchen", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, hat eine linke und mittlere Struktur, wobei sich am Ende ein CheckBox befindet. An den entsprechenden Positionen können Komponenten eingefügt werden, was eine einfache Anpassung an spezifische Einträge ermöglicht.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung der CheckBoxListTile", + "desc": [ + "【secondary】: Linke Komponente 【Widget】", + "【checkColor】: Farbe des Häkchens 【Color】", + "【activeColor】: Farbe des Rahmens bei Auswahl 【Color】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【onChanged】: Auswahlereignis 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahleffekt der CheckBoxListTile", + "desc": [ + "【selected】: Ob ausgewählt 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft der CheckBoxListTile", + "desc": [ + "【dense】: Ob dicht angeordnet 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json new file mode 100644 index 00000000..0c257dc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Checkbox Tile", + "info": "A common list item structure provided by Flutter, featuring a left-middle structure with a CheckBox at the end. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic representation of CheckBoxListTile", + "desc": [ + "【secondary】: Left component 【Widget】", + "【checkColor】: ✔️ color 【Color】", + "【activeColor】: Frame color when selected 【Color】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【onChanged】: Selection event 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Selection effect of CheckBoxListTile", + "desc": [ + "【selected】: Whether selected 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of CheckBoxListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json new file mode 100644 index 00000000..076a7263 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Casilla de verificación", + "info": "Una estructura de lista genérica proporcionada por Flutter, con una estructura de izquierda a centro, y un CheckBox al final. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar fácilmente elementos específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento básico de CheckBoxListTile es el siguiente", + "desc": [ + "【secondary】: Componente izquierdo 【Widget】", + "【checkColor】: Color del ✔️ 【Color】", + "【activeColor】: Color del borde cuando está seleccionado 【Color】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de selección 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección de CheckBoxListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de densidad de CheckBoxListTile", + "desc": [ + "【dense】: Si está en modo denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json new file mode 100644 index 00000000..616d472e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Tuile de case à cocher", + "info": "Une structure de liste générique fournie par Flutter, de structure gauche-centre, avec une case à cocher à la fin. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de CheckBoxListTile est la suivante", + "desc": [ + "【secondary】: Composant gauche 【Widget】", + "【checkColor】: Couleur de la coche 【Color】", + "【activeColor】: Couleur de la bordure lors de la sélection 【Color】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【onChanged】: Événement de sélection 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection de CheckBoxListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de CheckBoxListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json new file mode 100644 index 00000000..c3891f1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Piastrella di selezione", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura sinistra-centro, e una casella di controllo alla fine. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile affrontare voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di CheckBoxListTile è la seguente", + "desc": [ + "【secondary】: Componente sinistro 【Widget】", + "【checkColor】: Colore del segno di spunta 【Color】", + "【activeColor】: Colore del bordo quando selezionato 【Color】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【onChanged】: Evento di selezione 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione di CheckBoxListTile", + "desc": [ + "【selected】: Se selezionato 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di disposizione compatta di CheckBoxListTile", + "desc": [ + "【dense】: Se disposto in modo compatto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json new file mode 100644 index 00000000..969448a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "チェックボックスリストタイル", + "info": "Flutterが提供する汎用リストアイテム構造で、左中構造で、末尾にCheckBoxがあります。適切な位置にコンポーネントを挿入でき、特定のアイテムに簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTileの基本表現は以下の通りです", + "desc": [ + "【secondary】: 左側コンポーネント 【Widget】", + "【checkColor】: ✔️色 【Color】", + "【activeColor】: 選択時の外枠色 【Color】", + "【title】: 中央上部コンポーネント 【Widget】", + "【subtitle】: 中央下部コンポーネント 【Widget】", + "【onChanged】: 選択イベント 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTileの選択効果", + "desc": [ + "【selected】: 選択されているかどうか 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json new file mode 100644 index 00000000..06ab1886 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "체크박스 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 왼쪽과 중앙 구조이며, 끝에는 CheckBox가 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTile의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【secondary】: 왼쪽 컴포넌트 【Widget】", + "【checkColor】: ✔️ 색상 【Color】", + "【activeColor】: 선택 시 외곽선 색상 【Color】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【onChanged】: 선택 이벤트 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTile의 선택 효과", + "desc": [ + "【selected】: 선택 여부 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json new file mode 100644 index 00000000..fe70e862 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Azulejo de Seleção", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura esquerda-central, e uma CheckBox na extremidade. Componentes podem ser inseridos nas posições correspondentes, permitindo uma fácil adaptação a itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do CheckBoxListTile é a seguinte", + "desc": [ + "【secondary】: Componente do lado esquerdo 【Widget】", + "【checkColor】: Cor do ✔️ 【Color】", + "【activeColor】: Cor da moldura quando selecionado 【Color】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de seleção 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção do CheckBoxListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do CheckBoxListTile", + "desc": [ + "【dense】: Se está em alta densidade 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json new file mode 100644 index 00000000..e21dca7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Флажок плитки", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет лево-центральную структуру, а в конце находится CheckBox. Компоненты могут быть вставлены в соответствующие позиции, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление CheckBoxListTile выглядит следующим образом", + "desc": [ + "【secondary】: Левый компонент 【Widget】", + "【checkColor】: Цвет ✔️ 【Color】", + "【activeColor】: Цвет рамки при выборе 【Color】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【onChanged】: Событие выбора 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора CheckBoxListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения CheckBoxListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json new file mode 100644 index 00000000..02ac5962 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "复选瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个CheckBox。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTile的基本表现如下", + "desc": [ + "【secondary】: 左侧组件 【Widget】", + "【checkColor】: ✔️颜色 【Color】", + "【activeColor】: 选中时外框颜色 【Color】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【onChanged】: 选中事件 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTile的选中效果", + "desc": [ + "【selected】: 是否选中 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart new file mode 100644 index 00000000..9d0a9b4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart @@ -0,0 +1,33 @@ + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomCheckBoxListTile extends StatefulWidget { + const CustomCheckBoxListTile({Key? key}) : super(key: key); + + @override + _CustomCheckBoxListTileState createState() => _CustomCheckBoxListTileState(); +} + +class _CustomCheckBoxListTileState extends State { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: CheckboxListTile( + value: _selected, + checkColor: Colors.yellow, + activeColor: Colors.orangeAccent, + secondary: Image.asset("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _selected = !_selected), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart new file mode 100644 index 00000000..f6fd5c80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart @@ -0,0 +1,34 @@ + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class SelectCheckBoxListTile extends StatefulWidget { + const SelectCheckBoxListTile({Key? key}) : super(key: key); + + @override + _SelectCheckBoxListTileState createState() => _SelectCheckBoxListTileState(); +} + +class _SelectCheckBoxListTileState extends State { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: CheckboxListTile( + value: _selected, + selected: _selected, + checkColor: Colors.yellow, + activeColor: Colors.orangeAccent, + secondary: Image.asset("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _selected = !_selected), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart new file mode 100644 index 00000000..e65566b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart @@ -0,0 +1,34 @@ +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; + +class DenseCheckBoxListTile extends StatefulWidget { + const DenseCheckBoxListTile({Key? key}) : super(key: key); + + @override + _DenseCheckBoxListTileState createState() => _DenseCheckBoxListTileState(); +} + +class _DenseCheckBoxListTileState extends State { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: CheckboxListTile( + value: _selected, + dense: true, + checkColor: Colors.yellow, + activeColor: Colors.orangeAccent, + secondary: Image.asset("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _selected = !_selected), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json new file mode 100644 index 00000000..16eb1fdd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "Debug-Label", + "info": "Wird nur im Debug-Modus in der oberen rechten Ecke angezeigt und hat keine große Bedeutung. Wird im MaterialApp-Komponenten-Quellcode verwendet.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CheckedModeBanner", + "desc": [ + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json new file mode 100644 index 00000000..bcff1cf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "debug label", + "info": "Only shows the corner mark in the upper right corner in debug mode, which is not very useful. There are usage scenarios in the MaterialApp component source code.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic usage of CheckedModeBanner", + "desc": [ + "【child】 : Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json new file mode 100644 index 00000000..69cdea9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etiqueta de depuración", + "info": "Solo muestra la esquina superior derecha en el modo de ejecución debug, no tiene mucha utilidad. Tiene un caso de uso en el código fuente del componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json new file mode 100644 index 00000000..cdce1d8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "étiquette de débogage", + "info": "Affiche uniquement le badge en haut à droite en mode de débogage, ce qui n'est pas très utile. Utilisé dans le code source du composant MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CheckedModeBanner", + "desc": [ + "【child】 : composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json new file mode 100644 index 00000000..970ea5b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etichetta di debug", + "info": "Mostra l'etichetta nell'angolo superiore destro solo in modalità debug, non ha molto uso. È utilizzato nel codice sorgente del componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json new file mode 100644 index 00000000..ef3ea16d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "デバッグタグ", + "info": "デバッグ実行モードでのみ右上の角に表示されるバッジで、あまり役に立ちません。MaterialAppコンポーネントのソースコードで使用例があります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBannerの基本的な使用", + "desc": [ + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json new file mode 100644 index 00000000..7b034ecf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "디버그 라벨", + "info": "디버그 실행 모드에서만 오른쪽 상단 코너에 표시되며, 특별히 큰 의미는 없습니다. MaterialApp 컴포넌트 소스 코드에서 사용 사례가 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBanner 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json new file mode 100644 index 00000000..6f44c107 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etiqueta de depuração", + "info": "Exibe o ícone no canto superior direito apenas no modo de execução de depuração, não tem muita utilidade. Há cenários de uso no código-fonte do componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json new file mode 100644 index 00000000..b11b1401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "отладочная метка", + "info": "Отображает значок в правом верхнем углу только в режиме отладки, не имеет особого значения. Используется в исходном коде компонента MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CheckedModeBanner", + "desc": [ + "【child】 : компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json new file mode 100644 index 00000000..72c0cd98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "debug标签", + "info": "仅在debug运行模式中显示右上角角标,没什么太大卵用。在 MaterialApp 组件源码中有使用场景。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBanner基本使用", + "desc": [ + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart new file mode 100644 index 00000000..6cf08309 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class CheckedModeBannerDemo extends StatelessWidget { + const CheckedModeBannerDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CheckedModeBanner( + child: Container( + alignment: Alignment.center, + width: 250, + height: 150, + color: Theme.of(context).primaryColor, + child: const Text( + "CheckedModeBanner", + style: TextStyle(color: Colors.white, fontSize: 20), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json new file mode 100644 index 00000000..222ba57f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Kleine Leiste Komponente", + "info": "Eine horizontale, abgerundete kleine Leiste, die links, mittig und rechts Komponenten enthalten kann. Kann Farbe, Schattenfarbe und Klick-Ereignisse angeben.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Normale Darstellung des Chips wie folgt", + "desc": [ + "【avatar】: Linke Komponente 【Widget】", + "【label】: Mittlere Komponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【labelPadding】: Label-Abstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Farbe und Schatten können eingestellt werden", + "desc": [ + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【shadowColor】: Schattenfarbe 【Color】", + "【elevation】: Schattentiefe 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Rechte Klick-Schaltfläche kann eingestellt werden", + "desc": [ + "【deleteIcon】: Rechte Komponente (normalerweise ein Icon) 【Widget】", + "【deleteIconColor】: Farbe der rechten Komponente 【Color】", + "【onDeleted】: Klick-Ereignis der rechten Komponente 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json new file mode 100644 index 00000000..6318c42a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Chip Component", + "info": "A horizontal rounded bar that can contain left, middle, and right components. You can specify colors, shadow colors, and click events.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal appearance of Chip is as follows", + "desc": [ + "【avatar】: Left component 【Widget】", + "【label】: Middle component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【labelPadding】: Label padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "You can set colors and shadows", + "desc": [ + "【backgroundColor】: Background color 【Color】", + "【shadowColor】: Shadow color 【Color】", + "【elevation】: Shadow depth 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "You can set the right click button", + "desc": [ + "【deleteIcon】: Right component (usually an Icon) 【Widget】", + "【deleteIconColor】: Right component color 【Color】", + "【onDeleted】: Right component click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json new file mode 100644 index 00000000..0b116b3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente de barra pequeña", + "info": "Una barra pequeña con bordes redondeados en horizontal, puede contener tres componentes: izquierdo, central y derecho. Se puede especificar el color, el color de la sombra y el evento de clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de Chip es el siguiente", + "desc": [ + "【avatar】: Componente izquierdo 【Widget】", + "【label】: Componente central 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【labelPadding】: Relleno del label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Se puede configurar el color y la sombra", + "desc": [ + "【backgroundColor】: Color de fondo 【Color】", + "【shadowColor】: Color de la sombra 【Color】", + "【elevation】: Profundidad de la sombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Se puede configurar el botón de clic derecho", + "desc": [ + "【deleteIcon】: Componente derecho (normalmente un Icono) 【Widget】", + "【deleteIconColor】: Color del componente derecho 【Color】", + "【onDeleted】: Evento de clic del componente derecho 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json new file mode 100644 index 00000000..dd86d847 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Composant Petite Barre", + "info": "Une petite barre horizontale aux bords arrondis, pouvant contenir trois composants à gauche, au centre et à droite. Peut spécifier la couleur, la couleur de l'ombre et l'événement de clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale de Chip est la suivante", + "desc": [ + "【avatar】: Composant gauche 【Widget】", + "【label】: Composant central 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【labelPadding】: Marge du label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Peut définir la couleur et l'ombre", + "desc": [ + "【backgroundColor】: Couleur de fond 【Color】", + "【shadowColor】: Couleur de l'ombre 【Color】", + "【elevation】: Profondeur de l'ombre 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Peut définir un bouton de clic à droite", + "desc": [ + "【deleteIcon】: Composant droit (généralement une icône) 【Widget】", + "【deleteIconColor】: Couleur du composant droit 【Color】", + "【onDeleted】: Événement de clic du composant droit 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json new file mode 100644 index 00000000..e8f38658 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente Piccolo", + "info": "Una piccola barra orizzontale con bordi arrotondati, può contenere tre componenti: sinistro, centrale e destro. È possibile specificare il colore, il colore dell'ombra e l'evento di clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Il comportamento normale di Chip è il seguente", + "desc": [ + "【avatar】: Componente sinistro 【Widget】", + "【label】: Componente centrale 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【labelPadding】: Spaziatura del label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "È possibile impostare il colore e l'ombra", + "desc": [ + "【backgroundColor】: Colore di sfondo 【Color】", + "【shadowColor】: Colore dell'ombra 【Color】", + "【elevation】: Profondità dell'ombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "È possibile impostare il pulsante di clic destro", + "desc": [ + "【deleteIcon】: Componente destro (solitamente Icon) 【Widget】", + "【deleteIconColor】: Colore del componente destro 【Color】", + "【onDeleted】: Evento di clic del componente destro 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json new file mode 100644 index 00000000..1da3165e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "チップコンポーネント", + "info": "横方向の丸いエッジを持つ小さなバーで、左、中央、右の3つのコンポーネントを含むことができます。色、影の色、クリックイベントを指定できます。", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chipの通常の表現は以下の通りです", + "desc": [ + "【avatar】: 左側のコンポーネント 【Widget】", + "【label】: 中央のコンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【labelPadding】: ラベルのパディング 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "色と影を設定できます", + "desc": [ + "【backgroundColor】: 背景色 【Color】", + "【shadowColor】: 影の色 【Color】", + "【elevation】: 影の深さ 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "右側のクリックボタンを設定できます", + "desc": [ + "【deleteIcon】: 右側のコンポーネント(通常はアイコン) 【Widget】", + "【deleteIconColor】: 右側のコンポーネントの色 【Color】", + "【onDeleted】: 右側のコンポーネントのクリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json new file mode 100644 index 00000000..01ab4fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "작은 막대 컴포넌트", + "info": "가로로 된 둥근 모서리의 작은 막대로, 왼쪽, 중앙, 오른쪽 세 개의 컴포넌트를 포함할 수 있습니다. 색상, 그림자 색상 및 클릭 이벤트를 지정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chip의 일반적인 모습은 다음과 같습니다", + "desc": [ + "【avatar】: 왼쪽 컴포넌트 【Widget】", + "【label】: 중앙 컴포넌트 【Widget】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】", + "【labelPadding】: label 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "색상과 그림자를 설정할 수 있습니다", + "desc": [ + "【backgroundColor】: 배경색 【Color】", + "【shadowColor】: 그림자 색상 【Color】", + "【elevation】: 그림자 깊이 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "오른쪽 클릭 버튼을 설정할 수 있습니다", + "desc": [ + "【deleteIcon】: 오른쪽 컴포넌트(일반적으로 Icon) 【Widget】", + "【deleteIconColor】: 오른쪽 컴포넌트 색상 【Color】", + "【onDeleted】: 오른쪽 컴포넌트 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json new file mode 100644 index 00000000..eddf2b10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente de Barra Pequena", + "info": "Uma pequena barra horizontal com bordas arredondadas que pode conter três componentes: esquerdo, central e direito. Pode especificar a cor, a cor da sombra e o evento de clique.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O comportamento normal do Chip é o seguinte", + "desc": [ + "【avatar】: Componente esquerdo 【Widget】", + "【label】: Componente central 【Widget】", + "【padding】 : Espaçamento interno 【EdgeInsetsGeometry】", + "【labelPadding】: Espaçamento do label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Pode definir cor e sombra", + "desc": [ + "【backgroundColor】: Cor de fundo 【Color】", + "【shadowColor】: Cor da sombra 【Color】", + "【elevation】: Profundidade da sombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Pode definir um botão de clique à direita", + "desc": [ + "【deleteIcon】: Componente direito (normalmente um ícone) 【Widget】", + "【deleteIconColor】: Cor do componente direito 【Color】", + "【onDeleted】: Evento de clique do componente direito 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json new file mode 100644 index 00000000..b540b89c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Маленький компонент", + "info": "Горизонтальная полоска с закругленными краями, которая может содержать три компонента: левый, центральный и правый. Можно указать цвет, цвет тени и событие клика.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное отображение Chip", + "desc": [ + "【avatar】: Левый компонент 【Widget】", + "【label】: Центральный компонент 【Widget】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【labelPadding】: Отступы для label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Можно задать цвет и тень", + "desc": [ + "【backgroundColor】: Цвет фона 【Color】", + "【shadowColor】: Цвет тени 【Color】", + "【elevation】: Глубина тени 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Можно задать кнопку клика справа", + "desc": [ + "【deleteIcon】: Правый компонент (обычно Icon) 【Widget】", + "【deleteIconColor】: Цвет правого компонента 【Color】", + "【onDeleted】: Событие клика правого компонента 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json new file mode 100644 index 00000000..a7f5a649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "小条组件", + "info": "一个横向的圆边小条,可以包含左中右三个组件。可以指定颜色、阴影色和点击事件。", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chip的普通表现如下", + "desc": [ + "【avatar】: 左侧组件 【Widget】", + "【label】: 中间组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【labelPadding】: label边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "可以设置颜色和阴影", + "desc": [ + "【backgroundColor】: 背景色 【Color】", + "【shadowColor】: 阴影色 【Color】", + "【elevation】: 影深 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "可以设置右侧点击按钮", + "desc": [ + "【deleteIcon】: 右侧组件(通常为Icon) 【Widget】", + "【deleteIconColor】: 右侧组件颜色 【Color】", + "【onDeleted】: 右侧组件点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart new file mode 100644 index 00000000..59f80507 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart @@ -0,0 +1,33 @@ + + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; +class CustomChip extends StatelessWidget { + const CustomChip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + Chip( + avatar: Image.asset("assets/images/icon_head.webp"), + label: const Text("张风捷特烈"), + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(5), + ), + const Chip( + avatar: CircleAvatar( + backgroundImage: + AssetImage("assets/images/wy_200x300.webp")), + label: Text("百里巫缨"), + padding: EdgeInsets.all(8), + labelPadding: EdgeInsets.all(6), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart new file mode 100644 index 00000000..0a1af3df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart @@ -0,0 +1,36 @@ + + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; +class ColorOfChip extends StatelessWidget { + const ColorOfChip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + Chip( + avatar: Image.asset("assets/images/icon_head.webp"), + label: const Text("张风捷特烈"), + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(5), + backgroundColor: Colors.grey.withAlpha(66), + shadowColor: Colors.orangeAccent, + elevation: 3, + ), + Chip( + avatar: Image.asset("assets/images/icon_head.webp"), + label: const Text("张风捷特烈"), + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(5), + backgroundColor: Colors.cyanAccent.withAlpha(11), + shadowColor: Colors.blue.withAlpha(88), + elevation: 4, + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart new file mode 100644 index 00000000..e9eae199 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart @@ -0,0 +1,27 @@ + + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + +class DeleteOfChip extends StatelessWidget { + const DeleteOfChip({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Chip( + avatar: Image.asset("assets/images/icon_head.webp"), + label: const Text("张风捷特烈"), + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + backgroundColor: Colors.grey.withAlpha(66), + shadowColor: Colors.orangeAccent, +// deleteIcon: Icon(Icons.close,size: 18), + deleteIconColor: Colors.red, + onDeleted: () => DialogAbout.show(context), + elevation: 3, + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json new file mode 100644 index 00000000..4d334bfc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Auswahl-Chip", + "info": "Ähnlich wie die Chip-Komponente, aber mit einigen Auswahlattributen. Sie können die Farbe, die Schattenfarbe und das Auswahlereignis angeben, wenn sie ausgewählt ist.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die normale Darstellung des ChoiceChip ist wie folgt", + "desc": [ + "【selectedColor】: Farbe bei Auswahl 【Color】", + "【selectedShadowColor】: Schattenfarbe bei Auswahl 【Color】", + "【onSelected】: Auswahlereignis 【Fuction(bool)】", + " Andere Attribute sind identisch mit der Chip-Komponente, ohne rechte Komponente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json new file mode 100644 index 00000000..ff345510 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Choice Strip", + "info": "Similar in style to the Chip component, with some selectable properties. You can specify the color when selected, the shadow color, and the selection event.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal performance of ChoiceChip is as follows", + "desc": [ + "【selectedColor】: Color when selected 【Color】", + "【selectedShadowColor】: Shadow color when selected 【Color】", + "【onSelected】: Selection event 【Fuction(bool)】", + " Other properties are the same as the Chip component, with no right component." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json new file mode 100644 index 00000000..09e2d306 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Pestaña de selección", + "info": "Estilo similar al componente Chip, con algunas propiedades de selección. Puede especificar el color cuando está seleccionado, el color de la sombra y el evento de selección.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de ChoiceChip es el siguiente", + "desc": [ + "【selectedColor】: Color cuando está seleccionado 【Color】", + "【selectedShadowColor】: Color de la sombra cuando está seleccionado 【Color】", + "【onSelected】: Evento de selección 【Fuction(bool)】", + " Otras propiedades son las mismas que el componente Chip, sin componente a la derecha." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json new file mode 100644 index 00000000..5b7a40db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Petite barre de sélection", + "info": "Un style similaire au composant Chip, avec quelques propriétés de sélection. Vous pouvez spécifier la couleur lorsqu'il est sélectionné, la couleur de l'ombre et l'événement de sélection.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale de ChoiceChip est la suivante", + "desc": [ + "【selectedColor】: Couleur lorsqu'il est sélectionné 【Color】", + "【selectedShadowColor】: Couleur de l'ombre lorsqu'il est sélectionné 【Color】", + "【onSelected】: Événement de sélection 【Fuction(bool)】", + " Les autres propriétés sont les mêmes que le composant Chip, sans composant à droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json new file mode 100644 index 00000000..281199d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Selezione Piccola Barra", + "info": "Uno stile simile al componente Chip, con alcune proprietà di selezione. È possibile specificare il colore selezionato, il colore dell'ombra e l'evento di selezione.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale di ChoiceChip è la seguente", + "desc": [ + "【selectedColor】: Colore selezionato 【Color】", + "【selectedShadowColor】: Colore dell'ombra selezionato 【Color】", + "【onSelected】: Evento di selezione 【Fuction(bool)】", + " Altre proprietà sono le stesse del componente Chip, senza componente a destra." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json new file mode 100644 index 00000000..5276900a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "選択チップ", + "info": "Chipコンポーネントと似たスタイルで、いくつかの選択属性があります。選択時の色、影の色、および選択イベントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChipの通常の表現は以下の通りです", + "desc": [ + "【selectedColor】: 選択時の色 【Color】", + "【selectedShadowColor】: 選択時の影の色 【Color】", + "【onSelected】: 選択イベント 【Fuction(bool)】", + " 他の属性はChipコンポーネントと同じで、右側のコンポーネントはありません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json new file mode 100644 index 00000000..492a2aef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "선택 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 몇 가지 선택 속성이 있습니다. 선택 시 색상, 그림자 색상 및 선택 이벤트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChip의 일반적인 표현은 다음과 같습니다", + "desc": [ + "【selectedColor】: 선택 시 색상 【Color】", + "【selectedShadowColor】: 선택 시 그림자 색상 【Color】", + "【onSelected】: 선택 이벤트 【Fuction(bool)】", + " 다른 속성은 Chip 컴포넌트와 동일하며, 오른쪽 컴포넌트는 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json new file mode 100644 index 00000000..3098e281 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Barra de Seleção", + "info": "Estilo semelhante ao componente Chip, com algumas propriedades de seleção. Pode especificar a cor quando selecionado, a cor da sombra e o evento de seleção.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O comportamento normal do ChoiceChip é o seguinte", + "desc": [ + "【selectedColor】: Cor quando selecionado 【Color】", + "【selectedShadowColor】: Cor da sombra quando selecionado 【Color】", + "【onSelected】: Evento de seleção 【Fuction(bool)】", + " Outras propriedades são iguais ao componente Chip, sem componente à direita." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json new file mode 100644 index 00000000..8078651a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Выбор полоски", + "info": "Стиль, похожий на компонент Chip, с некоторыми свойствами выбора. Можно указать цвет при выборе, цвет тени и событие выбора.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное поведение ChoiceChip следующее", + "desc": [ + "【selectedColor】: Цвет при выборе 【Color】", + "【selectedShadowColor】: Цвет тени при выборе 【Color】", + "【onSelected】: Событие выбора 【Fuction(bool)】", + " Остальные свойства такие же, как у компонента Chip, без правого компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json new file mode 100644 index 00000000..000e49a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "选择小条", + "info": "和Chip组件类似的样式,有一些选择的属性。可以指定选中时的颜色、阴影色和选择事件。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChip的普通表现如下", + "desc": [ + "【selectedColor】: 选中时颜色 【Color】", + "【selectedShadowColor】: 选中时阴影颜色 【Color】", + "【onSelected】: 选中事件 【Fuction(bool)】", + " 其他属性同Chip组件,无右侧组件。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart new file mode 100644 index 00000000..973d090f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart @@ -0,0 +1,39 @@ + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; + +class CustomChoiceChip extends StatefulWidget { + const CustomChoiceChip({Key? key}) : super(key: key); + + @override + _CustomChoiceChipState createState() => _CustomChoiceChipState(); +} + +class _CustomChoiceChipState extends State { + bool _select = false; + + @override + Widget build(BuildContext context) { + return ChoiceChip( + selected: _select, + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(5), + label: Text( + _select ? + "You are selected it." : + "This is a ChoiceChip.", + style: const TextStyle(fontSize: 16), + ), + backgroundColor: Colors.grey.withAlpha(66), + avatar: Image.asset("assets/images/icon_head.webp"), + selectedColor: Colors.orangeAccent.withAlpha(44), + selectedShadowColor: Colors.blue, + shadowColor: Colors.orangeAccent, + elevation: 3, + onSelected: (value) => setState(() => _select = value), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json new file mode 100644 index 00000000..ce5e95ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Rundes Widget", + "info": "Kann ein Bild in einen Kreis verwandeln und in der Mitte ein Widget platzieren. Es können Radius, Vordergrundfarbe, Hintergrundfarbe usw. angegeben werden.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Darstellung von CircleAvatar", + "desc": [ + "【radius】 : Radius 【double】", + "【backgroundImage】 : Bildressource 【ImageProvider】", + "【foregroundColor】: Vordergrundfarbe 【Color】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【minRadius】: Minimaler Radius 【double】", + "【maxRadius】: Maximaler Radius 【double】", + "【child】: Kind-Widget 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json new file mode 100644 index 00000000..d121b938 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Circular Component", + "info": "Can turn an image into a circle, and a component can be placed in the center. You can specify the radius, foreground color, background color, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar Performance", + "desc": [ + "【radius】: radius 【double】", + "【backgroundImage】: image resource 【ImageProvider】", + "【foregroundColor】: foreground color 【Color】", + "【backgroundColor】: background color 【Color】", + "【minRadius】: minimum radius 【double】", + "【maxRadius】: maximum radius 【double】", + "【child】: child component 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json new file mode 100644 index 00000000..d1bfae5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente Circular", + "info": "Puede convertir una imagen en un círculo y colocar un componente en el centro. Puede especificar el radio, el color de primer plano, el color de fondo, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamiento de CircleAvatar", + "desc": [ + "【radius】 : radio 【double】", + "【backgroundImage】 : recurso de imagen 【ImageProvider】", + "【foregroundColor】: color de primer plano 【Color】", + "【backgroundColor】: color de fondo 【Color】", + "【minRadius】: radio mínimo 【double】", + "【maxRadius】: radio máximo 【double】", + "【child】: componente hijo 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json new file mode 100644 index 00000000..bdbef6fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Composant Circulaire", + "info": "Permet de transformer une image en cercle et de placer un composant au centre. Peut spécifier le rayon, la couleur de premier plan, la couleur d'arrière-plan, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportement de CircleAvatar", + "desc": [ + "【radius】 : rayon 【double】", + "【backgroundImage】 : ressource d'image 【ImageProvider】", + "【foregroundColor】: couleur de premier plan 【Color】", + "【backgroundColor】: couleur d'arrière-plan 【Color】", + "【minRadius】: rayon minimum 【double】", + "【maxRadius】: rayon maximum 【double】", + "【child】: composant enfant 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json new file mode 100644 index 00000000..a225eb75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente circolare", + "info": "Trasforma un'immagine in un cerchio e può posizionare un componente al centro. È possibile specificare il raggio, il colore di primo piano, il colore di sfondo, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamento di CircleAvatar", + "desc": [ + "【radius】 : raggio 【double】", + "【backgroundImage】 : risorsa immagine 【ImageProvider】", + "【foregroundColor】: colore di primo piano 【Color】", + "【backgroundColor】: colore di sfondo 【Color】", + "【minRadius】: raggio minimo 【double】", + "【maxRadius】: raggio massimo 【double】", + "【child】: componente figlio 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json new file mode 100644 index 00000000..4b8adfce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "円形コンポーネント", + "info": "画像を円形にし、中央にコンポーネントを配置できます。半径、前景色、背景色などを指定できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatarの表現", + "desc": [ + "【radius】 : 半径 【double】", + "【backgroundImage】 : 画像リソース 【ImageProvider】", + "【foregroundColor】: 前景色 【Color】", + "【backgroundColor】: 背景色 【Color】", + "【minRadius】: 最小半径 【double】", + "【maxRadius】: 最大半径 【double】", + "【child】: 子コンポーネント 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json new file mode 100644 index 00000000..91fabafc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "원형 컴포넌트", + "info": "이미지를 원형으로 만들고 중앙에 컴포넌트를 배치할 수 있습니다. 반지름, 전경색, 배경색 등을 지정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar의 표현", + "desc": [ + "【radius】 : 반지름 【double】", + "【backgroundImage】 : 이미지 리소스 【ImageProvider】", + "【foregroundColor】: 전경색 【Color】", + "【backgroundColor】: 배경색 【Color】", + "【minRadius】: 최소 반지름 【double】", + "【maxRadius】: 최대 반지름 【double】", + "【child】: 자식 컴포넌트 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json new file mode 100644 index 00000000..7ac327c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente Circular", + "info": "Pode transformar uma imagem em um círculo e colocar um componente no meio. Pode especificar raio, cor de primeiro plano, cor de fundo, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamento do CircleAvatar", + "desc": [ + "【radius】 : raio 【double】", + "【backgroundImage】 : recurso de imagem 【ImageProvider】", + "【foregroundColor】: cor de primeiro plano 【Color】", + "【backgroundColor】: cor de fundo 【Color】", + "【minRadius】: raio mínimo 【double】", + "【maxRadius】: raio máximo 【double】", + "【child】: componente filho 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json new file mode 100644 index 00000000..c76175ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Круглый компонент", + "info": "Может превратить изображение в круг и разместить компонент в центре. Можно указать радиус, цвет переднего плана, цвет фона и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Поведение CircleAvatar", + "desc": [ + "【radius】 : радиус 【double】", + "【backgroundImage】 : ресурс изображения 【ImageProvider】", + "【foregroundColor】: цвет переднего плана 【Color】", + "【backgroundColor】: цвет фона 【Color】", + "【minRadius】: минимальный радиус 【double】", + "【maxRadius】: максимальный радиус 【double】", + "【child】: дочерний компонент 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json new file mode 100644 index 00000000..53f64fbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "圆形组件", + "info": "可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar的表现", + "desc": [ + "【radius】 : 半径 【double】", + "【backgroundImage】 : 图片资源 【ImageProvider】", + "【foregroundColor】: 前景色 【Color】", + "【backgroundColor】: 背景色 【Color】", + "【minRadius】: 最小半径 【double】", + "【maxRadius】: 最大半径 【double】", + "【child】: 孩子组件 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart new file mode 100644 index 00000000..796785f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart @@ -0,0 +1,22 @@ +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; + +class CustomCircleAvatar extends StatelessWidget { + const CustomCircleAvatar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const CircleAvatar( + radius: 50, + backgroundImage: AssetImage("assets/images/wy_200x300.webp"), + foregroundColor: Colors.white, + child: Icon( + Icons.check, + size: 50, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json new file mode 100644 index 00000000..eabc3b82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Schließen-Button", + "info": "Ein IconButton mit Schließfunktion, das Schließsymbol kann nicht geändert werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton-Klickereignis", + "desc": [ + "【onPressed】 : Klickereignis 【VoidCallback?】", + "【style】: Button-Stil 【ButtonStyle?】", + "【color】: Farbe 【Color】", + "Wenn onPressed leer ist, wird beim Klicken die aktuelle Oberfläche verlassen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json new file mode 100644 index 00000000..14e86541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Close Button", + "info": "An IconButton with close functionality, the close icon cannot be changed.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton Click Event", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "【color】: Color 【Color】", + "When onPressed is null, clicking will exit the current interface." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json new file mode 100644 index 00000000..9384aac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Botón de cerrar", + "info": "Un IconButton con función de cerrar, el ícono de cerrar no se puede cambiar.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de CloseButton", + "desc": [ + "【onPressed】: Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "【color】: Color 【Color】", + "Cuando onPressed es nulo, al hacer clic se cerrará la interfaz actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json new file mode 100644 index 00000000..d05f99e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Bouton de fermeture", + "info": "Un IconButton avec une fonction de fermeture, l'icône de fermeture ne peut pas être modifiée.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic du CloseButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "【color】: Couleur 【Color】", + "Lorsque onPressed est vide, un clic quitte l'interface actuelle." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json new file mode 100644 index 00000000..8282b27e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Pulsante di chiusura", + "info": "Un IconButton con funzionalità di chiusura, l'icona di chiusura non può essere modificata.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic del Pulsante di chiusura", + "desc": [ + "【onPressed】: Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "【color】: Colore 【Color】", + "Quando onPressed è vuoto, il clic chiude l'interfaccia corrente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json new file mode 100644 index 00000000..452d7464 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "閉じるボタン", + "info": "閉じる機能を持つIconButtonで、閉じるアイコンは変更できません。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonクリックイベント", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "【color】: 色 【Color】", + "onPressedが空の場合、クリックすると現在の画面が閉じます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json new file mode 100644 index 00000000..dde13e43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "닫기 버튼", + "info": "닫기 기능이 있는 IconButton, 닫기 아이콘은 변경할 수 없습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton 클릭 이벤트", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "【color】: 색상 【Color】", + "onPressed가 비어 있을 때, 클릭하면 현재 화면을 종료합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json new file mode 100644 index 00000000..1b9c9168 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Botão de Fechar", + "info": "Um IconButton com função de fechar, o ícone de fechar não pode ser alterado.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do CloseButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "【color】: Cor 【Color】", + "Quando onPressed estiver vazio, ao clicar, a interface atual será fechada." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json new file mode 100644 index 00000000..ce22d866 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Кнопка закрытия", + "info": "IconButton с функцией закрытия, значок закрытия нельзя изменить.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия кнопки CloseButton", + "desc": [ + "【onPressed】 : Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "【color】: Цвет 【Color】", + "Когда onPressed пуст, нажатие закрывает текущий интерфейс." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json new file mode 100644 index 00000000..844ed1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "关闭按钮", + "info": "一个具有关闭功能的IconButton,关闭图标不可更改。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton点击事件", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "【color】: 颜色 【Color】", + "onPressed 为空时,点击时会退出当前界面。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart new file mode 100644 index 00000000..973db918 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + + +class CustomCloseButton extends StatelessWidget { + const CustomCloseButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const CloseButton(); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..89f22fb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Schaltfläche zum Schließen Symbol", + "info": "Ein Close Icon-Symbol, das je nach Plattform das entsprechende Symbol anzeigt und über ActionIconTheme angepasst werden kann.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon Effekt", + "desc": [ + "Passt das Symbol der Schaltfläche zum Schließen für verschiedene Plattformen über die _ActionIcon-Komponente gemäß dem ActionIconTheme an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json new file mode 100644 index 00000000..f2a5aaa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Close Button Icon", + "info": "A close Icon that displays the corresponding icon based on the platform, and can be customized with ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the close button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..9df7ee0a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icono de botón de cierre", + "info": "Un icono de cierre, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de CloseButtonIcon", + "desc": [ + "A través del componente _ActionIcon, se adapta el icono del botón de cierre a diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..4237a4ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icône de bouton de fermeture", + "info": "Une icône de fermeture, affichant l'icône correspondante selon la plateforme, peut être personnalisée via ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de CloseButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône de bouton de fermeture à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..4a687a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icona del pulsante di chiusura", + "info": "Un'icona di chiusura, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata con il tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto CloseButtonIcon", + "desc": [ + "Attraverso il componente _ActionIcon, adatta l'icona del pulsante di chiusura a diverse piattaforme in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..5993f278 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "閉じるボタンアイコン", + "info": "閉じるアイコンで、プラットフォームに応じて対応するアイコンを表示します。ActionIconThemeでテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 効果", + "desc": [ + "_ActionIconコンポーネントを使用して、ActionIconThemeテーマに基づいて、異なるプラットフォームの閉じるボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..1e02127e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "닫기 버튼 아이콘", + "info": "닫기 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 닫기 버튼 아이콘을 적용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..26d0adbb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Ícone do Botão de Fechar", + "info": "Um ícone de fechar que exibe o ícone correspondente de acordo com a plataforma, podendo ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do CloseButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão de fechar de acordo com o tema ActionIconTheme para diferentes plataformas." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..95657f89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Иконка кнопки закрытия", + "info": "Иконка закрытия, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект CloseButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки закрытия для разных платформ в зависимости от темы ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..0eb43117 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "关闭按钮图标", + "info": "一个关闭 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的关闭按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart new file mode 100644 index 00000000..c18bfd49 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + +class CloseButtonIconDemo extends StatelessWidget { + const CloseButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const CloseButtonIcon(); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json new file mode 100644 index 00000000..aac7c4db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Container-Komponente", + "info": "Eine Container-Komponente, die ein einzelnes Unterelement aufnehmen kann. Integriert mehrere Funktionen von Unterelementen wie Innen- und Außenabstände, Transformationen, Dekorationen, Einschränkungen usw...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann verwendet werden, um einen Bereich mit einer bestimmten Breite und Höhe anzuzeigen", + "desc": [ + "【width】 : Breite 【int】", + "【height】: Höhe 【int】", + "【color】: Farbe 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Kann ein Unterelement in den Bereich einfügen", + "desc": [ + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【margin】: Außenabstand 【EdgeInsetsGeometry】", + "【child】: Unterelement 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Kann das Unterelement ausrichten und positionieren", + "desc": [ + "【alignment】 : Ausrichtung und Positionierung 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Kann das Unterelement dekorieren", + "desc": [ + "【decoration】 : Dekoration 【Decoration】", + "Kann dekorieren: Rahmen, abgerundete Ecken, Farbe, Verlauf, Schatten, Bilder usw." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container hat auch Transformationsfähigkeiten", + "desc": [ + "【transform】 : Transformationsmatrix 【Matrix4】", + "Matrix-Transformation basierend auf Matrix4, Details siehe lineare Algebra" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Einschränkungen des Containers", + "desc": [ + "【constraints】 : Einschränkungen 【BoxConstraints】", + "Schränkt die Größe des Bereichs ein, nicht kleiner als die angegebene minimale Breite und Höhe, und nicht größer als die angegebene maximale Breite und Höhe." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json new file mode 100644 index 00000000..3e1ce07f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Container Component", + "info": "A container component used to hold a single child component. It integrates several functionalities of single child components, such as padding, margin, transformation, decoration, constraints, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Can be used to display an area with specified width and height", + "desc": [ + "【width】 : width 【int】", + "【height】: height 【int】", + "【color】: color 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Can place a child component within the area", + "desc": [ + "【padding】 : padding 【EdgeInsetsGeometry】", + "【margin】: margin 【EdgeInsetsGeometry】", + "【child】: child component 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Can align and position the child component", + "desc": [ + "【alignment】 : alignment 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Can decorate the child component", + "desc": [ + "【decoration】 : decoration 【Decoration】", + "Can decorate: borders, rounded corners, colors, gradients, shadows, images, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container also has transformation capabilities", + "desc": [ + "【transform】 : transformation matrix 【Matrix4】", + "Matrix transformation based on Matrix4, see linear algebra for details" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Constraints of the Container", + "desc": [ + "【constraints】 : constraints 【BoxConstraints】", + "Will constrain the size of the area, it will not be smaller than the specified minimum width and height, nor larger than the specified maximum width and height." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json new file mode 100644 index 00000000..2fe57f96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente Contenedor", + "info": "Componente contenedor utilizado para albergar un único componente hijo. Integra varias funciones de componentes hijos únicos, como márgenes internos y externos, transformaciones, decoraciones, restricciones, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Puede usarse para mostrar un área con un ancho y alto especificados", + "desc": [ + "【width】 : Ancho 【int】", + "【height】: Alto 【int】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Puede colocar un componente hijo dentro del área", + "desc": [ + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【margin】: Margen externo 【EdgeInsetsGeometry】", + "【child】: Componente hijo 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Puede alinear y posicionar el componente hijo", + "desc": [ + "【alignment】 : Alineación y posicionamiento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Puede decorar el componente hijo", + "desc": [ + "【decoration】 : Decoración 【Decoration】", + "Se puede decorar: bordes, esquinas redondeadas, colores, degradados, sombras, imágenes, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container también tiene capacidad de transformación", + "desc": [ + "【transform】 : Matriz de transformación 【Matrix4】", + "Transformación basada en la matriz Matrix4, los detalles de la transformación se pueden ver en álgebra lineal" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Restricciones de Container", + "desc": [ + "【constraints】 : Restricciones 【BoxConstraints】", + "Restringirá el tamaño del área, no será menor que el ancho y alto mínimo especificados, ni mayor que el ancho y alto máximo especificados." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json new file mode 100644 index 00000000..50c57bbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Composant conteneur", + "info": "Composant conteneur utilisé pour contenir un seul composant enfant. Intègre plusieurs fonctionnalités de composants enfants uniques, telles que les marges intérieures et extérieures, la transformation, la décoration, les contraintes, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut être utilisé pour afficher une zone de largeur et de hauteur spécifiées", + "desc": [ + "【width】 : Largeur 【int】", + "【height】: Hauteur 【int】", + "【color】: Couleur 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Peut contenir un composant enfant dans la zone", + "desc": [ + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【margin】: Marge extérieure 【EdgeInsetsGeometry】", + "【child】: Composant enfant 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Peut aligner et positionner le composant enfant", + "desc": [ + "【alignment】 : Alignement et positionnement 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Peut décorer le composant enfant", + "desc": [ + "【decoration】 : Décoration 【Decoration】", + "Peut décorer : bordures, coins arrondis, couleurs, dégradés, ombres, images, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Le Container a également des propriétés de transformation", + "desc": [ + "【transform】 : Matrice de transformation 【Matrix4】", + "Transformation matricielle basée sur Matrix4, voir l'algèbre linéaire pour plus de détails sur les transformations" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Les contraintes du Container", + "desc": [ + "【constraints】 : Contraintes 【BoxConstraints】", + "Contraint la taille de la zone, ne sera pas plus petite que la largeur et la hauteur minimales spécifiées, ni plus grande que la largeur et la hauteur maximales spécifiées." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json new file mode 100644 index 00000000..1ffcac6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente contenitore", + "info": "Un componente contenitore utilizzato per contenere un singolo componente figlio. Integra diverse funzionalità per i componenti figli singoli, come margini interni ed esterni, trasformazioni, decorazioni, vincoli, ecc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può essere utilizzato per visualizzare un'area con larghezza e altezza specificate", + "desc": [ + "【width】 : Larghezza 【int】", + "【height】: Altezza 【int】", + "【color】: Colore 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Può contenere un componente figlio all'interno dell'area", + "desc": [ + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【margin】: Spaziatura esterna 【EdgeInsetsGeometry】", + "【child】: Componente figlio 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Può allineare e posizionare il componente figlio", + "desc": [ + "【alignment】 : Allineamento e posizionamento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Può decorare il componente figlio", + "desc": [ + "【decoration】 : Decorazione 【Decoration】", + "Può decorare: bordi, angoli arrotondati, colori, gradienti, ombre, immagini, ecc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container ha anche capacità di trasformazione", + "desc": [ + "【transform】 : Matrice di trasformazione 【Matrix4】", + "Trasformazione basata sulla matrice Matrix4, per i dettagli vedere l'algebra lineare" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Vincoli del Container", + "desc": [ + "【constraints】 : Vincoli 【BoxConstraints】", + "Vincolerà le dimensioni dell'area, non sarà inferiore alla larghezza e altezza minima specificata, né superiore alla larghezza e altezza massima specificata." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json new file mode 100644 index 00000000..1dfc93af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "コンテナコンポーネント", + "info": "単一の子コンポーネントを収容するためのコンテナコンポーネントです。内部および外部の余白、変形、装飾、制約など、複数の単一子コンポーネントの機能を統合しています...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "指定された幅と高さの領域を表示するために使用できます", + "desc": [ + "【width】 : 幅 【int】", + "【height】: 高さ 【int】", + "【color】: 色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "領域内に子コンポーネントを配置できます", + "desc": [ + "【padding】 : 内側の余白 【EdgeInsetsGeometry】", + "【margin】: 外側の余白 【EdgeInsetsGeometry】", + "【child】: 子コンポーネント 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "子コンポーネントを整列および配置できます", + "desc": [ + "【alignment】 : 整列および配置 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "子コンポーネントを装飾できます", + "desc": [ + "【decoration】 : 装飾 【Decoration】", + "装飾可能: ボーダー、角丸、色、グラデーション、シャドウ、画像など" + ] + }, + { + "file": "node5_transform.dart", + "name": "Containerは変形性も持っています", + "desc": [ + "【transform】 : 変換行列 【Matrix4】", + "Matrix4に基づく行列変換、変換の詳細は線形代数を参照してください" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Containerの制約性", + "desc": [ + "【constraints】 : 制約 【BoxConstraints】", + "この領域のサイズを制約し、指定された最小幅と高さより小さくならないようにし、指定された最大幅と高さより大きくならないようにします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json new file mode 100644 index 00000000..183d8026 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "컨테이너 컴포넌트", + "info": "단일 자식 컴포넌트를 수용하는 컨테이너 컴포넌트입니다. 내부 및 외부 여백, 변형, 장식, 제약 등 여러 단일 자식 컴포넌트의 기능을 통합했습니다...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "지정된 너비와 높이의 영역을 표시할 수 있습니다", + "desc": [ + "【width】 : 너비 【int】", + "【height】: 높이 【int】", + "【color】: 색상 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "영역에 자식 컴포넌트를 넣을 수 있습니다", + "desc": [ + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【margin】: 외부 여백 【EdgeInsetsGeometry】", + "【child】: 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "자식 컴포넌트를 정렬 및 위치 지정할 수 있습니다", + "desc": [ + "【alignment】 : 정렬 및 위치 지정 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "자식 컴포넌트를 장식할 수 있습니다", + "desc": [ + "【decoration】 : 장식 【Decoration】", + "장식 가능: 테두리, 둥근 모서리, 색상, 그라데이션, 그림자, 이미지 등" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container는 변환 기능도 가지고 있습니다", + "desc": [ + "【transform】 : 변환 행렬 【Matrix4】", + "Matrix4 기반의 행렬 변환, 변환 상세는 선형 대수 참조" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container의 제약성", + "desc": [ + "【constraints】 : 제약 【BoxConstraints】", + "이 영역의 크기를 제한하며, 지정된 최소 너비와 높이보다 작지 않고, 지정된 최대 너비와 높이보다 크지 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json new file mode 100644 index 00000000..a4a4af6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente de Contêiner", + "info": "Componente de contêiner usado para acomodar um único componente filho. Integra várias funcionalidades de componentes filhos únicos, como margens internas e externas, transformações, decorações, restrições, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode ser usado para exibir uma área com largura e altura especificadas", + "desc": [ + "【width】 : Largura 【int】", + "【height】: Altura 【int】", + "【color】: Cor 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Pode colocar um componente filho na área", + "desc": [ + "【padding】 : Margem interna 【EdgeInsetsGeometry】", + "【margin】: Margem externa 【EdgeInsetsGeometry】", + "【child】: Componente filho 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Pode alinhar e posicionar o componente filho", + "desc": [ + "【alignment】 : Alinhamento e posicionamento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Pode decorar o componente filho", + "desc": [ + "【decoration】 : Decoração 【Decoration】", + "Pode decorar: bordas, arcos, cores, gradientes, sombras, imagens, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container também possui transformações", + "desc": [ + "【transform】 : Matriz de transformação 【Matrix4】", + "Transformação de matriz baseada em Matrix4, detalhes da transformação veja álgebra linear" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Restrições do Container", + "desc": [ + "【constraints】 : Restrições 【BoxConstraints】", + "Irá restringir o tamanho da área, não será menor que a largura e altura mínima especificada, nem maior que a largura e altura máxima especificada." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json new file mode 100644 index 00000000..5ee7cd29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Контейнерный компонент", + "info": "Контейнерный компонент для размещения одного дочернего компонента. Интегрирует несколько функций для одного дочернего компонента, таких как внутренние и внешние отступы, трансформации, декорации, ограничения и т.д...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Может использоваться для отображения области с заданной шириной и высотой", + "desc": [ + "【width】 : Ширина 【int】", + "【height】: Высота 【int】", + "【color】: Цвет 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Можно поместить один дочерний компонент в область", + "desc": [ + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【margin】: Внешние отступы 【EdgeInsetsGeometry】", + "【child】: Дочерний компонент 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Можно выровнять и позиционировать дочерний компонент", + "desc": [ + "【alignment】 : Выравнивание и позиционирование 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Можно украсить дочерний компонент", + "desc": [ + "【decoration】 : Декорация 【Decoration】", + "Можно украсить: границы, скругления, цвет, градиент, тени, изображения и т.д." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container также обладает трансформационными свойствами", + "desc": [ + "【transform】 : Матрица трансформации 【Matrix4】", + "Матричные преобразования на основе Matrix4, подробности см. в линейной алгебре" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Ограничения Container", + "desc": [ + "【constraints】 : Ограничения 【BoxConstraints】", + "Ограничивает размер области, не позволяя ей быть меньше указанной минимальной ширины и высоты, а также больше указанной максимальной ширины и высоты." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json new file mode 100644 index 00000000..cb27642a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "容器组件", + "info": "用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可用于显示一个指定宽高的区域", + "desc": [ + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "可以在区域中放入一个子组件", + "desc": [ + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】: 外边距 【EdgeInsetsGeometry】", + "【child】: 子组件 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "可对子组件进行对齐定位", + "desc": [ + "【alignment】 : 对齐定位 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "可对子组件进行装饰", + "desc": [ + "【decoration】 : 装饰 【Decoration】", + "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container还具有变换性", + "desc": [ + "【transform】 : 变换矩阵 【Matrix4】", + "基于Matrix4的矩阵变换,变换详情见线性代数" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container的约束性", + "desc": [ + "【constraints】 : 约束 【BoxConstraints】", + "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart new file mode 100644 index 00000000..b4cb2c7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class CustomContainer extends StatelessWidget { + const CustomContainer({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.topLeft, + width: 200, + height: 200 * 0.618, + color: Colors.red.withAlpha(88), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart new file mode 100644 index 00000000..592513f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class ContainerWithChild extends StatelessWidget { + const ContainerWithChild({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.topLeft, + padding: const EdgeInsets.all(20), + margin: const EdgeInsets.all(10), + width: 200, + height: 200 * 0.618, + color: Colors.grey.withAlpha(88), + child: const Icon(Icons.android), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart new file mode 100644 index 00000000..069ed3c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class ContainerAlignment extends StatelessWidget { + const ContainerAlignment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.bottomRight, + width: 200, + height: 200 * 0.618, + color: Colors.grey.withAlpha(88), + child: const Icon( + Icons.android, + color: Colors.green, + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart new file mode 100644 index 00000000..7d35f39c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class ContainerDecoration extends StatelessWidget { + const ContainerDecoration({super.key}); + + List get rainbow => [ + 0xffff0000, + 0xffFF7F00, + 0xffFFFF00, + 0xff00FF00, + 0xff00FFFF, + 0xff0000FF, + 0xff8B00FF + ]; + + List get stops => [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; + + @override + Widget build(BuildContext context) { + + return Container( + alignment: Alignment.center, + width: 200, + height: 200 * 0.618, + margin: const EdgeInsets.all(20), + padding: const EdgeInsets.all(20), + decoration: BoxDecoration(//添加渐变色 + gradient: LinearGradient( + stops: stops, + colors: rainbow.map((e) => Color(e)).toList()), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(50), + bottomRight: Radius.circular(50)), + boxShadow: const [ + BoxShadow( + color: Colors.grey, + offset: Offset(1, 1), + blurRadius: 10, + spreadRadius: 1), + ]), + child: const Text( + "Container", + style: TextStyle(fontSize: 20), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart new file mode 100644 index 00000000..f2598d30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart @@ -0,0 +1,25 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class ContainerTransform extends StatelessWidget { + const ContainerTransform({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 150, + height: 150 * 0.618, + transform: Matrix4.skew(-pi / 10, 0), + child: const Text( + "Container", + style: TextStyle(fontSize: 20), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart new file mode 100644 index 00000000..c67937c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/25 +/// contact me by email 1981462002@qq.com + +class ContainerConstraints extends StatelessWidget { + const ContainerConstraints({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue, + width: 200, + height: 200 * 0.618, + constraints: const BoxConstraints( + minWidth: 100, + maxWidth: 150, + minHeight: 20, + maxHeight: 100, + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json new file mode 100644 index 00000000..65402c8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS-Aktionsblatt", + "info": "Ein iOS-stiliges Popup-Auswahlmenü, das mehrere Schaltflächen enthalten kann und normalerweise mit CupertinoActionSheetAction verwendet wird.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheet", + "desc": [ + "【title】 : Erstes Zeilenelement 【Widget】", + "【message】 : Zweites Zeilenelement 【Widget】", + "【cancelButton】 : Abbrechen-Schaltflächenelement 【Widget】", + "【actions】 : Liste der mittleren Elemente 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json new file mode 100644 index 00000000..26edfc6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS Action Sheet", + "info": "A pop-up selection structure in iOS style that can hold multiple buttons, generally used in conjunction with CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheet", + "desc": [ + "【title】: First row component 【Widget】", + "【message】: Second row component 【Widget】", + "【cancelButton】: Component at the cancel button 【Widget】", + "【actions】: List of middle components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json new file mode 100644 index 00000000..58157eac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Hoja de acciones de iOS", + "info": "Estructura de selección emergente al estilo de iOS, que puede contener múltiples botones, generalmente se usa junto con CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheet", + "desc": [ + "【title】 : Componente de la primera línea 【Widget】", + "【message】 : Componente de la segunda línea 【Widget】", + "【cancelButton】 : Componente del botón de cancelar 【Widget】", + "【actions】 : Lista de componentes intermedios 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json new file mode 100644 index 00000000..049a82aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Feuille d'action iOS", + "info": "Une structure de sélection contextuelle de style iOS, pouvant contenir plusieurs boutons, généralement utilisée avec CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheet", + "desc": [ + "【title】 : Composant de la première ligne 【Widget】", + "【message】 : Composant de la deuxième ligne 【Widget】", + "【cancelButton】 : Composant du bouton d'annulation 【Widget】", + "【actions】 : Liste des composants du milieu 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json new file mode 100644 index 00000000..80b95860 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Foglio di azione iOS", + "info": "Struttura di selezione pop-up in stile iOS, può contenere molti pulsanti, generalmente utilizzato insieme a CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheet", + "desc": [ + "【title】 : Componente della prima riga 【Widget】", + "【message】 : Componente della seconda riga 【Widget】", + "【cancelButton】 : Componente del pulsante di annullamento 【Widget】", + "【actions】 : Lista dei componenti centrali 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json new file mode 100644 index 00000000..79b13d24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOSアクションシート", + "info": "iOSスタイルのポップアップ選択構造で、多くのボタンを配置でき、通常はCupertinoActionSheetActionと併用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetの基本的な使用", + "desc": [ + "【title】 : 最初の行のコンポーネント 【Widget】", + "【message】 : 2行目のコンポーネント 【Widget】", + "【cancelButton】 : キャンセルボタンのコンポーネント 【Widget】", + "【actions】 : 中間のコンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json new file mode 100644 index 00000000..ee43433d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS 행동 시트", + "info": "iOS 스타일의 팝업 선택 구조로, 여러 버튼을 넣을 수 있으며 일반적으로 CupertinoActionSheetAction과 함께 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheet 기본 사용", + "desc": [ + "【title】 : 첫 번째 줄 컴포넌트 【Widget】", + "【message】 : 두 번째 줄 컴포넌트 【Widget】", + "【cancelButton】 : 취소 버튼 컴포넌트 【Widget】", + "【actions】 : 중간 컴포넌트 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json new file mode 100644 index 00000000..8b648e9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Folha de Ação iOS", + "info": "Estrutura de seleção pop-up no estilo iOS, que pode conter vários botões, geralmente usada em conjunto com CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActionSheet", + "desc": [ + "【title】 : Componente da primeira linha 【Widget】", + "【message】 : Componente da segunda linha 【Widget】", + "【cancelButton】 : Componente do botão de cancelamento 【Widget】", + "【actions】 : Lista de componentes do meio 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json new file mode 100644 index 00000000..9c74cbe5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS лист действий", + "info": "Всплывающая структура выбора в стиле iOS, которая может содержать несколько кнопок, обычно используется вместе с CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheet", + "desc": [ + "【title】 : Компонент первой строки 【Widget】", + "【message】 : Компонент второй строки 【Widget】", + "【cancelButton】 : Компонент кнопки отмены 【Widget】", + "【actions】 : Список компонентов в середине 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json new file mode 100644 index 00000000..c716d299 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS行为单", + "info": "iOS风格的弹出选择结构,可放多的按钮,一般与CupertinoActionSheetAction联用。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheet基本使用", + "desc": [ + "【title】 : 第一行组件 【Widget】", + "【message】 : 第二行组件 【Widget】", + "【cancelButton】 : 取消按钮处组件 【Widget】", + "【actions】 : 中间组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart new file mode 100644 index 00000000..e7c1c58f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoActionSheet extends StatelessWidget { + const CustomCupertinoActionSheet({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildRaisedButton(context), + _buildCupertinoActionSheet(context), + ], + ); + } + + Widget _buildCupertinoActionSheet(BuildContext context) => + Container( + alignment: Alignment.bottomCenter, + child: CupertinoActionSheet( + title: const Text("Please chose a language"), + message: const Text('the language you use in this application.'), + cancelButton: CupertinoActionSheetAction( + onPressed: () => Navigator.pop(context), child: const Text("Cancel")), + actions: [ + CupertinoActionSheetAction( + onPressed: () => Navigator.pop(context), + child: const Text('Dart')), + CupertinoActionSheetAction( + onPressed: () => Navigator.pop(context), + child: const Text('Java')), + CupertinoActionSheetAction( + onPressed: () => Navigator.pop(context), + child: const Text('Kotlin')), + ], + ), + ); + + Widget _buildRaisedButton(BuildContext context) => ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () => showDialog( + context: context, + builder: (ctx) => _buildCupertinoActionSheet(context)), + child: const Text( + 'Just Show It !', + style: TextStyle(color: Colors.white), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json new file mode 100644 index 00000000..804e501d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS-Aktionsblatt-Schaltfläche", + "info": "Eine Schaltfläche, die selten verwendet wird und normalerweise in CupertinoActionSheet verwendet wird, um Klickereignisse zu empfangen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheetAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json new file mode 100644 index 00000000..022777a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS Action Sheet Button", + "info": "A button with limited use cases, typically used in CupertinoActionSheet to receive click events.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheetAction", + "desc": [ + "【child】: Child widget 【Widget】", + "【isDefaultAction】: Whether it is the default action 【bool】", + "【onPressed】: Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json new file mode 100644 index 00000000..d5cef1aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Botón de hoja de acción de iOS", + "info": "Un botón con pocos escenarios de aplicación, generalmente utilizado en CupertinoActionSheet, que recibe eventos de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json new file mode 100644 index 00000000..a0f631bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Bouton iOS Action Sheet", + "info": "Un bouton, rarement utilisé, généralement utilisé dans CupertinoActionSheet, qui reçoit les événements de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheetAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce l'action par défaut 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json new file mode 100644 index 00000000..521cf337 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Pulsante iOS Action Sheet", + "info": "Un pulsante, utilizzato raramente, solitamente all'interno di CupertinoActionSheet, che riceve eventi di clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Selezionato per impostazione predefinita 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json new file mode 100644 index 00000000..1637d285 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOSアクションシートボタン", + "info": "ボタンで、使用シーンが少なく、通常はCupertinoActionSheetで使用され、クリックイベントを受け取ります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetActionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json new file mode 100644 index 00000000..07806fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS 액션 시트 버튼", + "info": "버튼으로, 사용되는 경우가 드물며 주로 CupertinoActionSheet에서 사용되며 클릭 이벤트를 수신합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json new file mode 100644 index 00000000..14acf26b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Botão de ação iOS", + "info": "Um botão, usado raramente, normalmente usado em CupertinoActionSheet, que recebe eventos de clique.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Se selecionado por padrão 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json new file mode 100644 index 00000000..67f4b00b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Кнопка iOS Action Sheet", + "info": "Кнопка, которая редко используется, обычно применяется в CupertinoActionSheet, принимает события нажатия.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheetAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано по умолчанию 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json new file mode 100644 index 00000000..1cbe10e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS行为单按键", + "info": "一个按钮,应用场景很少,通常用于CupertinoActionSheet中,接收点击事件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart new file mode 100644 index 00000000..73053e52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:widgets/utils/dialog_about.dart'; + + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomCupertinoActionSheetAction extends StatelessWidget { + const CustomCupertinoActionSheetAction({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + margin: const EdgeInsets.all(5), + color: Colors.grey.withAlpha(33), + child: CupertinoActionSheetAction( + isDefaultAction: true, + onPressed: () => DialogAbout.show(context), + child: const Text('张风捷特烈')), + ), + Container( + color: Colors.grey.withAlpha(33), + margin: const EdgeInsets.all(5), + child: CupertinoActionSheetAction( + isDefaultAction: false, + onPressed: () => DialogAbout.show(context), + child: const Text('百里·巫缨')), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json new file mode 100644 index 00000000..c1f1085a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS-Dialog", + "info": "Ein universelles Dialogfeld im iOS-Stil, das Komponenten für Kopf, Mitte und Ende angeben kann.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheetAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json new file mode 100644 index 00000000..69536a55 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS Dialog", + "info": "A general dialog structure in iOS style, which can specify components at the head, middle, and tail.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheetAction", + "desc": [ + "【child】 : Child component 【Widget】", + "【isDefaultAction】 : Whether it is selected by default 【bool】", + "【onPressed】 : Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json new file mode 100644 index 00000000..5c240104 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Cuadro de diálogo de iOS", + "info": "Estructura de cuadro de diálogo genérico al estilo de iOS, que permite especificar componentes en la parte superior, media e inferior.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json new file mode 100644 index 00000000..db43bdf7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Boîte de dialogue iOS", + "info": "Structure de boîte de dialogue générique de style iOS, permettant de spécifier des composants dans les sections d'en-tête, de corps et de pied.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheetAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce que c'est l'action par défaut 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json new file mode 100644 index 00000000..989b952c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Finestra di dialogo iOS", + "info": "Struttura di dialogo generica in stile iOS, che consente di specificare i componenti nella parte superiore, centrale e inferiore.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Selezionato per impostazione predefinita 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json new file mode 100644 index 00000000..d9c5d2d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOSダイアログ", + "info": "iOSスタイルの汎用ダイアログ構造で、ヘッダー、中央、フッターのコンポーネントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetActionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json new file mode 100644 index 00000000..0b82317c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS 대화 상자", + "info": "iOS 스타일의 일반적인 대화 상자 구조로, 머리, 중간, 꼬리 부분의 컴포넌트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json new file mode 100644 index 00000000..72870d68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Diálogo iOS", + "info": "Estrutura de diálogo genérica no estilo iOS, que permite especificar componentes no cabeçalho, corpo e rodapé.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Selecionado por padrão 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json new file mode 100644 index 00000000..83a1cb23 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Диалоговое окно iOS", + "info": "Универсальная структура диалогового окна в стиле iOS, позволяющая указать компоненты в верхней, средней и нижней частях.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheetAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано ли по умолчанию 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json new file mode 100644 index 00000000..8e576471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS对话框", + "info": "iOS风格的通用的对话框结构,可指定头、中、尾处的组件。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart new file mode 100644 index 00000000..2c4a6fc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart @@ -0,0 +1,94 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomCupertinoAlertDialog extends StatelessWidget { + const CustomCupertinoAlertDialog({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildRaisedButton(context), + _buildCupertinoAlertDialog(context), + ], + ); + } + + Widget _buildRaisedButton(BuildContext context) => + ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () { + showDialog( + context: context, + builder: (ctx) => _buildCupertinoAlertDialog(context)); + }, + child: const Text( + 'Just Show It !', + style: TextStyle(color: Colors.white), + ), + ); + + Widget _buildCupertinoAlertDialog(BuildContext context) { + return Material( + color: Colors.transparent, + child: CupertinoAlertDialog( + title: _buildTitle(context), + content: _buildContent(), + actions: [ + CupertinoButton( + child: const Text("Yes, Delete"), + onPressed: () => Navigator.pop(context), + ), + CupertinoButton( + child: const Text("Cancle"), + onPressed: () => Navigator.pop(context), + ), + ]), + ); + } + + Widget _buildTitle(context) { + return Row( + //标题 + children: [ + const Icon( + CupertinoIcons.delete_solid, + color: Colors.red, + ), + const Expanded( + child: Text( + 'Delete File', + style: TextStyle(color: Colors.red, fontSize: 20), + )), + InkWell( + child: const Icon(CupertinoIcons.clear_thick), + onTap: () => Navigator.pop(context), + ) + ]); + } + + Widget _buildContent() { + return Padding( + padding: const EdgeInsets.only(top: 18.0), + child: Column( + children: const[ + Text( + ' Hi toly! If you push the conform buttom ,' + ' You will lose this file. Are you sure wand to do that?', + style: TextStyle(color: Color(0xff999999), fontSize: 16), + textAlign: TextAlign.justify, + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json new file mode 100644 index 00000000..ec6a6739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Interaktive Ansicht", + "info": "Ein einfacher Button, der normalerweise in CupertinoAlertDialog verwendet wird und im Allgemeinen nicht allein verwendet wird.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Ist es die Standardaktion? 【bool】", + "【isDestructiveAction】 : Ist es eine zerstörerische Aktion? 【bool】", + "【textStyle】: Textstil 【TextStyle】", + "【onPressed】: Klickereignis 【VoidCallback】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json new file mode 100644 index 00000000..9f7bad2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Interactive View", + "info": "A simple button, usually used in CupertinoAlertDialog, and generally not used alone.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: Whether it is a default action 【bool】", + "【isDestructiveAction】: Whether it is a destructive action 【bool】", + "【textStyle】: Text style 【TextStyle】", + "【onPressed】: Click event 【VoidCallback】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json new file mode 100644 index 00000000..26e29ae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista de interacción", + "info": "Un botón simple, generalmente utilizado en CupertinoAlertDialog, generalmente no se usa solo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: ¿Es una acción predeterminada? 【bool】", + "【isDestructiveAction】: ¿Es una acción destructiva? 【bool】", + "【textStyle】: Estilo de texto 【TextStyle】", + "【onPressed】: Evento de clic 【VoidCallback】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json new file mode 100644 index 00000000..d053bb52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vue d'interaction", + "info": "Un bouton simple, généralement utilisé dans CupertinoAlertDialog, généralement pas utilisé seul.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Est-ce une action par défaut 【bool】", + "【isDestructiveAction】 : Est-ce une action destructive 【bool】", + "【textStyle】: Style de texte 【TextStyle】", + "【onPressed】: Événement de clic 【VoidCallback】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json new file mode 100644 index 00000000..aeb2063c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista interattiva", + "info": "Un semplice pulsante, solitamente utilizzato in CupertinoAlertDialog, generalmente non utilizzato da solo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Se è un'operazione predefinita 【bool】", + "【isDestructiveAction】 : Se è un'operazione distruttiva 【bool】", + "【textStyle】: Stile del testo 【TextStyle】", + "【onPressed】: Evento di clic 【VoidCallback】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json new file mode 100644 index 00000000..fe4126ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "インタラクティブビュー", + "info": "シンプルなボタンで、通常はCupertinoAlertDialogで使用され、単独で使用されることはあまりありません。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogActionの基本的な使用", + "desc": [ + "【isDefaultAction】 : デフォルトの操作かどうか 【bool】", + "【isDestructiveAction】 : 破壊的な操作かどうか 【bool】", + "【textStyle】: テキストスタイル 【TextStyle】", + "【onPressed】: クリックイベント 【VoidCallback】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json new file mode 100644 index 00000000..103cd001 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "상호 작용 뷰", + "info": " 간단한 버튼으로, 일반적으로 CupertinoAlertDialog에서 사용되며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogAction 기본 사용", + "desc": [ + "【isDefaultAction】 : 기본 작업인지 여부 【bool】", + "【isDestructiveAction】 : 파괴적인 작업인지 여부 【bool】", + "【textStyle】: 텍스트 스타일 【TextStyle】", + "【onPressed】: 클릭 이벤트 【VoidCallback】", + "【child】: 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json new file mode 100644 index 00000000..51d9d161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista Interativa", + "info": "Um botão simples, geralmente usado em CupertinoAlertDialog, geralmente não é usado sozinho.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Se é uma ação padrão 【bool】", + "【isDestructiveAction】 : Se é uma ação destrutiva 【bool】", + "【textStyle】: Estilo de texto 【TextStyle】", + "【onPressed】: Evento de clique 【VoidCallback】", + "【child】: Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json new file mode 100644 index 00000000..920dca0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Интерактивное представление", + "info": "Простая кнопка, обычно используется в CupertinoAlertDialog, как правило, не используется отдельно.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: Является ли действие по умолчанию 【bool】", + "【isDestructiveAction】: Является ли действие разрушительным 【bool】", + "【textStyle】: Стиль текста 【TextStyle】", + "【onPressed】: Событие нажатия 【VoidCallback】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json new file mode 100644 index 00000000..246eacf3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "交互视图", + "info": " 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogAction基本使用", + "desc": [ + "【isDefaultAction】 : 是否是默认性操作 【bool】", + "【isDestructiveAction】 : 是否是毁灭性操作 【bool】", + "【textStyle】: 文字样式 【TextStyle】", + "【onPressed】: 点击事件 【VoidCallback】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart new file mode 100644 index 00000000..2f6e6c1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart @@ -0,0 +1,37 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class CupertinoDialogActionDemo extends StatelessWidget { + const CupertinoDialogActionDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + CupertinoDialogAction( + isDestructiveAction: false, + onPressed: () => _toast(context), + child: const Text('CupertinoDialogAction'), + ), + CupertinoDialogAction( + isDestructiveAction: true, + onPressed: () => _toast(context), + child: const Text('CupertinoDialogAction'), + ), + ], + ); + } + + void _toast(BuildContext context) { + SnackBar snackBar = SnackBar( + backgroundColor: Theme.of(context).primaryColor, + content: const Text('CupertinoDialogAction'), + ); + + ScaffoldMessenger.of(context).showSnackBar(snackBar); + + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json new file mode 100644 index 00000000..3dcd6104 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Vollbild-Dialog-Übergang", + "info": "Erstellt einen iOS-stilisierten Übergang für das Aufrufen eines Vollbild-Dialogs.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Komponenteneinführung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【linearTransition】 : Lineare Übergang 【bool】", + "【primaryRouteAnimation】 : Anfängliche Routenanimation 【Animation】", + "【secondaryRouteAnimation】 : Zweite Routenanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json new file mode 100644 index 00000000..fd77e830 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Full Page Transition", + "info": "Create an iOS-style transition for invoking a full-screen dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Component Introduction", + "desc": [ + "【child】 : Child component 【Widget】", + "【linearTransition】 : Whether to use linear transition 【bool】", + "【primaryRouteAnimation】 : Initial route animation 【Animation】", + "【secondaryRouteAnimation】 : Secondary route animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json new file mode 100644 index 00000000..9683edf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transición de diálogo de pantalla completa", + "info": "Crea una transición al estilo de iOS para invocar un diálogo de pantalla completa.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción del componente", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【linearTransition】 : ¿Transición lineal? 【bool】", + "【primaryRouteAnimation】 : Animación de ruta inicial 【Animation】", + "【secondaryRouteAnimation】 : Animación de ruta secundaria 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json new file mode 100644 index 00000000..1cb27210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transition de dialogue plein écran", + "info": "Crée une transition de style iOS pour afficher une boîte de dialogue en plein écran.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction du composant", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【linearTransition】 : Transition linéaire 【bool】", + "【primaryRouteAnimation】 : Animation de route initiale 【Animation】", + "【secondaryRouteAnimation】 : Animation de route secondaire 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json new file mode 100644 index 00000000..a0040840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transizione a schermo intero", + "info": "Crea una transizione in stile iOS per richiamare una finestra di dialogo a schermo intero.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione al componente", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【linearTransition】 : Transizione lineare 【bool】", + "【primaryRouteAnimation】 : Animazione della rotta iniziale 【Animation】", + "【secondaryRouteAnimation】 : Animazione della seconda rotta 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json new file mode 100644 index 00000000..e74986fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "全ページ遷移変換", + "info": "iOSスタイルの全画面ダイアログを呼び出すための遷移を作成します。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "コンポーネント紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【linearTransition】 : 線形変換かどうか 【bool】", + "【primaryRouteAnimation】 : 初期ルートアニメーション 【Animation】", + "【secondaryRouteAnimation】 : 第二ルートアニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json new file mode 100644 index 00000000..becc2777 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "전체 페이지 전환", + "info": "전체 화면 대화 상자를 불러오기 위한 iOS 스타일의 전환을 생성합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "컴포넌트 소개", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【linearTransition】 : 선형 전환 여부 【bool】", + "【primaryRouteAnimation】 : 초기 라우트 애니메이션 【Animation】", + "【secondaryRouteAnimation】 : 두 번째 라우트 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json new file mode 100644 index 00000000..9d275362 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transição de Diálogo em Tela Cheia", + "info": "Cria uma transição no estilo iOS para exibir um diálogo em tela cheia.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao Componente", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【linearTransition】 : Transição linear 【bool】", + "【primaryRouteAnimation】 : Animação de rota inicial 【Animation】", + "【secondaryRouteAnimation】 : Animação de rota secundária 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json new file mode 100644 index 00000000..3d0cd07e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Переход на полный экран", + "info": "Создает переход в стиле iOS для вызова диалогового окна на весь экран.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в компонент", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【linearTransition】 : Линейный переход 【bool】", + "【primaryRouteAnimation】 : Анимация начального маршрута 【Animation】", + "【secondaryRouteAnimation】 : Анимация второго маршрута 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json new file mode 100644 index 00000000..ab421eed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "全页面过渡变换", + "info": "创建一个 iOS 风格的转换,用于唤出全屏对话框。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "组件介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "【linearTransition】 : 是否线性转换 【bool】", + "【primaryRouteAnimation】 : 初始路由动画 【Animation】", + "【secondaryRouteAnimation】 : 第二路由动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart new file mode 100644 index 00000000..94a27961 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/11 +/// contact me by email 1981462002@qq.com +/// + + +class CupertinoFullscreenDialogTransitionDemo extends StatelessWidget { + const CupertinoFullscreenDialogTransitionDemo({Key? key}) : super(key: key); + + final String info = + '和 CupertinoPageTransition 一样,该组件底层基于 SlideTransition 组件实现,' + '主要用途是模仿 iOS 风格,用于唤出全屏对话框动画过渡效果。' + '源码中唯一的使用处是 CupertinoPageRoute 处理路由跳转动画时,一般不会单独使用。' + '当【route.fullscreenDialog】为 true 时,会使用 CupertinoFullscreenDialogTransition 组件,否则使用 CupertinoPageTransition 组件。' + '其中个属性信息和 CupertinoPageTransition 组件一致,详见之。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json new file mode 100644 index 00000000..341bea2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS-Stil Zurück-Button", + "info": "Cupertino-Stil Navigationsleiste Zurück-Button, kann Farbe und Klick-Ereignis angeben, wird normalerweise nicht allein verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Zurück-Buttons", + "desc": [ + "【onPressed】 : Klick-Ereignis 【VoidCallback】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json new file mode 100644 index 00000000..2c195438 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS Style Back Button", + "info": "A Cupertino-style navigation bar back button, which can specify color and click events, and is generally not used alone.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Back Button", + "desc": [ + "【onPressed】: Click event 【VoidCallback】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json new file mode 100644 index 00000000..4c7ecd85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Botón de retroceso de estilo iOS", + "info": "Botón de retroceso de la barra de navegación de estilo Cupertino, se puede especificar el color y el evento de clic, generalmente no se usa solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del botón de retroceso", + "desc": [ + "【onPressed】 : Evento de clic 【VoidCallback】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json new file mode 100644 index 00000000..e43bfcc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Bouton de retour de style iOS", + "info": "Bouton de retour de barre de navigation de style Cupertino, peut spécifier la couleur et l'événement de clic, généralement pas utilisé seul.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du bouton de retour", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json new file mode 100644 index 00000000..5e70e8c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Pulsante Indietro in stile iOS", + "info": "Pulsante Indietro per barra di navigazione in stile Cupertino, può specificare colore ed evento di clic, generalmente non utilizzato da solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base del pulsante Indietro", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json new file mode 100644 index 00000000..490051d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOSスタイルの戻るボタン", + "info": "Cupertinoスタイルのナビゲーションバーの戻るボタンで、色とクリックイベントを指定できます。通常は単独で使用されません。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "戻るボタンの基本的な使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json new file mode 100644 index 00000000..b96301a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS 스타일 뒤로 가기 버튼", + "info": "Cupertino 스타일의 네비게이션 바 뒤로 가기 버튼, 색상과 클릭 이벤트를 지정할 수 있으며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "뒤로 가기 버튼 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json new file mode 100644 index 00000000..4b820f15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Botão de Voltar no Estilo iOS", + "info": "Botão de voltar da barra de navegação no estilo Cupertino, pode especificar a cor e o evento de clique, geralmente não é usado sozinho.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Botão de Voltar", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json new file mode 100644 index 00000000..fbf25410 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Кнопка возврата в стиле iOS", + "info": "Кнопка возврата в стиле Cupertino для навигационной панели, можно указать цвет и событие нажатия, обычно не используется отдельно.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование кнопки возврата", + "desc": [ + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json new file mode 100644 index 00000000..0312f63e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS风格返回按钮", + "info": "Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "返回按钮基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart new file mode 100644 index 00000000..e9ae28f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart @@ -0,0 +1,18 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class CupertinoNavigationBarBackButtonDemo extends StatelessWidget { + const CupertinoNavigationBarBackButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoNavigationBarBackButton( + color: Colors.deepPurpleAccent, + onPressed: () => Navigator.of(context).pop(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json new file mode 100644 index 00000000..e4153eef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Seitenübergangsanimation", + "info": "Bietet eine iOS-ähnliche Seitenübergangsanimation.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in CupertinoPageTransition", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【linearTransition】 : Lineare Transformation 【bool】", + "【primaryRouteAnimation】 : Anfängliche Routenanimation 【Animation】", + "【secondaryRouteAnimation】 : Zweite Routenanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json new file mode 100644 index 00000000..fc18cdc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Page Transition Animation", + "info": "Provides an iOS-style page transition animation.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to CupertinoPageTransition", + "desc": [ + "【child】 : Child widget 【Widget】", + "【linearTransition】 : Whether to use linear transition 【bool】", + "【primaryRouteAnimation】 : Primary route animation 【Animation】", + "【secondaryRouteAnimation】 : Secondary route animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json new file mode 100644 index 00000000..f1709460 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transición de página", + "info": "Proporciona una animación de transición de página al estilo de iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a CupertinoPageTransition", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【linearTransition】 : ¿Transición lineal? 【bool】", + "【primaryRouteAnimation】 : Animación de ruta inicial 【Animation】", + "【secondaryRouteAnimation】 : Animación de ruta secundaria 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json new file mode 100644 index 00000000..fb75a3d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transition de page", + "info": "Fournit une animation de transition de page de style iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à CupertinoPageTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【linearTransition】 : Transition linéaire 【bool】", + "【primaryRouteAnimation】 : Animation de route initiale 【Animation】", + "【secondaryRouteAnimation】 : Animation de route secondaire 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json new file mode 100644 index 00000000..fb35028b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transizione di pagina", + "info": "Fornisce un'animazione di transizione di pagina in stile iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a CupertinoPageTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【linearTransition】 : Transizione lineare 【bool】", + "【primaryRouteAnimation】 : Animazione della rotta iniziale 【Animation】", + "【secondaryRouteAnimation】 : Animazione della seconda rotta 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json new file mode 100644 index 00000000..0c5ec262 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "ページ遷移変換", + "info": "iOSスタイルのページ遷移アニメーション変換を提供します。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【linearTransition】 : 線形変換かどうか 【bool】", + "【primaryRouteAnimation】 : 初期ルートアニメーション 【Animation】", + "【secondaryRouteAnimation】 : 第二ルートアニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json new file mode 100644 index 00000000..fd8ae1e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "페이지 전환 효과", + "info": "iOS 스타일의 페이지 전환 애니메이션 효과를 제공합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【linearTransition】 : 선형 변환 여부 【bool】", + "【primaryRouteAnimation】 : 초기 라우트 애니메이션 【Animation】", + "【secondaryRouteAnimation】 : 두 번째 라우트 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json new file mode 100644 index 00000000..bcd91b93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transição de Página", + "info": "Fornece uma animação de transição de página no estilo iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução à CupertinoPageTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【linearTransition】 : Transição linear 【bool】", + "【primaryRouteAnimation】 : Animação de rota inicial 【Animation】", + "【secondaryRouteAnimation】 : Animação de segunda rota 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json new file mode 100644 index 00000000..f4ec7454 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Переход страницы", + "info": "Предоставляет анимацию перехода страницы в стиле iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в CupertinoPageTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【linearTransition】 : Линейное преобразование 【bool】", + "【primaryRouteAnimation】 : Начальная анимация маршрута 【Animation】", + "【secondaryRouteAnimation】 : Вторичная анимация маршрута 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json new file mode 100644 index 00000000..c2fbb0a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "页面过渡变换", + "info": "提供一个 iOS 风格的页面过渡动画变换。 ", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "【linearTransition】 : 是否线性转换 【bool】", + "【primaryRouteAnimation】 : 初始路由动画 【Animation】", + "【secondaryRouteAnimation】 : 第二路由动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart new file mode 100644 index 00000000..d3b9c9ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/11 +/// contact me by email 1981462002@qq.com +/// + +class CupertinoPageTransitionDemo extends StatelessWidget { + const CupertinoPageTransitionDemo({Key? key}) : super(key: key); + + final String info = + '该组件底层基于 SlideTransition 组件实现,主要用途是模仿 iOS 风格,处理页面间跳转的过渡动画。' + '源码中唯一的使用处是 CupertinoPageRoute 处理路由跳转动画时,一般不会单独使用。' + '如 A 跳转到 B, primaryRouteAnimation 和 secondaryRouteAnimation 都是一个 0.0->1.0 的动画,' + '前者用于处理 B 界面进入过渡动画;后者用于处理 A 界面被覆盖的过渡动画。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json new file mode 100644 index 00000000..46dd442c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Verschwommene Popup-Ebene", + "info": "Runde, rechteckige, verschwommene Hintergründe für iOS-Popups, die in Cupertino-stilisierten Dialogen verwendet werden.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface Verwendung", + "desc": [ + "【isSurfacePainted】 : Ob Weiß gemalt wird 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】", + "Testeffekt links isSurfacePainted = false, rechts isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json new file mode 100644 index 00000000..44cc5017 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Blur Popup Layer", + "info": "The rounded rectangle blur background of the ios popup box, applied in the source code to the dialog box of the Cupertino style.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface Usage", + "desc": [ + "【isSurfacePainted】: Whether to paint white 【bool】", + "【child】: Child component 【Widget】", + "Test effect: left isSurfacePainted = false, right isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json new file mode 100644 index 00000000..ca8be8bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Capa emergente difuminada", + "info": "Fondo difuminado rectangular con bordes redondeados para cuadros emergentes de iOS, utilizado en diálogos de estilo Cupertino en el código fuente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Si se pinta en blanco 【bool】", + "【child】 : Componente hijo 【Widget】", + "Efecto de prueba: izquierda isSurfacePainted = false, derecha isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json new file mode 100644 index 00000000..8b78d066 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Fond flou de la fenêtre contextuelle", + "info": "Fond flou rectangulaire avec coins arrondis pour les boîtes de dialogue de style Cupertino, utilisé dans les dialogues de style Cupertino dans le code source.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Si le blanc est dessiné 【bool】", + "【child】 : Composant enfant 【Widget】", + "Effet de test : isSurfacePainted = false à gauche, isSurfacePainted = true à droite" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json new file mode 100644 index 00000000..11108416 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Livello popup sfocato", + "info": "Sfondo sfocato rettangolare con angoli arrotondati per le finestre popup iOS, utilizzato nei dialoghi in stile Cupertino nel codice sorgente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Se disegnare in bianco 【bool】", + "【child】 : Componente figlio 【Widget】", + "Testare l'effetto: a sinistra isSurfacePainted = false, a destra isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json new file mode 100644 index 00000000..8119b53f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "ぼかしポップアップレイヤー", + "info": "iOSポップアップボックスの角丸長方形のぼかし背景で、ソースコードではCupertinoスタイルのダイアログに適用されています。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface の使用", + "desc": [ + "【isSurfacePainted】 : 白を描画するかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】", + "テスト効果の左側は isSurfacePainted = false、右側は isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json new file mode 100644 index 00000000..33c52196 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "블러 팝업 레이어", + "info": "ios 팝업 상자의 둥근 모서리 사각형 블러 배경, 소스 코드에서 Cupertino 스타일의 대화 상자에 적용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface 사용", + "desc": [ + "【isSurfacePainted】 : 흰색으로 그릴지 여부 【bool】", + "【child】 : 하위 위젯 【Widget】", + "테스트 효과 왼쪽 isSurfacePainted = false, 오른쪽 isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json new file mode 100644 index 00000000..c1856d16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Camada de Pop-up Desfocada", + "info": "Fundo desfocado retangular com cantos arredondados para caixas de diálogo no estilo iOS, usado em caixas de diálogo de estilo Cupertino no código-fonte.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Se a superfície é pintada de branco 【bool】", + "【child】 : Componente filho 【Widget】", + "Efeito de teste: à esquerda isSurfacePainted = false, à direita isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json new file mode 100644 index 00000000..c9279fbb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Размытый всплывающий слой", + "info": "Фон с закругленными углами и размытием для всплывающего окна iOS, используется в диалогах в стиле Cupertino в исходном коде.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Рисовать ли белый цвет 【bool】", + "【child】 : Дочерний компонент 【Widget】", + "Тестовый эффект: слева isSurfacePainted = false, справа isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json new file mode 100644 index 00000000..10e0dc73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "模糊弹出层", + "info": "ios 弹出框的圆角矩形模糊背景,源码中应用于 Cupertino 风格的对话框中。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface 使用", + "desc": [ + "【isSurfacePainted】 : 是否绘白 【bool】", + "【child】 : 子组件 【Widget】", + "测试效果左侧 isSurfacePainted = false,右侧 isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart new file mode 100644 index 00000000..b755874d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart @@ -0,0 +1,54 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class CupertinoPopupSurfaceDemo extends StatelessWidget { + const CupertinoPopupSurfaceDemo({super.key}); + + List get rainbow => [ + 0xffff0000, + 0xffFF7F00, + 0xffFFFF00, + 0xff00FF00, + 0xff00FFFF, + 0xff0000FF, + 0xff8B00FF + ]; + + List get stops => [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; + + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + gradient: RadialGradient( + radius: 1.8, + stops: stops, + colors: rainbow.map((e) => Color(e)).toList())), + padding: const EdgeInsets.all(10), + child: Wrap( + spacing: 10, + children: [ + buildCupertinoPopupSurface(false), + buildCupertinoPopupSurface(true), + ], + ), + ); + } + + Widget buildCupertinoPopupSurface(bool isSurfacePainted) { + return CupertinoPopupSurface( + isSurfacePainted: isSurfacePainted, + child: Container( + width: 150, + height: 100, + color: Colors.white.withOpacity(0.3), + alignment: Alignment.center, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json new file mode 100644 index 00000000..89d27cd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS-Thema", + "info": "Das CupertinoThemeData-Objekt kann über CupertinoTheme.of abgerufen werden. Es kann auch ein Thema angegeben werden, das auf die Nachkommenkomponenten von CupertinoTheme angewendet wird.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Textstil-TextTheme", + "desc": [ + "Nachkommenkomponenten können die Daten des Themas über CupertinoTheme.of abrufen und verwenden." + ] + }, + { + "file": "node2_use.dart", + "name": "Verwendung von CupertinoThemeData", + "desc": [ + "Wie bei Theme können bestimmte Attribute angegeben werden, damit sie in den Nachkommen gemeinsam genutzt werden, allerdings gibt es weniger Attribute. Beachten Sie, dass Sie das Thema nicht im aktuellen Kontext abrufen können, wenn Sie es verwenden möchten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json new file mode 100644 index 00000000..4cff035c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS Theme", + "info": "You can obtain the CupertinoThemeData object through CupertinoTheme.of. You can also specify the theme to be applied to the descendant components of CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Text Style-TextTheme", + "desc": [ + "Descendant components can obtain and use the theme data through CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Usage of CupertinoThemeData", + "desc": [ + "Like Theme, you can share specified properties among descendants, but there are fewer properties. Note that if you need to use the theme, you cannot obtain it in the current context." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json new file mode 100644 index 00000000..59b37c1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema de iOS", + "info": "Puedes obtener el objeto CupertinoThemeData a través de CupertinoTheme.of. También puedes especificar que el tema se aplique a los componentes descendientes de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-TextTheme", + "desc": [ + "Los componentes descendientes pueden obtener y utilizar los datos del tema a través de CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de CupertinoThemeData", + "desc": [ + "Al igual que con Theme, puedes compartir ciertos atributos en los descendientes, aunque hay menos atributos. Ten en cuenta que si necesitas usar el tema, no puedes obtenerlo en el contexto actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json new file mode 100644 index 00000000..db0b5859 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Thème iOS", + "info": "Vous pouvez obtenir l'objet CupertinoThemeData via CupertinoTheme.of. Vous pouvez également spécifier un thème à appliquer aux composants descendants de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Style de texte-TextTheme", + "desc": [ + "Les composants descendants peuvent utiliser les données du thème obtenues via CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Utilisation de CupertinoThemeData", + "desc": [ + "Comme avec Theme, vous pouvez partager des attributs spécifiés avec les descendants, bien qu'il y ait moins d'attributs. Notez que si vous avez besoin d'utiliser le thème, vous ne pouvez pas l'obtenir dans le contexte actuel." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json new file mode 100644 index 00000000..34539eaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema iOS", + "info": "È possibile ottenere l'oggetto CupertinoThemeData tramite CupertinoTheme.of. È anche possibile specificare un tema da applicare ai componenti discendenti di CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stile di testo-TextTheme", + "desc": [ + "I componenti discendenti possono ottenere e utilizzare i dati del tema tramite CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso di CupertinoThemeData", + "desc": [ + "Come con Theme, è possibile condividere attributi specifici tra i discendenti, anche se gli attributi sono meno numerosi. Nota: se è necessario utilizzare un tema, non è possibile ottenerlo nel contesto corrente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json new file mode 100644 index 00000000..2529887f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOSテーマ", + "info": "CupertinoTheme.ofを使用してCupertinoThemeDataオブジェクトを取得できます。また、テーマを指定してCupertinoThemeの子孫コンポーネントに適用することもできます。", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テキストスタイル-TextTheme", + "desc": [ + "子孫コンポーネントはCupertinoTheme.ofを使用してテーマのデータを取得して使用できます。" + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeDataの使用", + "desc": [ + "Themeと同様に、指定されたプロパティを使用して子孫で共有できますが、プロパティは少ないです。テーマを使用する必要がある場合、現在のcontextで取得できないことに注意してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json new file mode 100644 index 00000000..3e11e840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS 테마", + "info": "CupertinoTheme.of를 통해 CupertinoThemeData 객체를 가져올 수 있습니다. 또한 테마를 지정하여 CupertinoTheme의 하위 구성 요소에 적용할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "텍스트 스타일-TextTheme", + "desc": [ + "하위 구성 요소는 CupertinoTheme.of를 통해 테마 데이터를 가져와 사용할 수 있습니다." + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeData 사용", + "desc": [ + "Theme와 마찬가지로 지정된 속성을 통해 하위 구성 요소에서 공유할 수 있지만 속성이 적습니다. 테마를 사용해야 하는 경우 현재 context에서 가져올 수 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json new file mode 100644 index 00000000..e8078335 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema iOS", + "info": "Pode obter o objeto CupertinoThemeData através de CupertinoTheme.of. Também pode especificar o tema para ser aplicado aos componentes descendentes de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-TextTheme", + "desc": [ + "Os componentes descendentes podem obter os dados do tema através de CupertinoTheme.of para uso." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de CupertinoThemeData", + "desc": [ + "Assim como o Theme, pode compartilhar atributos especificados entre os descendentes, embora os atributos sejam menos. Note que, se precisar usar o tema, não pode obtê-lo no contexto atual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json new file mode 100644 index 00000000..4cd4e908 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS тема", + "info": "Можно получить объект CupertinoThemeData через CupertinoTheme.of. Также можно указать тему для применения к дочерним компонентам CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Стиль текста-TextTheme", + "desc": [ + "Дочерние компоненты могут использовать данные темы, полученные через CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Использование CupertinoThemeData", + "desc": [ + "Как и в случае с Theme, можно указать свойства, чтобы они были общими для дочерних элементов, но их меньше. Обратите внимание, что если нужно использовать тему, её нельзя получить в текущем контексте." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json new file mode 100644 index 00000000..91756245 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS主题", + "info": "可通过CupertinoTheme.of获取CupertinoThemeData对象。也可以指定主题应用于CupertinoTheme的后代组件。", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "文字样式-TextTheme", + "desc": [ + "后代组件可以通过CupertinoTheme.of获取主题的数据进行使用。" + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeData的使用", + "desc": [ + "和Theme一样可以通过指定的属性,让它们在后代中共享,不过属性较少。注意如果需要使用主题,不能在当前的context中获取。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart new file mode 100644 index 00000000..64ccfd50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextCupertinoTheme extends StatelessWidget { + const TextCupertinoTheme({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + CupertinoTextThemeData queryData = CupertinoTheme.of(context).textTheme; + Map styles = { + "tabLabelTextStyle: ": queryData.tabLabelTextStyle, + "actionTextStyle: ": queryData.actionTextStyle, + "navActionTextStyle: ": queryData.navActionTextStyle, + "textStyle: ": queryData.textStyle, + "navTitleTextStyle: ": queryData.navTitleTextStyle, + "pickerTextStyle: ": queryData.pickerTextStyle, + "dateTimePickerTextStyle: ": queryData.dateTimePickerTextStyle, + "navLargeTitleTextStyle: ": queryData.navLargeTitleTextStyle, + }; + TextStyle style = + const TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + return Column( + children: + styles.keys.map((e) => buildItem(e, style, styles[e]!)).toList(), + ); + } + + Widget buildItem(String label, TextStyle labelStyle, TextStyle style) => + Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, style: labelStyle), + Text("@toly", style: style) + ], + ), + ), + const Divider(height: 1) + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart new file mode 100644 index 00000000..61cad7ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart @@ -0,0 +1,42 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + + +class CustomCupertinoTheme extends StatelessWidget { + const CustomCupertinoTheme({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const CupertinoTheme( + data: CupertinoThemeData( + primaryColor: Colors.blue, primaryContrastingColor: Colors.green), + child: _ChildUseTheme()); + } +} + +class _ChildUseTheme extends StatelessWidget { + const _ChildUseTheme({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Container( + width: 50, + height: 50, + color: CupertinoTheme.of(context).primaryContrastingColor, + ), + SizedBox(width: 150, child: Slider(value: 0.8, onChanged: (v) => {})), + SizedBox( + width: 150, + child: Divider( + color: CupertinoTheme.of(context).primaryContrastingColor, + thickness: 1, + )) + ]); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json new file mode 100644 index 00000000..436313dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Datentabelle", + "info": "Eine Tabellenkomponente, die Logik für Klicken, Ändern, Sortieren usw. festlegen kann.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DataTable", + "desc": [ + "【columns】 : Spalten 【List】", + "【rows】 : Zeilen 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Sortierung von DataTable", + "desc": [ + "【sortColumnIndex】 : Spaltennummer 【int】", + "【columnSpacing】 : Spaltenabstand 【double】", + "【sortAscending】 : Aufsteigend sortieren 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json new file mode 100644 index 00000000..9178f352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Data Table", + "info": "A table component that can be customized with logic for clicking, editing, sorting, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DataTable", + "desc": [ + "【columns】 : columns 【List】", + "【rows】 : rows 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Sorting in DataTable", + "desc": [ + "【sortColumnIndex】 : column index 【int】", + "【columnSpacing】 : column spacing 【double】", + "【sortAscending】 : ascending order 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json new file mode 100644 index 00000000..16ed9cd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabla de datos", + "info": "Un componente de tabla que permite realizar operaciones como hacer clic, modificar, ordenar, etc., con lógica personalizada.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DataTable", + "desc": [ + "【columns】 : columnas 【List】", + "【rows】 : filas 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordenación de DataTable", + "desc": [ + "【sortColumnIndex】 : índice de columna 【int】", + "【columnSpacing】 : espaciado de columnas 【double】", + "【sortAscending】 : orden ascendente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json new file mode 100644 index 00000000..76f390ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tableau de données", + "info": "Un composant de tableau qui permet de cliquer, modifier, trier, etc. en fonction de la logique définie.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DataTable", + "desc": [ + "【columns】 : colonnes 【List】", + "【rows】 : lignes 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Tri de DataTable", + "desc": [ + "【sortColumnIndex】 : numéro de colonne 【int】", + "【columnSpacing】 : espacement des colonnes 【double】", + "【sortAscending】 : ordre ascendant 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json new file mode 100644 index 00000000..b8cf7229 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabella dati", + "info": "Un componente tabella che può essere personalizzato con logiche per clic, modifiche, ordinamento e altre operazioni.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DataTable", + "desc": [ + "【columns】 : colonne 【List】", + "【rows】 : righe 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordinamento di DataTable", + "desc": [ + "【sortColumnIndex】 : indice della colonna 【int】", + "【columnSpacing】 : spaziatura tra le colonne 【double】", + "【sortAscending】 : ordine crescente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json new file mode 100644 index 00000000..4b3a32dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "データテーブル", + "info": "テーブルコンポーネントで、クリック、編集、ソートなどの操作を論理的に設定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTableの基本使用", + "desc": [ + "【columns】 : 列 【List】", + "【rows】 : 行 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTableのsort", + "desc": [ + "【sortColumnIndex】 : 列番号 【int】", + "【columnSpacing】 : 列間隔 【double】", + "【sortAscending】 : 順序かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json new file mode 100644 index 00000000..dfd1ec90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "데이터 테이블", + "info": "테이블 컴포넌트로, 클릭, 수정, 정렬 등의 작업을 위한 로직을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTable 기본 사용", + "desc": [ + "【columns】 : 열 【List】", + "【rows】 : 행 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTable의 정렬", + "desc": [ + "【sortColumnIndex】 : 열 번호 【int】", + "【columnSpacing】 : 열 간격 【double】", + "【sortAscending】 : 순서 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json new file mode 100644 index 00000000..3ab4fccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabela de Dados", + "info": "Um componente de tabela que pode definir lógicas para cliques, modificações, ordenação e outras operações.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DataTable", + "desc": [ + "【columns】 : Colunas 【List】", + "【rows】 : Linhas 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordenação do DataTable", + "desc": [ + "【sortColumnIndex】 : Índice da Coluna 【int】", + "【columnSpacing】 : Espaçamento entre Colunas 【double】", + "【sortAscending】 : Ordem Ascendente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json new file mode 100644 index 00000000..49b4af78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Таблица данных", + "info": "Компонент таблицы, который позволяет настраивать логику для кликов, редактирования, сортировки и других операций.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DataTable", + "desc": [ + "【columns】 : Столбцы 【List】", + "【rows】 : Строки 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Сортировка DataTable", + "desc": [ + "【sortColumnIndex】 : Номер столбца 【int】", + "【columnSpacing】 : Расстояние между столбцами 【double】", + "【sortAscending】 : По возрастанию 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json new file mode 100644 index 00000000..be8ceb7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "数据表格", + "info": "一个表格组件,可以制订逻辑进行点击、修改、排序等操作。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTable基本使用", + "desc": [ + "【columns】 : 列 【List】", + "【rows】 : 行 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTable的sort", + "desc": [ + "【sortColumnIndex】 : 列号 【int】", + "【columnSpacing】 : 列间距 【double】", + "【sortAscending】 : 是否顺序 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart new file mode 100644 index 00000000..9ead9206 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-21 +/// contact me by email 1981462002@qq.com + + +class _Bean { + final int id; + final String name; + final String type; + + _Bean(this.id, this.name, this.type); +} + +class CustomDataTable extends StatelessWidget { + const CustomDataTable({super.key}); + + List<_Bean> get data => [ + _Bean(101, 'DataTable', 'StatelessWidget'), + _Bean(44, 'RangeSlider', 'StatefulWidget'), + _Bean(2, 'Text', 'StatelessWidget'), + _Bean(1, 'Image', 'StatefulWidget'), + ]; + List get columns => ['id', '名称', '类型']; + + @override + Widget build(BuildContext context) { + return DataTable( + columns: columns + .map((String title) => DataColumn(label: Text(title))) + .toList(), + rows: data + .map((_Bean bean) => DataRow(cells: [ + DataCell(Text('${bean.id}')), + DataCell(Text(bean.name)), + DataCell(Text(bean.type)), + ])) + .toList()); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/DataTable/node2_operation.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart similarity index 89% rename from packages/widgets/lib/StatelessWidget/DataTable/node2_operation.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart index b9fa4944..5895e621 100644 --- a/packages/widgets/lib/StatelessWidget/DataTable/node2_operation.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart @@ -2,17 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 102, -// "name": 'DataTable的sort', -// "priority": 2, -// "subtitle": -// "【sortColumnIndex】 : 列号 【int】\n" -// "【columnSpacing】 : 列间距 【double】\n" -// "【sortAscending】 : 是否顺序 【bool】", -// } import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json new file mode 100644 index 00000000..8c78b48c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Datumsauswahl", + "info": "Komponente zur Auswahl von Datumsangaben, die das aktuelle Datum, das ausgewählte Datum, den angezeigten Monat usw. festlegen kann und Datumsauswahlereignisse empfängt.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DayPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【currentDate】 : Aktuelles Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【displayedMonth】 : Aktuell angezeigter Monat 【DateTime】", + "【onChanged】 : Klick-Rückruf 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker Datumsauswahl ist mit Flutter3.0 ausgelaufen. Der Ersatz ist der CalendarDatePicker Kalenderauswahl.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json new file mode 100644 index 00000000..3e27118a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Date Picker", + "info": "A component for selecting dates, which can specify the current date, selected date, displayed month, etc., and receives date selection events.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DayPicker", + "desc": [ + "【selectedDate】 : Selected date 【DateTime】", + "【currentDate】 : Current date 【DateTime】", + "【firstDate】 : Earliest date limit 【DateTime】", + "【lastDate】 : Latest date limit 【DateTime】", + "【displayedMonth】 : Currently displayed month 【DateTime】", + "【onChanged】 : Click callback 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker date picker has exited the stage of history in Flutter 3.0. It is replaced by the CalendarDatePicker calendar picker.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json new file mode 100644 index 00000000..5ff44e94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Selector de Fecha", + "info": "Componente de selección de fecha, puede especificar la fecha actual, la fecha seleccionada, el mes mostrado, etc., y recibe eventos de selección de fecha.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DayPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【currentDate】 : Fecha actual 【DateTime】", + "【firstDate】 : Límite de la fecha más temprana 【DateTime】", + "【lastDate】 : Límite de la fecha más tardía 【DateTime】", + "【displayedMonth】 : Mes actualmente mostrado 【DateTime】", + "【onChanged】 : Retroalimentación al hacer clic 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, el selector de fecha, dejó de usarse en Flutter 3.0. Su reemplazo es CalendarDatePicker, el selector de calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json new file mode 100644 index 00000000..83f9d199 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Sélecteur de date", + "info": "Composant de sélection de date, permet de spécifier la date actuelle, la date sélectionnée, le mois affiché, etc., et reçoit les événements de sélection de date.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DayPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【currentDate】 : Date actuelle 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【displayedMonth】 : Mois actuellement affiché 【DateTime】", + "【onChanged】 : Rappel de clic 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le sélecteur de date DayPicker a quitté la scène historique avec Flutter 3.0. Il est remplacé par le sélecteur de calendrier CalendarDatePicker.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json new file mode 100644 index 00000000..f757f8ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Selettore di data", + "info": "Componente per la selezione della data, consente di specificare la data corrente, la data selezionata, il mese visualizzato, ecc., e riceve l'evento di selezione della data.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DayPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【currentDate】 : Data corrente 【DateTime】", + "【firstDate】 : Limite della data più antica 【DateTime】", + "【lastDate】 : Limite della data più recente 【DateTime】", + "【displayedMonth】 : Mese attualmente visualizzato 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, il selettore di date, è stato ritirato da Flutter 3.0. Il suo sostituto è CalendarDatePicker, il selettore di calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json new file mode 100644 index 00000000..d6b67801 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "日付ピッカー", + "info": "日付を選択するコンポーネントで、現在の日付、選択された日付、表示する月などを指定できます。日付が選択されたイベントを受け取ります。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPickerの基本的な使用法", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【currentDate】 : 現在の日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【displayedMonth】 : 現在表示されている月 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 日付ピッカーは Flutter3.0 で歴史の舞台から退場しました。代替として CalendarDatePicker カレンダーピッカーがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json new file mode 100644 index 00000000..addf834e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "날짜 선택기", + "info": "날짜 선택 컴포넌트로, 현재 날짜, 선택된 날짜, 표시할 월 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPicker 기본 사용", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【currentDate】 : 현재 날짜 【DateTime】", + "【firstDate】 : 가장 이른 날짜 제한 【DateTime】", + "【lastDate】 : 가장 늦은 날짜 제한 【DateTime】", + "【displayedMonth】 : 현재 표시되는 월 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 날짜 선택기는 Flutter3.0에서 역사의 뒤안길로 사라졌습니다. 이를 대체하는 것은 CalendarDatePicker 캘린더 선택기입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json new file mode 100644 index 00000000..26c93566 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Seletor de Data", + "info": "Componente de seleção de data, pode especificar a data atual, a data selecionada, o mês exibido, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DayPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【currentDate】 : Data atual 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【displayedMonth】 : Mês atualmente exibido 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'O DayPicker, o seletor de data, saiu de cena no Flutter 3.0. O substituto é o CalendarDatePicker, o seletor de calendário.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json new file mode 100644 index 00000000..d0b916f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Выбор даты", + "info": "Компонент для выбора даты, который позволяет указать текущую дату, выбранную дату, отображаемый месяц и т.д., а также получать события выбора даты.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DayPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【currentDate】 : Текущая дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【displayedMonth】 : Отображаемый месяц 【DateTime】", + "【onChanged】 : Обратный вызов при клике 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, компонент выбора даты, ушел в историю с выходом Flutter 3.0. Его заменил CalendarDatePicker, компонент выбора даты из календаря.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json new file mode 100644 index 00000000..be05cf4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "日期选择器", + "info": "日期的选择组件,可指定当前日期、选中日期、展示月份等,接收日期选中事件。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【currentDate】 : 当前日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【displayedMonth】 : 当前展示的月份 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 日期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart new file mode 100644 index 00000000..9938f603 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart @@ -0,0 +1,24 @@ + + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomDayPicker extends StatelessWidget { + + const CustomDayPicker({Key? key}) : super(key: key); + + final String info = + 'DayPicker 日期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json new file mode 100644 index 00000000..b27282e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Dialogfeld", + "info": "Das einfachste Dialogfeld-Panel, das eine Inhaltskomponente enthält und Eigenschaften wie Schattentiefe, Hintergrundfarbe, Form usw. angeben kann.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Dialogs", + "desc": [ + "【child】: Animationssymboldaten 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json new file mode 100644 index 00000000..97d42177 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Dialog Box", + "info": "The simplest dialog panel, containing a content component, with properties such as shadow depth, background color, shape, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Dialog", + "desc": [ + "【child】: Animation icon data 【Widget】", + "【elevation】: Shadow depth 【double】", + "【backgroundColor】: Background color 【Color】", + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json new file mode 100644 index 00000000..f3ca155d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Cuadro de diálogo", + "info": "El panel de cuadro de diálogo más simple, que incluye un componente de contenido, puede especificar propiedades como la profundidad de la sombra, el color de fondo, la forma, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Dialog", + "desc": [ + "【child】 : Datos del ícono de animación 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json new file mode 100644 index 00000000..89e47cc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Boîte de dialogue", + "info": "Le panneau de boîte de dialogue le plus simple, contenant un composant de contenu, peut spécifier des propriétés telles que la profondeur d'ombre, la couleur de fond, la forme, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de la boîte de dialogue", + "desc": [ + "【child】 : Données de l'icône animée 【Widget】", + "【elevation】 : Profondeur d'ombre 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json new file mode 100644 index 00000000..45c1c186 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Finestra di dialogo", + "info": "Il pannello di dialogo più semplice, contiene un componente di contenuto, può specificare proprietà come profondità dell'ombra, colore di sfondo, forma, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Dialog", + "desc": [ + "【child】 : Dati dell'icona animata 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json new file mode 100644 index 00000000..509250c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "ダイアログ", + "info": "最もシンプルなダイアログパネルで、コンテンツコンポーネントを含み、影の深さ、背景色、形状などの属性を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog基本使用", + "desc": [ + "【child】 : アニメーションアイコンデータ 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json new file mode 100644 index 00000000..bbbda132 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "대화 상자", + "info": "가장 간단한 대화 상자 패널로, 내용 컴포넌트를 포함하며, 그림자 깊이, 배경색, 모양 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog 기본 사용", + "desc": [ + "【child】 : 애니메이션 아이콘 데이터 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json new file mode 100644 index 00000000..d2f524b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Caixa de Diálogo", + "info": "O painel de diálogo mais simples, contendo um componente de conteúdo, pode especificar propriedades como profundidade de sombra, cor de fundo, forma, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Dialog", + "desc": [ + "【child】 : Dados do ícone de animação 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json new file mode 100644 index 00000000..560ec3a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Диалоговое окно", + "info": "Самая простая панель диалогового окна, содержащая компонент содержимого, можно указать такие свойства, как глубина тени, цвет фона, форма и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Dialog", + "desc": [ + "【child】 : Данные анимационного иконка 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json new file mode 100644 index 00000000..b12763d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "对话框", + "info": "最简易的对话框面板,包含一个内容组件,可指定影深、背景色、形状等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog基本使用", + "desc": [ + "【child】 : 动画图标数据 【Widget】", + "【elevation】 : 影深 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart new file mode 100644 index 00000000..59d39bd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + +class CustomDialog extends StatelessWidget { + const CustomDialog({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildRaisedButton(context), + _buildDialog(), + ], + ); + } + + Widget _buildDialog() => const Dialog( + backgroundColor: Colors.white, + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + child: SizedBox( + width: 50, + child: DeleteDialog(), + ), + ); + + Widget _buildRaisedButton(BuildContext context) => ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () { + showDialog(context: context, builder: (ctx) => _buildDialog()); + }, + child: const Text( + 'Just Show It !', + style: TextStyle(color: Colors.white), + ), + ); + +} + +class DeleteDialog extends StatelessWidget { + const DeleteDialog({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildBar(context), + _buildTitle(), + _buildContent(), + _buildFooter(context), + ], + ); + } + + Widget _buildTitle() { + return const Text( + 'Delete Doucument', + style: TextStyle(color: Color(0xff5CC5E9), fontSize: 24), + ); + } + + Widget _buildContent() { + return const Padding( + padding: EdgeInsets.all(15.0), + child: Text( + ' Hi toly! If you push the conform buttom ,' + ' You will lose this file. Are you sure wand to do that?', + style: TextStyle(color: Color(0xffCFCFCF), fontSize: 16), + textAlign: TextAlign.justify, + ), + ); + } + + Widget _buildFooter(context) { + return Padding( + padding: const EdgeInsets.only(bottom: 15.0, top: 10,left: 10,right: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + alignment: Alignment.center, + height: 40, + width: 100, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30)), + color: Color(0xff73D1EE)), + child: const Text('Yes', + style: TextStyle(color: Colors.white, fontSize: 16)), + ), + InkWell( + onTap: ()=>Navigator.of(context).pop(), + child: Container( + alignment: Alignment.center, + height: 40, + width: 100, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30)), + color: Colors.orangeAccent), + child: const Text('Cancle', + style: TextStyle(color: Colors.white, fontSize: 16)), + ), + ) + ], + ), + ); + } + + Widget _buildBar(context) => Container( + height: 30, + alignment: Alignment.centerRight, + margin: const EdgeInsets.only(right: 10, top: 5), + child: InkWell( + onTap: ()=>Navigator.of(context).pop(), + child: const Icon( + Icons.close, + color: Color(0xff82CAE3), + ), + ), + ); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json new file mode 100644 index 00000000..0ec5efd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Horizontale Trennlinie", + "info": "Horizontale Trennlinie, bei der Farbe, Höhe, Dicke und seitliche Abstände angegeben werden können. Wird häufig als Trennlinie für Listenelemente verwendet.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider Farbe und Dicke", + "desc": [ + "【color】: Farbe 【Color】", + "【thickness】: Linienstärke 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider Höhe und Lücke", + "desc": [ + "【indent】: Länge der vorderen Lücke 【double】", + "【endIndent】: Länge der hinteren Lücke 【double】", + "【height】: Platzhalterhöhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json new file mode 100644 index 00000000..71ed3d1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Horizontal Divider", + "info": "A horizontal divider that can specify color, height, thickness, and left and right margin information, commonly used as a divider for list items.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider Color and Thickness", + "desc": [ + "【color】: Color 【Color】", + "【thickness】: Line thickness 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider Height and Indent", + "desc": [ + "【indent】: Front indent length 【double】", + "【endIndent】: Rear indent length 【double】", + "【height】: Placeholder height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json new file mode 100644 index 00000000..2b91b1be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Línea divisoria horizontal", + "info": "Línea divisoria horizontal, se puede especificar el color, la altura, el grosor, la información de los márgenes izquierdo y derecho, comúnmente utilizada como línea divisoria de elementos de la lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Color y grosor de Divider", + "desc": [ + "【color】: color 【Color】", + "【thickness】: grosor de la línea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altura y espacio de Divider", + "desc": [ + "【indent】: longitud del espacio frontal 【double】", + "【endIndent】: longitud del espacio posterior 【double】", + "【height】: altura del espacio ocupado 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json new file mode 100644 index 00000000..d6d3201c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Ligne de séparation horizontale", + "info": "Ligne de séparation horizontale, peut spécifier la couleur, la hauteur, l'épaisseur et les marges gauche et droite, couramment utilisée pour les lignes de séparation des éléments de liste.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Couleur et épaisseur du Divider", + "desc": [ + "【color】: Couleur 【Color】", + "【thickness】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Hauteur et espacement du Divider", + "desc": [ + "【indent】: Longueur de l'espacement avant 【double】", + "【endIndent】: Longueur de l'espacement arrière 【double】", + "【height】: Hauteur de l'élément 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json new file mode 100644 index 00000000..c69a2bca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Linea di divisione orizzontale", + "info": "Linea di divisione orizzontale, è possibile specificare colore, altezza, spessore, margini sinistro e destro, comunemente utilizzata come linea di divisione tra gli elementi di una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Colore e spessore del Divider", + "desc": [ + "【color】: Colore 【Color】", + "【thickness】: Spessore della linea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altezza e spazio vuoto del Divider", + "desc": [ + "【indent】: Lunghezza dello spazio vuoto anteriore 【double】", + "【endIndent】: Lunghezza dello spazio vuoto posteriore 【double】", + "【height】: Altezza occupata 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json new file mode 100644 index 00000000..6319c382 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "水平分割線", + "info": "水平分割線、色、高さ、太さ、左右の余白情報を指定できます。リストのアイテム分割線としてよく使用されます。", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dividerの色と太さ", + "desc": [ + "【color】: 色 【Color】", + "【thickness】: 線の太さ 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Dividerの高さと空白", + "desc": [ + "【indent】: 前の空白の長さ 【double】", + "【endIndent】: 後の空白の長さ 【double】", + "【height】: 占める高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json new file mode 100644 index 00000000..819480d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "수평 구분선", + "info": "수평 구분선으로, 색상, 높이, 두께, 좌우 여백 정보를 지정할 수 있으며, 주로 리스트의 항목 구분선으로 사용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider 색상과 두께", + "desc": [ + "【color】: 색상 【Color】", + "【thickness】: 선 두께 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider 높이와 여백", + "desc": [ + "【indent】: 앞쪽 여백 길이 【double】", + "【endIndent】: 뒤쪽 여백 길이 【double】", + "【height】: 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json new file mode 100644 index 00000000..c2f0d239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Linha divisória horizontal", + "info": "Linha divisória horizontal, pode especificar cor, altura, espessura, margens esquerda e direita, comumente usada como linha divisória de itens de lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cor e espessura do Divider", + "desc": [ + "【color】: Cor 【Color】", + "【thickness】: Espessura da linha 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altura e lacuna do Divider", + "desc": [ + "【indent】: Comprimento da lacuna frontal 【double】", + "【endIndent】: Comprimento da lacuna traseira 【double】", + "【height】: Altura do espaço ocupado 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json new file mode 100644 index 00000000..fa945ba4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Горизонтальная разделительная линия", + "info": "Горизонтальная разделительная линия, можно указать цвет, высоту, толщину, отступы слева и справа. Обычно используется как разделитель элементов списка.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Цвет и толщина Divider", + "desc": [ + "【color】: Цвет 【Color】", + "【thickness】: Толщина линии 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Высота и отступы Divider", + "desc": [ + "【indent】: Длина отступа спереди 【double】", + "【endIndent】: Длина отступа сзади 【double】", + "【height】: Высота занимаемого места 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json new file mode 100644 index 00000000..1c292685 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "水平分割线", + "info": "水平分割线,可指定颜色、高度、粗细、左右边距信息,常用与列表的item分割线。", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider颜色和粗细", + "desc": [ + "【color】: 颜色 【Color】", + "【thickness】: 线粗细 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider高度和空缺", + "desc": [ + "【indent】: 前面空缺长度 【double】", + "【endIndent】: 后面空缺长度 【double】", + "【height】: 占位高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart new file mode 100644 index 00000000..c17f923f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + + +class CustomDivider extends StatelessWidget { + const CustomDivider({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List dataColor = [ + Colors.red, Colors.yellow, + Colors.blue, Colors.green]; + List dataThickness = [1.0, 2.0, 4.0, 6.0]; + Map data = Map.fromIterables(dataColor, dataThickness); + return Column( + children: dataColor + .map((e) => Divider( + color: e, + thickness: data[e], + )).toList(), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart new file mode 100644 index 00000000..5c4a8531 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + + + +class HeightDivider extends StatelessWidget { + const HeightDivider({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List dataThickness = [10.0, 20.0, 30.0, 40.0]; + List dataColor = [ + Colors.red, Colors.yellow, + Colors.blue, Colors.green]; + Map data = Map.fromIterables(dataColor, dataThickness); + + return Column( + children: dataColor + .map((Color color) => Divider( + color: color, + indent:data[color], + endIndent: data[color]!*2, + height: data[color], + thickness: data[color]!/10, + )) + .toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json new file mode 100644 index 00000000..ec56bf29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Zieh- und Schieb-Rücksetzer", + "info": "Es kann die nachfolgenden DraggableScrollableSheet benachrichtigen, um ihre Position auf den Ausgangszustand zurückzusetzen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "Verwenden Sie DraggableScrollableActuator.reset(context), um die Position der nachfolgenden DraggableScrollableSheet auf die Ausgangsposition zurückzusetzen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json new file mode 100644 index 00000000..5c9afd68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Drag and Slide Resetter", + "info": "It can notify the descendant DraggableScrollableSheet to reset its position to the initial state.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【child】: Child component 【Widget】", + "Use DraggableScrollableActuator.reset(context) to reset the position of the descendant DraggableScrollableSheet to the initial position." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json new file mode 100644 index 00000000..c6229f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Restablecedor de arrastre y desplazamiento", + "info": "Puede notificar a la hoja DraggableScrollableSheet descendiente para restablecer su posición al estado inicial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "Usa DraggableScrollableActuator.reset(context) para restablecer la posición inicial de la hoja DraggableScrollableSheet descendiente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json new file mode 100644 index 00000000..928a6385 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Réinitialisateur de glissement", + "info": "Il peut informer les descendants DraggableScrollableSheet de réinitialiser leur position à l'état initial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Utilisez DraggableScrollableActuator.reset(context) pour réinitialiser la position initiale du descendant DraggableScrollableSheet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json new file mode 100644 index 00000000..a13ffb46 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Trascinabile scorrevole reset", + "info": "Può notificare ai discendenti DraggableScrollableSheet di ripristinare la loro posizione allo stato iniziale.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Metodo di utilizzo di base", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Utilizza DraggableScrollableActuator.reset(context) per ripristinare la posizione iniziale del discendente DraggableScrollableSheet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json new file mode 100644 index 00000000..4935f4bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "ドラッグスクロールリセッター", + "info": "これは子孫の DraggableScrollableSheet に通知して、その位置を初期状態にリセットすることができます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本的な使用方法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "DraggableScrollableActuator.reset(context) を使用して、子孫の DraggableScrollableSheet を初期位置にリセットします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json new file mode 100644 index 00000000..57c5481d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "드래그 스크롤 재설정기", + "info": "이것은 후손 DraggableScrollableSheet에게 초기 상태로 위치를 재설정하도록 알릴 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용 방법", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "DraggableScrollableActuator.reset(context)를 사용하여 후손 DraggableScrollableSheet를 초기 위치로 재설정합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json new file mode 100644 index 00000000..06f3310b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Reposicionador de Arrasto e Deslize", + "info": "Ele pode notificar o DraggableScrollableSheet descendente para redefinir sua posição para o estado inicial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Método de Uso Básico", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Use DraggableScrollableActuator.reset(context) para redefinir a posição inicial do DraggableScrollableSheet descendente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json new file mode 100644 index 00000000..912c5634 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Перетаскиваемый сбрасыватель", + "info": "Он может уведомить дочерние DraggableScrollableSheet о необходимости сбросить их положение в исходное состояние.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Используйте DraggableScrollableActuator.reset(context) для сброса положения дочернего DraggableScrollableSheet в исходное положение." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json new file mode 100644 index 00000000..77c96c87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "拖滑重置器", + "info": "它可以通知后代的 DraggableScrollableSheet,将其位置重置为初始状态。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用方法", + "desc": [ + "【child】 : 子组件 【Widget】", + "使用 DraggableScrollableActuator.reset(context) 重置后代 DraggableScrollableSheet 位初始位置。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart new file mode 100644 index 00000000..16f72005 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class DraggableScrollableActuatorDemo extends StatelessWidget { + const DraggableScrollableActuatorDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(10), + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DraggableScrollableActuatorPage()), + ); + }, + child: const Text("进入 DraggableScrollableActuator 测试页"), + ), + ); + } +} + +class DraggableScrollableActuatorPage extends StatelessWidget { + DraggableScrollableActuatorPage({Key? key}) : super(key: key); + + final List data = [ + Colors.orange[50]!, + Colors.orange[100]!, + Colors.orange[200]!, + Colors.orange[300]!, + Colors.orange[400]!, + Colors.orange[500]!, + Colors.orange[600]!, + Colors.orange[700]!, + Colors.orange[800]!, + Colors.orange[900]!, + Colors.red[50]!, + Colors.red[100]!, + Colors.red[200]!, + Colors.red[300]!, + Colors.red[400]!, + Colors.red[500]!, + Colors.red[600]!, + Colors.red[700]!, + Colors.red[800]!, + Colors.red[900]!, + ]; + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("DraggableScrollableActuator"), + ), + body: DraggableScrollableActuator( + child: Builder( + builder: (ctx) => Column( + children: [ + ElevatedButton( + onPressed: () { + DraggableScrollableActuator.reset(ctx); + }, + child: const Text("重置位置"), + ), + Expanded( + child: buildSheet(), + ), + ], + ), + ), + ), + ); + } + + Widget buildSheet() => DraggableScrollableSheet( + initialChildSize: 0.3, + minChildSize: 0.2, + maxChildSize: 1, + expand: true, + builder: (BuildContext context, ScrollController scrollController) => + ListView.builder( + controller: scrollController, + itemCount: data.length, + itemBuilder: buildColorItem, + ), + ); + + Widget buildColorItem(BuildContext context, int index) { + return Container( + alignment: Alignment.center, + height: 60, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ]), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json new file mode 100644 index 00000000..2a2df0ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Seitenleiste", + "info": "Wird im Allgemeinen für die draw- und endDraw-Eigenschaften in Scaffold als linke und rechte Seitenleiste verwendet. Kann ein Kindelement aufnehmen und die Schattentiefe angeben.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Drawer", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【elevation】 : Schattentiefe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json new file mode 100644 index 00000000..7f1cbcd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Drawer", + "info": "Generally used as the left and right sliding panels in the Scaffold's draw and endDraw properties. It can contain a child component and can specify the elevation.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Drawer", + "desc": [ + "【child】 : Child component 【Widget】", + "【elevation】 : Elevation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json new file mode 100644 index 00000000..12dc49f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra deslizante", + "info": "Generalmente se utiliza en los atributos draw y endDraw de Scaffold como barras deslizantes izquierda y derecha, puede contener un componente hijo y permite especificar la profundidad de la sombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Drawer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json new file mode 100644 index 00000000..c85c7ed5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barre de glissement", + "info": "Généralement utilisé pour les propriétés draw et endDraw dans Scaffold comme barres de glissement gauche et droite, peut contenir un composant enfant, peut spécifier la profondeur de l'ombre.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Drawer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json new file mode 100644 index 00000000..b28e89eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra di scorrimento", + "info": "Generalmente utilizzato per gli attributi draw e endDraw in Scaffold come barre di scorrimento laterali, può contenere un componente figlio e specificare la profondità dell'ombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Drawer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json new file mode 100644 index 00000000..e1366ece --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "スライドバー", + "info": "一般的にScaffoldのdrawおよびendDrawプロパティで左右のスライドバーとして使用され、1つの子コンポーネントを収容でき、影の深さを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json new file mode 100644 index 00000000..b7eb4ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "슬라이드 바", + "info": "일반적으로 Scaffold의 draw 및 endDraw 속성으로 좌우 슬라이드 바로 사용되며, 하나의 자식 위젯을 수용할 수 있고, 그림자 깊이를 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawer 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json new file mode 100644 index 00000000..7dfd72b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra de deslizamento", + "info": "Geralmente usado para os atributos draw e endDraw no Scaffold como barras de deslizamento esquerda e direita, pode conter um componente filho e especificar a profundidade da sombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Drawer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【elevation】 : Profundidade da sombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json new file mode 100644 index 00000000..09836344 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Скользящая панель", + "info": "Обычно используется в свойствах draw и endDraw Scaffold в качестве левой и правой скользящей панели, может содержать один дочерний компонент, можно указать глубину тени.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Drawer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json new file mode 100644 index 00000000..35284bfa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "滑页栏", + "info": "一般用于Scaffold中的draw和endDraw属性作为左右的滑页栏,可以容纳一个子组件,能指定影深。", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawer基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【elevation】 : 影深 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart new file mode 100644 index 00000000..9248e9a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart @@ -0,0 +1,65 @@ + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomDrawer extends StatelessWidget { + const CustomDrawer({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 400, + child: Scaffold( + appBar: AppBar( + title: const Text('Flutter Unit'), + ), + drawer: Drawer( + elevation: 3, + child: _buildChild(), + ), + ), + ); + } + + Widget _buildChild() => ListView( + padding: EdgeInsets.zero, + children: const [ + DrawerHeader( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/caver.webp'), + fit: BoxFit.cover), + ), + child: Text( + '张风捷特烈', + style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3) + ]), + ), + ), + ListTile( + leading: Icon( + Icons.star, + color: Colors.blue, + ), + title: Text('我的收藏'), + ), + ListTile( + leading: Icon( + Icons.palette, + color: Colors.orangeAccent, + ), + title: Text('我的绘画'), + ), + ListTile( + leading: Icon( + Icons.insert_drive_file, + color: Colors.green, + ), + title: Text('我的文件'), + ), + ], + ); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json new file mode 100644 index 00000000..4ee3ddcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Schubladenknopf", + "info": "Ein linker Schubladensymbolknopf, der das Symbol mit DrawerButtonIcon anzeigt. Das Standardklickereignis kann die linke Schublade öffnen.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerButton", + "desc": [ + "【onPressed】: Klickereignis 【VoidCallback?】", + "【style】: Schaltflächenstil 【ButtonStyle?】", + "Wenn onPressed leer ist, wird beim Klicken die linke Schublade geöffnet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json new file mode 100644 index 00000000..efd56389 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Drawer Button", + "info": "A left drawer icon button, using DrawerButtonIcon to display the icon. The default click event can open the left drawer.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerButton", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "When onPressed is empty, clicking will open the left drawer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json new file mode 100644 index 00000000..d8466e59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Botón de cajón", + "info": "Un botón de icono de cajón izquierdo, utiliza DrawerButtonIcon para mostrar el icono, el evento de clic predeterminado puede abrir el cajón izquierdo.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerButton", + "desc": [ + "【onPressed】: Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "Cuando onPressed está vacío, al hacer clic se abrirá el cajón izquierdo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json new file mode 100644 index 00000000..12c175fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Bouton de tiroir", + "info": "Un bouton d'icône de tiroir gauche, utilise DrawerButtonIcon pour afficher l'icône. L'événement de clic par défaut peut ouvrir le tiroir gauche.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "Lorsque onPressed est vide, un clic ouvrira le tiroir gauche." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json new file mode 100644 index 00000000..8a7da810 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Pulsante Cassetto", + "info": "Un pulsante con icona del cassetto sinistro, utilizza DrawerButtonIcon per mostrare l'icona, l'evento di clic predefinito può aprire il cassetto sinistro.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di DrawerButton", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "Quando onPressed è vuoto, il clic aprirà il cassetto sinistro." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json new file mode 100644 index 00000000..8710f35d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "ドロワーボタン", + "info": "左ドロワーアイコンボタンで、DrawerButtonIconを使用してアイコンを表示します。デフォルトのクリックイベントで左ドロワーを開きます。", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 基本使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "onPressedが空の場合、クリックすると左ドロワーが開きます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json new file mode 100644 index 00000000..2065716b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "서랍 버튼", + "info": "왼쪽 서랍 아이콘 버튼, DrawerButtonIcon을 사용하여 아이콘을 표시하며, 기본 클릭 이벤트는 왼쪽 서랍을 엽니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "onPressed가 비어 있을 때, 클릭하면 왼쪽 서랍이 열립니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json new file mode 100644 index 00000000..3ea74e2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Botão de Gaveta", + "info": "Um botão de ícone de gaveta esquerda, usando DrawerButtonIcon para exibir o ícone, o evento de clique padrão pode abrir a gaveta esquerda.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DrawerButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "Quando onPressed estiver vazio, ao clicar, a gaveta esquerda será aberta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json new file mode 100644 index 00000000..8a62d7b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Кнопка ящика", + "info": "Кнопка с иконкой левого ящика, использует DrawerButtonIcon для отображения иконки, по умолчанию при нажатии открывает левый ящик.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerButton", + "desc": [ + "【onPressed】: Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "Если onPressed пуст, при нажатии открывается левый ящик." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json new file mode 100644 index 00000000..6cf4fc4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "抽屉按钮", + "info": "一个左抽屉图标按钮, 使用 DrawerButtonIcon 展示图标,默认点击事件可以打开左抽屉。", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "onPressed 为空时,点击时会打开左抽屉。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart new file mode 100644 index 00000000..8803ccdb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + + +class DrawerButtonDemo extends StatelessWidget { + const DrawerButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return DrawerButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + iconColor: Colors.white, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..6d7a5fde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Schubladen-Schaltflächensymbol", + "info": "Ein Schubladen-Icon-Symbol, das je nach Plattform das entsprechende Symbol anzeigt und über ActionIconTheme angepasst werden kann.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon-Effekt", + "desc": [ + "Passt das Symbol der Schubladenschaltfläche für verschiedene Plattformen über die _ActionIcon-Komponente gemäß dem ActionIconTheme an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json new file mode 100644 index 00000000..3b9628df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Drawer Button Icon", + "info": "A drawer Icon, which displays the corresponding icon according to the platform, and can be customized with ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the drawer button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..1be7aee1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icono del botón del cajón", + "info": "Un icono de cajón, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de DrawerButtonIcon", + "desc": [ + "A través del componente _ActionIcon, se adapta el icono del botón del cajón para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..9143ef42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icône de bouton de tiroir", + "info": "Une icône de tiroir, affichant l'icône correspondante selon la plateforme, peut être personnalisée avec ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de DrawerButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône du bouton de tiroir à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..6da1a0b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icona del pulsante del cassetto", + "info": "Un'icona del cassetto, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto DrawerButtonIcon", + "desc": [ + "Utilizzando il componente _ActionIcon in base al tema ActionIconTheme, per adattare l'icona del pulsante del cassetto a diverse piattaforme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..7c10cefc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "ドロワーボタンアイコン", + "info": "ドロワー Icon アイコンで、プラットフォームに応じたアイコンを表示し、ActionIconTheme でテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 効果", + "desc": [ + "_ActionIcon コンポーネントを使用して、ActionIconTheme テーマに基づいて、異なるプラットフォームのドロワーボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..00312080 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "서랍 버튼 아이콘", + "info": "서랍 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 서랍 버튼 아이콘을 조정합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..5daebcdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Ícone do botão da gaveta", + "info": "Um ícone de gaveta, exibe o ícone correspondente de acordo com a plataforma, pode ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do DrawerButtonIcon", + "desc": [ + "Através do componente _ActionIcon, adapta o ícone do botão da gaveta para diferentes plataformas de acordo com o tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..5d97ec8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Иконка кнопки ящика", + "info": "Иконка ящика, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект DrawerButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки ящика для разных платформ в соответствии с темой ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..1397b3c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "抽屉按钮图标", + "info": "一个抽屉 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的抽屉按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart new file mode 100644 index 00000000..a60b8b70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + +class DrawerButtonIconDemo extends StatelessWidget { + const DrawerButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const DrawerButtonIcon(); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json new file mode 100644 index 00000000..309a6624 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Drawer-Header", + "info": "Wird normalerweise in Drawer verwendet, als Kopf des Drawers. Kann Attribute wie Innen- und Außenabstand, Dekoration, Unterkomponenten usw. festlegen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerHeader", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "【decoration】 : Dekoration 【Decoration】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json new file mode 100644 index 00000000..1c719c26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Drawer Header", + "info": "Generally used in Drawer, as the header of the drawer. You can specify properties such as padding, decoration, child components, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerHeader", + "desc": [ + "【child】 : Child Component 【Widget】", + "【decoration】 : Decoration 【Decoration】", + "【margin】 : Margin 【EdgeInsetsGeometry】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json new file mode 100644 index 00000000..3deee37b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Encabezado del cajón", + "info": "Generalmente se utiliza en Drawer, como encabezado del cajón. Se pueden especificar propiedades como márgenes internos y externos, decoración, componentes secundarios, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerHeader", + "desc": [ + "【child】 : Componente secundario 【Widget】", + "【decoration】 : Decoración 【Decoration】", + "【margin】 : Margen externo 【EdgeInsetsGeometry】", + "【padding】 : Margen interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json new file mode 100644 index 00000000..95784358 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "En-tête de tiroir", + "info": "Généralement utilisé dans Drawer, comme en-tête du tiroir. Peut spécifier des propriétés telles que les marges intérieures et extérieures, la décoration, les composants enfants, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerHeader", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【decoration】 : Décoration 【Decoration】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json new file mode 100644 index 00000000..54fc9e88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Intestazione del cassetto", + "info": "Generalmente utilizzato in Drawer, come intestazione del cassetto. È possibile specificare proprietà come margini interni ed esterni, decorazioni, componenti figli, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DrawerHeader", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【decoration】 : Decorazione 【Decoration】", + "【margin】 : Margine esterno 【EdgeInsetsGeometry】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json new file mode 100644 index 00000000..c917a060 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "ドロワーヘッダー", + "info": "一般的にDrawer内で使用され、ドロワーのヘッダーとして機能します。内外の余白、装飾、子コンポーネントなどのプロパティを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeaderの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【decoration】 : 装飾 【Decoration】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json new file mode 100644 index 00000000..b796014d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "슬라이드 페이지 헤더", + "info": "일반적으로 Drawer에서 사용되며, 슬라이드 페이지의 헤더로 사용됩니다. 내부 및 외부 여백, 장식, 하위 구성 요소 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeader 기본 사용", + "desc": [ + "【child】 : 하위 구성 요소 【Widget】", + "【decoration】 : 장식 【Decoration】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json new file mode 100644 index 00000000..209efa1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Cabeçalho do Painel Deslizante", + "info": "Geralmente utilizado no Drawer, como cabeçalho do painel deslizante. Pode especificar atributos como margens internas e externas, decoração, componentes filhos, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DrawerHeader", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【decoration】 : Decoração 【Decoration】", + "【margin】 : Margem Externa 【EdgeInsetsGeometry】", + "【padding】 : Margem Interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json new file mode 100644 index 00000000..77940ee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Заголовок выдвижной панели", + "info": "Обычно используется в Drawer в качестве заголовка выдвижной панели. Можно указать свойства, такие как отступы, декор, дочерние компоненты и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerHeader", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【decoration】 : Декор 【Decoration】", + "【margin】 : Внешний отступ 【EdgeInsetsGeometry】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json new file mode 100644 index 00000000..7ebf64d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "滑页栏标题", + "info": "一般用于Drawer中,作为滑页栏的头部。可以指定内外边距、装饰、子组件等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeader基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【decoration】 : 装饰 【Decoration】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart new file mode 100644 index 00000000..76e761a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart @@ -0,0 +1,73 @@ + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + + +import 'package:flutter/material.dart'; +class CustomDrawerHeader extends StatelessWidget { + const CustomDrawerHeader({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 400, + child: Scaffold( + appBar: AppBar( + title: const Text('Flutter Unit'), + ), + drawer: Drawer( + elevation: 3, + child: _buildChild(), + ), + ), + ); + } + + Widget _buildChild() => ListView( + padding: EdgeInsets.zero, + children: [ + _buildHeader(), + const ListTile( + leading: Icon( + Icons.star, + color: Colors.blue, + ), + title: Text('我的收藏'), + ), + const ListTile( + leading: Icon( + Icons.palette, + color: Colors.orangeAccent, + ), + title: Text('我的绘画'), + ), + const ListTile( + leading: Icon( + Icons.insert_drive_file, + color: Colors.green, + ), + title: Text('我的文件'), + ), + ], + ); + + Widget _buildHeader() => const DrawerHeader( + margin: EdgeInsets.all(10), + padding: EdgeInsets.only(left: 20,top: 15), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft:Radius.circular(40), + topRight:Radius.circular(40) + ), + image: DecorationImage( + image: AssetImage('assets/images/caver.webp'), + fit: BoxFit.cover), + ), + child: Text( + '张风捷特烈', + style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ + Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3) + ]), + ), + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json new file mode 100644 index 00000000..9b37050e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Rechte Schubladen-Schaltfläche", + "info": "Eine rechte Schubladen-Icon-Schaltfläche, die das EndDrawerButtonIcon verwendet, um das Icon anzuzeigen. Standardmäßig öffnet ein Klick die rechte Schublade.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von EndDrawerButton", + "desc": [ + "【onPressed】 : Klick-Ereignis 【VoidCallback?】", + "【style】: Schaltflächenstil 【ButtonStyle?】", + "Wenn onPressed leer ist, wird beim Klicken die rechte Schublade geöffnet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json new file mode 100644 index 00000000..807315a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Right Drawer Button", + "info": "A right drawer icon button, using EndDrawerButtonIcon to display the icon, the default click event can open the right drawer.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of EndDrawerButton", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "When onPressed is empty, clicking will open the right drawer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json new file mode 100644 index 00000000..9166032a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Botón de cajón derecho", + "info": "Un botón de icono de cajón derecho, que utiliza EndDrawerButtonIcon para mostrar el icono. El evento de clic predeterminado puede abrir el cajón derecho.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de EndDrawerButton", + "desc": [ + "【onPressed】 : Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "Cuando onPressed está vacío, al hacer clic se abrirá el cajón derecho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json new file mode 100644 index 00000000..8e80d828 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Bouton de tiroir droit", + "info": "Un bouton d'icône de tiroir droit, utilisant EndDrawerButtonIcon pour afficher l'icône, l'événement de clic par défaut peut ouvrir le tiroir droit.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de EndDrawerButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "Lorsque onPressed est vide, un clic ouvrira le tiroir droit." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json new file mode 100644 index 00000000..bc4fca22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Pulsante cassetto destro", + "info": "Un pulsante icona per il cassetto destro, utilizza EndDrawerButtonIcon per visualizzare l'icona. L'evento di clic predefinito apre il cassetto destro.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di EndDrawerButton", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "Quando onPressed è vuoto, cliccando si apre il cassetto destro." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json new file mode 100644 index 00000000..23fcf703 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "右ドロワーボタン", + "info": "右ドロワーアイコンボタンで、EndDrawerButtonIconを使用してアイコンを表示し、デフォルトのクリックイベントで右ドロワーを開くことができます。", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 基本使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "onPressedが空の場合、クリックすると右ドロワーが開きます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json new file mode 100644 index 00000000..74f43710 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "오른쪽 서랍 버튼", + "info": "오른쪽 서랍 아이콘 버튼, EndDrawerButtonIcon을 사용하여 아이콘을 표시하며, 기본 클릭 이벤트는 오른쪽 서랍을 열 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "onPressed가 비어 있을 때, 클릭하면 오른쪽 서랍이 열립니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json new file mode 100644 index 00000000..77bcd210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Botão de gaveta direita", + "info": "Um botão de ícone de gaveta direita, usando EndDrawerButtonIcon para exibir o ícone, o evento de clique padrão pode abrir a gaveta direita.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do EndDrawerButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "Quando onPressed estiver vazio, ao clicar, a gaveta direita será aberta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json new file mode 100644 index 00000000..9ee1ce2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Кнопка правого ящика", + "info": "Кнопка с иконкой правого ящика, использующая EndDrawerButtonIcon для отображения иконки. По умолчанию при нажатии открывает правый ящик.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование EndDrawerButton", + "desc": [ + "【onPressed】: Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "Если onPressed пуст, при нажатии открывается правый ящик." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json new file mode 100644 index 00000000..6d40c8cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "右抽屉按钮", + "info": "一个右抽屉图标按钮, 使用 EndDrawerButtonIcon 展示图标,默认点击事件可以打开右抽屉。", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "onPressed 为空时,点击时会打开右抽屉。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart new file mode 100644 index 00000000..bbce197e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + + +class EndDrawerButtonDemo extends StatelessWidget { + const EndDrawerButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return EndDrawerButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + iconColor: Colors.white, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..3e564d5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Rechte Schubladen-Schaltfläche Symbol", + "info": "Ein Symbol für die rechte Schubladen-Schaltfläche, das je nach Plattform das entsprechende Symbol anzeigt. Das Thema kann über ActionIconTheme angepasst werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon Effekt", + "desc": [ + "Durch die _ActionIcon-Komponente wird das Symbol für die rechte Schubladen-Schaltfläche entsprechend dem ActionIconTheme-Theme an verschiedene Plattformen angepasst." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json new file mode 100644 index 00000000..3afb8573 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Right Drawer Button Icon", + "info": "A right drawer Icon that displays the corresponding icon based on the platform. It can be customized with the ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the right drawer button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..47c9524b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icono del botón del cajón derecho", + "info": "Un icono de cajón derecho que muestra el icono correspondiente según la plataforma, y se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de EndDrawerButtonIcon", + "desc": [ + "El componente _ActionIcon adapta el icono del botón del cajón derecho para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..c1be227c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icône de bouton de tiroir droit", + "info": "Une icône de tiroir droit, affichant l'icône correspondante selon la plateforme, peut être personnalisée avec ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de l'icône EndDrawerButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône du bouton de tiroir droit pour différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..679a5469 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icona del pulsante del cassetto destro", + "info": "Un'icona del cassetto destro, mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto di EndDrawerButtonIcon", + "desc": [ + "Adatta l'icona del pulsante del cassetto destro per diverse piattaforme tramite il componente _ActionIcon in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..0bdd2df7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "右ドロワーボタンアイコン", + "info": "右ドロワーのアイコンで、プラットフォームに応じて対応するアイコンを表示します。ActionIconTheme を使用してテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 効果", + "desc": [ + "_ActionIcon コンポーネントを使用して、ActionIconTheme テーマに基づいて、異なるプラットフォームの右ドロワーボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..feb4b652 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "오른쪽 서랍 버튼 아이콘", + "info": "오른쪽 서랍 Icon 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 커스터마이징할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 오른쪽 서랍 버튼 아이콘을 적용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..769b4167 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Ícone do botão da gaveta direita", + "info": "Um ícone de gaveta direita, que exibe o ícone correspondente de acordo com a plataforma, podendo ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do EndDrawerButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão da gaveta direita para diferentes plataformas de acordo com o tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..7e3fa078 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Иконка кнопки правого выдвижного ящика", + "info": "Иконка правого выдвижного ящика, отображающая соответствующую иконку в зависимости от платформы, может быть настроена с помощью ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект EndDrawerButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки правого выдвижного ящика для разных платформ в зависимости от темы ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..07e601ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "右抽屉按钮图标", + "info": "一个右抽屉 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的右抽屉按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart new file mode 100644 index 00000000..a2957fcd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com + +class EndDrawerButtonIconDemo extends StatelessWidget { + const EndDrawerButtonIconDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const EndDrawerButtonIcon(); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json new file mode 100644 index 00000000..f508855f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Einblendendes Bild", + "info": "Lädt ein Bild mit transparentem Übergang. Kann Platzhalterbild, Animationskurven für Ein- und Ausblenden, Zeit, Breite, Höhe, Fit-Typ, Ausrichtung, Wiederholungsmodus usw. angeben.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork lädt Netzwerkbild", + "desc": [ + "【placeholder】 : Platzhalterbild-Adresse 【String】", + "【image】 : Anzeigebild-Adresse 【String】", + "【width】: Breite 【double】", + "【height】: Höhe 【double】", + "【fadeInDuration】: Einblenddauer 【Duration】", + "【fadeOutDuration】: Ausblenddauer 【Duration】", + "【fadeInCurve】: Einblendkurve 【Cubic】", + "【fadeOutCurve】: Ausblendkurve 【Cubic】", + "【fit】: Anpassungsmodus 【BoxFit】", + "【alignment】: Ausrichtungsmodus 【Alignment】", + "【repeat】: Wiederholungsmodus 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json new file mode 100644 index 00000000..6d20fb52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Fade-in Image", + "info": "Load an image with a transparent gradient. You can specify a placeholder image, animation curves for fade in and out, duration, width, height, fit type, alignment, repeat mode, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork Load Network Image", + "desc": [ + "【placeholder】 : Placeholder image address 【String】", + "【image】 : Display image address 【String】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【fadeInDuration】: Fade-in duration 【Duration】", + "【fadeOutDuration】: Fade-out duration 【Duration】", + "【fadeInCurve】: Fade-in curve 【Cubic】", + "【fadeOutCurve】: Fade-out curve 【Cubic】", + "【fit】: Fit mode 【BoxFit】", + "【alignment】: Alignment mode 【Alignment】", + "【repeat】: Repeat mode 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json new file mode 100644 index 00000000..fbb31cee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Imagen de fundido", + "info": "Carga una imagen con un gradiente transparente. Se puede especificar una imagen de marcador de posición, curvas de animación de entrada y salida, tiempo, ancho y alto, tipo de ajuste, alineación, modo de repetición, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork cargar imagen de red", + "desc": [ + "【placeholder】 : dirección de la imagen de marcador de posición 【String】", + "【image】 : dirección de la imagen a mostrar 【String】", + "【width】: ancho 【double】", + "【height】: alto 【double】", + "【fadeInDuration】: duración del fundido de entrada 【Duration】", + "【fadeOutDuration】: duración del fundido de salida 【Duration】", + "【fadeInCurve】: curva de fundido de entrada 【Cubic】", + "【fadeOutCurve】: curva de fundido de salida 【Cubic】", + "【fit】: modo de ajuste 【BoxFit】", + "【alignment】: modo de alineación 【Alignment】", + "【repeat】: modo de repetición 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json new file mode 100644 index 00000000..9433dd84 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Image en fondu", + "info": "Charge une image avec un dégradé transparent. Vous pouvez spécifier une image de remplacement, les courbes d'animation d'entrée et de sortie, la durée, la largeur, la hauteur, le type de fit, l'alignement, le mode de répétition, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork charger une image réseau", + "desc": [ + "【placeholder】 : adresse de l'image de remplacement 【String】", + "【image】 : adresse de l'image à afficher 【String】", + "【width】: largeur 【double】", + "【height】: hauteur 【double】", + "【fadeInDuration】: durée du fondu entrant 【Duration】", + "【fadeOutDuration】: durée du fondu sortant 【Duration】", + "【fadeInCurve】: courbe du fondu entrant 【Cubic】", + "【fadeOutCurve】: courbe du fondu sortant 【Cubic】", + "【fit】: mode d'ajustement 【BoxFit】", + "【alignment】: mode d'alignement 【Alignment】", + "【repeat】: mode de répétition 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json new file mode 100644 index 00000000..3b135d11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Immagine dissolvenza", + "info": "Carica un'immagine con una dissolvenza trasparente. È possibile specificare un'immagine segnaposto, curve di animazione per l'entrata e l'uscita, durata, larghezza, altezza, tipo di adattamento, allineamento, modalità di ripetizione, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork carica immagini dalla rete", + "desc": [ + "【placeholder】 : Indirizzo dell'immagine segnaposto 【String】", + "【image】 : Indirizzo dell'immagine da visualizzare 【String】", + "【width】: Larghezza 【double】", + "【height】: Altezza 【double】", + "【fadeInDuration】: Durata della dissolvenza in entrata 【Duration】", + "【fadeOutDuration】: Durata della dissolvenza in uscita 【Duration】", + "【fadeInCurve】: Curva della dissolvenza in entrata 【Cubic】", + "【fadeOutCurve】: Curva della dissolvenza in uscita 【Cubic】", + "【fit】: Modalità di adattamento 【BoxFit】", + "【alignment】: Modalità di allineamento 【Alignment】", + "【repeat】: Modalità di ripetizione 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json new file mode 100644 index 00000000..ff0eb9c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "フェードイン画像", + "info": "画像を透明にグラデーションしてロードします。プレースホルダー画像、進退のアニメーションカーブ、時間、幅と高さ、fitタイプ、配置方法、繰り返し方法などを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetworkでネットワーク画像をロード", + "desc": [ + "【placeholder】 : プレースホルダー画像のアドレス 【String】", + "【image】 : 表示画像のアドレス 【String】", + "【width】: 幅 【double】", + "【height】: 高さ 【double】", + "【fadeInDuration】: フェードイン時間 【Duration】", + "【fadeOutDuration】: フェードアウト時間 【Duration】", + "【fadeInCurve】: フェードインカーブ 【Cubic】", + "【fadeOutCurve】: フェードアウトカーブ 【Cubic】", + "【fit】: フィットモード 【BoxFit】", + "【alignment】: 配置モード 【Alignment】", + "【repeat】: 繰り返しモード 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json new file mode 100644 index 00000000..268d935c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "페이드 인 이미지", + "info": "이미지를 투명하게 페이드 인하여 로드합니다. 플레이스홀더 이미지, 애니메이션 곡선, 시간, 너비, 높이, fit 유형, 정렬 방식, 반복 방식 등을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork 네트워크 이미지 로드", + "desc": [ + "【placeholder】 : 플레이스홀더 이미지 주소 【String】", + "【image】 : 표시할 이미지 주소 【String】", + "【width】: 너비 【double】", + "【height】: 높이 【double】", + "【fadeInDuration】: 페이드 인 시간 【Duration】", + "【fadeOutDuration】: 페이드 아웃 시간 【Duration】", + "【fadeInCurve】: 페이드 인 곡선 【Cubic】", + "【fadeOutCurve】: 페이드 아웃 곡선 【Cubic】", + "【fit】: 적합 모드 【BoxFit】", + "【alignment】: 정렬 모드 【Alignment】", + "【repeat】: 반복 모드 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json new file mode 100644 index 00000000..734af47d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Imagem de Desvanecimento", + "info": "Carrega uma imagem com um gradiente transparente. Pode especificar uma imagem de placeholder, curvas de animação de entrada e saída, duração, largura, altura, tipo de ajuste, alinhamento, modo de repetição, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork carregar imagem da rede", + "desc": [ + "【placeholder】 : endereço da imagem de placeholder 【String】", + "【image】 : endereço da imagem a ser exibida 【String】", + "【width】: largura 【double】", + "【height】: altura 【double】", + "【fadeInDuration】: duração do desvanecimento de entrada 【Duration】", + "【fadeOutDuration】: duração do desvanecimento de saída 【Duration】", + "【fadeInCurve】: curva de desvanecimento de entrada 【Cubic】", + "【fadeOutCurve】: curva de desvanecimento de saída 【Cubic】", + "【fit】: modo de ajuste 【BoxFit】", + "【alignment】: modo de alinhamento 【Alignment】", + "【repeat】: modo de repetição 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json new file mode 100644 index 00000000..f2ed4160 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Изображение с плавным появлением", + "info": "Загрузка изображения с плавным появлением. Можно указать изображение-заполнитель, кривые анимации появления и исчезновения, время, ширину, высоту, тип подгонки, выравнивание, режим повторения и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork загрузка изображения из сети", + "desc": [ + "【placeholder】 : Адрес изображения-заполнителя 【String】", + "【image】 : Адрес отображаемого изображения 【String】", + "【width】: Ширина 【double】", + "【height】: Высота 【double】", + "【fadeInDuration】: Длительность появления 【Duration】", + "【fadeOutDuration】: Длительность исчезновения 【Duration】", + "【fadeInCurve】: Кривая появления 【Cubic】", + "【fadeOutCurve】: Кривая исчезновения 【Cubic】", + "【fit】: Режим подгонки 【BoxFit】", + "【alignment】: Режим выравнивания 【Alignment】", + "【repeat】: Режим повторения 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json new file mode 100644 index 00000000..4c4d01c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "淡入图片", + "info": "透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork加载网络图片", + "desc": [ + "【placeholder】 : 展位图地址 【String】", + "【image】 : 显示图地址 【String】", + "【width】: 宽 【double】", + "【height】: 高 【double】", + "【fadeInDuration】: 淡入时长 【Duration】", + "【fadeOutDuration】: 淡出时长 【Duration】", + "【fadeInCurve】: 淡入曲线 【Cubic】", + "【fadeOutCurve】: 淡出曲线 【Cubic】", + "【fit】: 适应模式 【BoxFit】", + "【alignment】: 对齐模式 【Alignment】", + "【repeat】: 重复模式 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart new file mode 100644 index 00000000..0e6e88ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + + +class CustomFadeInImage extends StatelessWidget { + const CustomFadeInImage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + String placeholder = "assets/images/icon_head.webp"; + String img = + "https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/" + "15739960c2da4de3a263eeabcb60057f~tplv-k3u1fbpfcp-zoom-crop-mark" + ":1304:1304:1304:734.awebp"; + return FadeInImage.assetNetwork( + placeholder: placeholder, + image: img, + width: 100, + height: 100, + fit: BoxFit.cover, + repeat:ImageRepeat.noRepeat, + alignment: Alignment.center, + fadeInDuration:const Duration(seconds: 5), + fadeInCurve: Curves.easeInCubic, + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json new file mode 100644 index 00000000..52632833 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filterstreifen", + "info": "Ähnlich wie die Chip-Komponente, hat Eigenschaften für ausgewählt oder nicht und ein Auswahlereignis. Wenn ausgewählt, wird die obere Ebene der linken Komponente mit einem ✔️ überlagert.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip kann Auswahlereignisse akzeptieren", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【onSelected】: Auswahlereignis 【Function(bool)】", + "【selectedColor】: Farbe nach der Auswahl 【Color】", + "【selectedShadowColor】: Schattenfarbe nach der Auswahl 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json new file mode 100644 index 00000000..b5d60b4e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filter Chip", + "info": "Similar in style to the Chip component, with properties for selection and selection events. When selected, the upper layer of the left component will be masked by a ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip can accept selection events", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onSelected】: Selection event 【Function(bool)】", + "【selectedColor】: Color after selection 【Color】", + "【selectedShadowColor】: Shadow color after selection 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json new file mode 100644 index 00000000..4380e5b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Chip de Filtro", + "info": "Estilo similar al componente Chip, con propiedades de selección y eventos de selección. Cuando está seleccionado, la capa superior del componente izquierdo estará cubierta por ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip puede aceptar eventos de selección", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onSelected】: Evento de selección 【Function(bool)】", + "【selectedColor】: Color después de la selección 【Color】", + "【selectedShadowColor】: Color de sombra después de la selección 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json new file mode 100644 index 00000000..bca9e2e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtre puce", + "info": "Un style similaire au composant Chip, avec des propriétés de sélection et des événements de sélection. Lorsqu'il est sélectionné, une superposition de ✔️ apparaît sur le composant de gauche.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip peut accepter des événements de sélection", + "desc": [ + "【selected】: Sélectionné ou non 【bool】", + "【onSelected】: Événement de sélection 【Function(bool)】", + "【selectedColor】: Couleur après sélection 【Color】", + "【selectedShadowColor】: Couleur de l'ombre après sélection 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json new file mode 100644 index 00000000..7d643b69 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtro Chip", + "info": "Stile simile al componente Chip, con proprietà di selezione e evento di selezione. Quando selezionato, il livello superiore del componente a sinistra sarà coperto da ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip accetta eventi di selezione", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【onSelected】: Evento di selezione 【Function(bool)】", + "【selectedColor】: Colore dopo la selezione 【Color】", + "【selectedShadowColor】: Colore dell'ombra dopo la selezione 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json new file mode 100644 index 00000000..5bfbfd28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "フィルターチップ", + "info": "Chipコンポーネントと似たスタイルで、選択状態の属性と選択イベントを持ちます。選択時には左側のコンポーネントの上層に✔️が表示されます。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChipが選択イベントを受け入れる", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onSelected】: 選択イベント 【Function(bool)】", + "【selectedColor】: 選択後の色 【Color】", + "【selectedShadowColor】: 選択後の影の色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json new file mode 100644 index 00000000..54b96de4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "필터 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 선택 여부 속성과 선택 이벤트를 가지고 있습니다. 선택 시 왼쪽 컴포넌트 상단에 ✔️ 마스크가 적용됩니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip 선택 이벤트 수신 가능", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onSelected】: 선택 이벤트 【Function(bool)】", + "【selectedColor】: 선택 후 색상 【Color】", + "【selectedShadowColor】: 선택 후 그림자 색상 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json new file mode 100644 index 00000000..99a05f15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtro de Chip", + "info": "Estilo semelhante ao componente Chip, com propriedades de seleção e eventos de seleção. Quando selecionado, a camada superior do componente à esquerda será coberta por um ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip pode aceitar eventos de seleção", + "desc": [ + "【selected】: Se selecionado 【bool】", + "【onSelected】: Evento de seleção 【Function(bool)】", + "【selectedColor】: Cor após seleção 【Color】", + "【selectedShadowColor】: Cor da sombra após seleção 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json new file mode 100644 index 00000000..e6904c93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Фильтр-чип", + "info": "Стиль, аналогичный компоненту Chip, с атрибутом выбора и событием выбора. При выборе верхний слой левого компонента будет затенен ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip может принимать события выбора", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onSelected】: Событие выбора 【Function(bool)】", + "【selectedColor】: Цвет после выбора 【Color】", + "【selectedShadowColor】: Цвет тени после выбора 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json new file mode 100644 index 00000000..3c4aaf75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "过滤小条", + "info": "和Chip组件类似的样式,具有选中与否的属性和选中事件。当选中时左侧组件上层会被✔️遮罩。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip可接受选择事件", + "desc": [ + "【selected】: 是否选择 【bool】", + "【onSelected】: 选择事件 【Function(bool)】", + "【selectedColor】: 选择后的颜色 【Color】", + "【selectedShadowColor】: 选择后的阴影颜色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart new file mode 100644 index 00000000..ff56da99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart @@ -0,0 +1,72 @@ +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomFilterChip extends StatefulWidget { + const CustomFilterChip({Key? key}) : super(key: key); + + @override + _CustomFilterChipState createState() => _CustomFilterChipState(); +} + +class _CustomFilterChipState extends State { + final Map map = { + 'A': 'Ant', + 'B': 'Bug', + 'C': 'Cat', + 'D': 'Dog', + }; + final List _selected = []; + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Wrap( + children: map.keys.map((key) => _buildChild(themeColor,key)).toList(), + ), + Container( + padding: const EdgeInsets.all(10), + child: Text('您已选择: ${_selected.join(', ')}')), + ], + ); + } + + Padding _buildChild( Color themeColor,String key) { + bool select = _selected.contains(map[key]); + return Padding( + padding: const EdgeInsets.all(4.0), + child: FilterChip( + selectedColor: themeColor, + selectedShadowColor: Colors.blue, + side: BorderSide.none, + shadowColor: themeColor, + pressElevation: 5, + elevation: 2, + avatarBoxConstraints: BoxConstraints( + maxWidth: 22,maxHeight: 22 + ), + checkmarkColor: select?Colors.white:null, + avatar: CircleAvatar( + backgroundColor: select?Colors.blueAccent:null, + child: Text(key,style: TextStyle(fontSize: 12,color: select?Colors.transparent:null),)), + label: Text(map[key]!,style: TextStyle(color: select?Colors.white:null),), + selected: select, + onSelected: (bool value) => _onSelected(value, key), + ), + ); + } + + void _onSelected(bool value, String key) { + setState(() { + if (value) { + _selected.add(map[key]!); + } else { + _selected.removeWhere((name) => name == map[key]); + } + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json new file mode 100644 index 00000000..5d8b7685 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Flacher Button", + "info": "Ein flacher Button ohne Schatten, basierend auf MaterialButton. Alle Eigenschaften ähneln denen von MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton-Klickereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【child】: Untergeordnete Komponente 【Widget】", + "【textColor】: Textfarbe der untergeordneten Komponente 【Color】", + "【highlightColor】: Hervorhebungsfarbe beim Langdrücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klickereignis 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton wurde in Flutter 3.3 ausgemustert. Der Ersatz ist der ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json new file mode 100644 index 00000000..b342c431 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Flat Button", + "info": "A flat button without shadows, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Splash Color 【Color】", + "【child】: Child Widget 【Widget】", + "【textColor】: Text Color of Child Widget 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton was phased out in Flutter 3.3. Its successor is the ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json new file mode 100644 index 00000000..94f2a9da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Botón Plano", + "info": "Botón plano sin sombra, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de FlatButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【child】: Widget hijo 【Widget】", + "【textColor】: Color del texto del widget hijo 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón FlatButton dejó de estar disponible en Flutter 3.3. Su reemplazo es el botón ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json new file mode 100644 index 00000000..b185806c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Bouton plat", + "info": "Bouton plat sans ombre, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic de FlatButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton FlatButton a quitté la scène historique avec Flutter 3.3. Il est remplacé par le bouton ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json new file mode 100644 index 00000000..5b0b62b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Pulsante piatto", + "info": "Pulsante piatto senza ombre, implementato basandosi su MaterialButton, tutte le proprietà sono simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic FlatButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore effetto ondulazione 【Color】", + "【child】: Componente figlio 【Widget】", + "【textColor】: Colore testo componente figlio 【Color】", + "【highlightColor】: Colore evidenziazione pressione prolungata 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante FlatButton è uscito di scena con Flutter 3.3. Il suo sostituto è il pulsante ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json new file mode 100644 index 00000000..438bf3a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "フラットボタン", + "info": "影のないフラットボタンで、MaterialButtonを基に実装されており、すべてのプロパティはMaterialButtonと類似しています。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【child】: 子コンポーネント 【Widget】", + "【textColor】: 子コンポーネントの文字色 【Color】", + "【highlightColor】: 長押しハイライト色 【Color】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton ボタンは Flutter3.3 で歴史の舞台から退きました。代替は ElevatedButton ボタンです。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json new file mode 100644 index 00000000..b862cd0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "평평한 버튼", + "info": "그림자가 없는 평평한 버튼으로, MaterialButton을 기반으로 구현되었으며 모든 속성이 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 내부 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton 버튼은 Flutter3.3에서 더 이상 사용되지 않습니다. 대체 버튼은 ElevatedButton입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json new file mode 100644 index 00000000..2177fd12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Botão Plano", + "info": "Botão plano sem sombra, implementado com base no MaterialButton, todas as propriedades são semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do FlatButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【child】: Componente filho 【Widget】", + "【textColor】: Cor do texto do componente filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão FlatButton foi descontinuado no Flutter 3.3. O substituto é o botão ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json new file mode 100644 index 00000000..1fd459f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Плоская кнопка", + "info": "Плоская кнопка без тени, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия FlatButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвол водной ряби 【Color】", + "【child】: Дочерний компонент 【Widget】", + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка FlatButton ушла с исторической сцены в Flutter3.3. Ее заменила кнопка ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json new file mode 100644 index 00000000..acf03901 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "平按钮", + "info": "无阴影的平按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart new file mode 100644 index 00000000..096d961d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class CustomFlatButton extends StatelessWidget { + const CustomFlatButton({Key? key}) : super(key: key); + + final String info = + 'FlatButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json new file mode 100644 index 00000000..c88bf31e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Schwebende Schaltfläche", + "info": "Schwebende Schaltfläche, die normalerweise in Scaffold verwendet wird und an einer bestimmten Position platziert werden kann. Kann ein Unterelement enthalten, empfängt Klicks, und kann Farbe, Form usw. definieren.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton Klickereignis", + "desc": [ + "【child】: Unterelement 【Widget】", + "【tooltip】: Tooltip-Text bei langem Drücken 【String】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【foregroundColor】: Vordergrundfarbe 【Color】", + "【elevation】: Schattentiefe 【double】", + "【onPressed】: Klickereignis 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini Eigenschaft", + "desc": [ + "【mini】: Ist es mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape Eigenschaft", + "desc": [ + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json new file mode 100644 index 00000000..2da1d546 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Floating Button", + "info": "Floating button, generally used in Scaffold, can be placed in a specific position. It can contain a child widget, receive clicks, and define colors, shapes, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton Click Event", + "desc": [ + "【child】: Child widget 【Widget】", + "【tooltip】: Tooltip text when long pressed 【String】", + "【backgroundColor】: Background color 【Color】", + "【foregroundColor】: Foreground color 【Color】", + "【elevation】: Elevation 【double】", + "【onPressed】: Click event 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini Property", + "desc": [ + "【mini】: Whether it is mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape Property", + "desc": [ + "【shape】: Shape 【ShapeBorder】" + ] +} + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json new file mode 100644 index 00000000..4b951eab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Botón flotante", + "info": "Botón flotante, generalmente utilizado en Scaffold, se puede colocar en una posición específica. Puede contener un componente secundario, recibir clics, definir colores, formas, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de FloatingActionButton", + "desc": [ + "【child】: Componente secundario 【Widget】", + "【tooltip】: Texto de sugerencia al mantener presionado 【String】", + "【backgroundColor】: Color de fondo 【Color】", + "【foregroundColor】: Color de primer plano 【Color】", + "【elevation】: Profundidad de sombra 【double】", + "【onPressed】: Evento de clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propiedad mini", + "desc": [ + "【mini】: Si es mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propiedad shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json new file mode 100644 index 00000000..b24c5798 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Bouton flottant", + "info": "Le bouton flottant, généralement utilisé dans Scaffold, peut être placé à un endroit spécifique. Il peut contenir un composant enfant, recevoir des clics, et définir des couleurs, des formes, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic du FloatingActionButton", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【tooltip】: Texte d'aide lors d'un appui long 【String】", + "【backgroundColor】: Couleur de fond 【Color】", + "【foregroundColor】: Couleur de premier plan 【Color】", + "【elevation】: Profondeur de l'ombre 【double】", + "【onPressed】: Événement de clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propriété mini", + "desc": [ + "【mini】: Est-ce un mini bouton 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propriété de forme", + "desc": [ + "【shape】: Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json new file mode 100644 index 00000000..8df3b178 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Pulsante galleggiante", + "info": "Il pulsante galleggiante, generalmente utilizzato in Scaffold, può essere posizionato in una posizione specifica. Può contenere un componente figlio, ricevere clic, definire colori, forme, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di FloatingActionButton", + "desc": [ + "【child】: Componente figlio 【Widget】", + "【tooltip】: Testo di suggerimento durante la pressione prolungata 【String】", + "【backgroundColor】: Colore di sfondo 【Color】", + "【foregroundColor】: Colore di primo piano 【Color】", + "【elevation】: Profondità dell'ombra 【double】", + "【onPressed】: Evento di clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Proprietà mini", + "desc": [ + "【mini】: Se è mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Proprietà shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json new file mode 100644 index 00000000..8155c565 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "フローティングボタン", + "info": "フローティングボタンは、一般にScaffold内で使用され、特定の位置に配置できます。子コンポーネントを収容し、クリックを受け取り、色や形状などを定義できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButtonクリックイベント", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【tooltip】: 長押し時のヒントテキスト 【String】", + "【backgroundColor】: 背景色 【Color】", + "【foregroundColor】: 前景色 【Color】", + "【elevation】: 影の深さ 【double】", + "【onPressed】: クリックイベント 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "miniプロパティ", + "desc": [ + "【mini】: ミニかどうか 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shapeプロパティ", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json new file mode 100644 index 00000000..4626b1fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "플로팅 버튼", + "info": "플로팅 버튼은 일반적으로 Scaffold에서 사용되며 특정 위치에 배치할 수 있습니다. 하나의 자식 위젯을 포함할 수 있으며, 클릭 이벤트를 받고 색상, 모양 등을 정의할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton 클릭 이벤트", + "desc": [ + "【child】: 자식 위젯 【Widget】", + "【tooltip】: 길게 누를 때 표시되는 텍스트 【String】", + "【backgroundColor】: 배경색 【Color】", + "【foregroundColor】: 전경색 【Color】", + "【elevation】: 그림자 깊이 【double】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini 속성", + "desc": [ + "【mini】: 미니 여부 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape 속성", + "desc": [ + "【shape】: 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json new file mode 100644 index 00000000..c49411f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Botão Flutuante", + "info": "Botão flutuante, geralmente usado em Scaffold, pode ser colocado em uma posição específica. Pode conter um componente filho, receber cliques, e definir cor, forma, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do FloatingActionButton", + "desc": [ + "【child】: Componente filho 【Widget】", + "【tooltip】: Texto de dica ao pressionar 【String】", + "【backgroundColor】: Cor de fundo 【Color】", + "【foregroundColor】: Cor de frente 【Color】", + "【elevation】: Profundidade da sombra 【double】", + "【onPressed】: Evento de clique 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propriedade mini", + "desc": [ + "【mini】: É mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propriedade shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json new file mode 100644 index 00000000..e60f0cb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Плавающая кнопка", + "info": "Плавающая кнопка, обычно используется в Scaffold, может быть размещена в определенном месте. Может содержать один дочерний компонент, принимает клики, может определять цвет, форму и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия FloatingActionButton", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【tooltip】: Текст подсказки при долгом нажатии 【String】", + "【backgroundColor】: Цвет фона 【Color】", + "【foregroundColor】: Цвет переднего плана 【Color】", + "【elevation】: Глубина тени 【double】", + "【onPressed】: Событие нажатия 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Свойство mini", + "desc": [ + "【mini】: Является ли мини 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Свойство shape", + "desc": [ + "【shape】: Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json new file mode 100644 index 00000000..71c3705e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "浮动按钮", + "info": "浮动按钮,一般用于Scaffold中,可摆放在特定位置。可盛放一个子组件,接收点击、可定义颜色、形状等。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton点击事件", + "desc": [ + "【child】: 子组件 【Widget】", + "【tooltip】: 长按时提示文字 【String】", + "【backgroundColor】: 背景色 【Color】", + "【foregroundColor】: 前景色 【Color】", + "【elevation】: 影深 【double】", + "【onPressed】: 点击事件 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini属性", + "desc": [ + "【mini】: 是否是迷你 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape属性", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart new file mode 100644 index 00000000..e55a4678 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart @@ -0,0 +1,29 @@ +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomFAB extends StatelessWidget { + const CustomFAB({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Map data = { + Colors.red: Icons.add, + Colors.blue: Icons.bluetooth, + Colors.green: Icons.android, + }; + return Wrap( + spacing: 20, + children: data.keys + .map((e) => FloatingActionButton( + heroTag: e.toString()+"a", + onPressed: () {}, + backgroundColor: e, + foregroundColor: Colors.white, + child: Icon(data[e]), + tooltip: "android", + elevation: 5, //z-阴影盖度 + )).toList()); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart similarity index 82% rename from packages/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart index e6750998..0478fa29 100644 --- a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart @@ -1,12 +1,6 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 2, -// "name": "mini属性", -// "subtitle": "【mini】: 是否是迷你 【bool】", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart new file mode 100644 index 00000000..4aa0083c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart @@ -0,0 +1,57 @@ + + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + + +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:widgets/utils/pather.dart'; + +class ShapeFAB extends StatelessWidget { + const ShapeFAB({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Map data = { + Colors.red: Icons.add, + Colors.blue: Icons.bluetooth, + Colors.green: Icons.android, + }; + return Wrap( + spacing: 20, + children: data.keys + .map((e) => FloatingActionButton( + heroTag: e.toString()+"c", + onPressed: () {}, + backgroundColor: e, + shape: StarBorder(), + foregroundColor: Colors.white, + child: Icon(data[e]), + tooltip: "android", + elevation: 5, + )).toList()); + } +} + +/// 边线形状类 +class StarBorder extends ShapeBorder { + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) => Path(); + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) { + return Pather.create.nStarPath(20, 25, 25 * cos((360 / 9 / 2) * pi / 180), + dx: rect.height / 2, dy: rect.width / 2); + } + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {} + + @override + ShapeBorder scale(double t) => this; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json new file mode 100644 index 00000000..b16aa1cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter-Logo", + "info": "Wird verwendet, um die Flutter-Logo-Komponente anzuzeigen. Kann Farbe, Größe, Anzeigemodus usw. definieren. Es ist eine sehr einfache Komponente.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wird verwendet, um ein FlutterLogo anzuzeigen", + "desc": [ + "【size】 : Größe 【double】", + "【colors】: Farbe 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil wird verwendet, um Text anzuzeigen", + "desc": [ + "【style】 : Stil-3 Arten von Aufzählungen 【FlutterLogoStyle】", + "【textColor】: Textfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json new file mode 100644 index 00000000..df16eb50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter Icon", + "info": "Used to display the Flutter icon component. You can define color, size, display mode, and other information. It is a very simple component.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a FlutterLogo", + "desc": [ + "【size】 : Size 【double】", + "【colors】: Color 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style used to display text", + "desc": [ + "【style】 : Style - 3 types of enumeration 【FlutterLogoStyle】", + "【textColor】: Text color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json new file mode 100644 index 00000000..eeb38b9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Logotipo de Flutter", + "info": "Se utiliza para mostrar el componente del logotipo de Flutter. Puede definir información como el color, el tamaño, el modo de visualización, etc. Es un componente muy simple.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Se utiliza para mostrar un logotipo de Flutter", + "desc": [ + "【size】 : Tamaño 【double】", + "【colors】: Color 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo utilizado para mostrar texto", + "desc": [ + "【style】 : Estilo - 3 tipos de enumeración 【FlutterLogoStyle】", + "【textColor】: Color del texto 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json new file mode 100644 index 00000000..2f5331ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Icône Flutter", + "info": "Utilisé pour afficher le composant d'icône Flutter. Permet de définir des informations telles que la couleur, la taille, le mode d'affichage, etc. C'est un composant très simple.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher un FlutterLogo", + "desc": [ + "【size】 : Taille 【double】", + "【colors】: Couleur 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style utilisé pour afficher du texte", + "desc": [ + "【style】 : Style - 3 types d'énumération 【FlutterLogoStyle】", + "【textColor】: Couleur du texte 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json new file mode 100644 index 00000000..808ae853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Icona Flutter", + "info": "Utilizzato per mostrare il componente dell'icona Flutter. È possibile definire colore, dimensioni, modalità di visualizzazione, ecc. È un componente molto semplice.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un FlutterLogo", + "desc": [ + "【size】 : Dimensione 【double】", + "【colors】: Colore 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile utilizzato per visualizzare il testo", + "desc": [ + "【style】 : Stile - 3 tipi di enumerazione 【FlutterLogoStyle】", + "【textColor】: Colore del testo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json new file mode 100644 index 00000000..74293541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutterアイコン", + "info": "Flutterアイコンコンポーネントを表示するために使用されます。色、サイズ、表示モードなどの情報を定義でき、非常にシンプルなコンポーネントです。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlutterLogoを表示するために使用", + "desc": [ + "【size】 : サイズ 【double】", + "【colors】: 色 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "テキストを表示するためのスタイル", + "desc": [ + "【style】 : スタイル-3種類の列挙 【FlutterLogoStyle】", + "【textColor】: テキストの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json new file mode 100644 index 00000000..b9b2f8db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter 로고", + "info": "Flutter 로고 컴포넌트를 표시하는 데 사용됩니다. 색상, 크기, 표시 모드 등을 정의할 수 있는 매우 간단한 컴포넌트입니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlutterLogo를 표시하는 데 사용", + "desc": [ + "【size】 : 크기 【double】", + "【colors】: 색상 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "텍스트 표시를 위한 스타일", + "desc": [ + "【style】 : 스타일-3가지 열거 【FlutterLogoStyle】", + "【textColor】: 텍스트 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json new file mode 100644 index 00000000..74bd56ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Ícone do Flutter", + "info": "Usado para exibir o componente de ícone do Flutter. Pode definir cor, tamanho, modo de exibição e outras informações, é um componente muito simples.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um FlutterLogo", + "desc": [ + "【size】 : Tamanho 【double】", + "【colors】: Cor 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo usado para exibir texto", + "desc": [ + "【style】 : Estilo - 3 tipos de enumeração 【FlutterLogoStyle】", + "【textColor】: Cor do texto 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json new file mode 100644 index 00000000..d40a8818 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Логотип Flutter", + "info": "Используется для отображения компонента логотипа Flutter. Можно определить цвет, размер, режим отображения и другую информацию. Это очень простой компонент.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Используется для отображения логотипа Flutter", + "desc": [ + "【size】 : Размер 【double】", + "【colors】: Цвет 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль для отображения текста", + "desc": [ + "【style】 : Стиль-3 типа перечисления 【FlutterLogoStyle】", + "【textColor】: Цвет текста 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json new file mode 100644 index 00000000..10eea5bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter图标", + "info": "用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个FlutterLogo", + "desc": [ + "【size】 : 大小 【double】", + "【colors】: 颜色 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "样式用于显示文字", + "desc": [ + "【style】 : 样式-3种枚举 【FlutterLogoStyle】", + "【textColor】: 文字颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart new file mode 100644 index 00000000..aa5bec8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart @@ -0,0 +1,28 @@ + + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class CustomFlutterLogo extends StatelessWidget { + const CustomFlutterLogo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + + Map data = { + Colors.blue:50.0, + Colors.red:60.0, + Colors.green:70.0, + Colors.yellow:80.0, + }; + return Wrap( + children: data.keys + .map((e) => FlutterLogo( + size: data[e], + textColor: e, + )).toList(), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart new file mode 100644 index 00000000..ace614eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-26 +/// contact me by email 1981462002@qq.com + +class FlutterLogoWithText extends StatelessWidget { + const FlutterLogoWithText({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final Map data = { + FlutterLogoStyle.horizontal: Colors.blue, + FlutterLogoStyle.markOnly: Colors.red, + FlutterLogoStyle.stacked: Colors.green, + }; + + return Wrap( + spacing: 20, + children: data.keys + .map((FlutterLogoStyle style) => FlutterLogo( + size: 80, + style: style, + textColor: data[style]!, + )) + .toList(), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json new file mode 100644 index 00000000..40f67dd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Gesten-Erkenner", + "info": "Komponente zur Erkennung von Gestenereignissen, kann Klicks, lange Drücke, Doppelklicks, Drücken, Loslassen, Bewegen usw. erkennen und kann Informationen über die Berührungspunkte abrufen. Ein unverzichtbares Werkzeug für zu Hause und unterwegs.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Ereignisse von GestureDetector", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klick-Ereignis 【Function()】", + "【onDoubleTap】 : Doppelklick-Ereignis 【GestureTapCallback】", + "【onLongPress】 : Langer Druck-Ereignis 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Details von GestureDetector", + "desc": [ + "【onTapDown】 : Rückruf beim Drücken 【GestureTapDownCallback】", + "【onTapUp】 : Rückruf beim Loslassen 【GestureTapUpCallback】", + "【onTapCancel】 : Klick abbrechen 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Pan-Ereignisse von GestureDetector", + "desc": [ + "【onPanDown】 : Rückruf beim Drücken 【GestureDragDownCallback】", + "【onPanEnd】 : Ende des Ziehens 【GestureDragEndCallback】", + "【onPanStart】 : Beginn des Ziehens 【GestureDragStartCallback】", + "【onPanUpdate】 : Aktualisierung des Ziehens 【GestureDragUpdateCallback】", + "【onPanCancel】 : Ziehen abbrechen 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json new file mode 100644 index 00000000..33b508da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Gesture Detector", + "info": "A detector for component gesture events, capable of accepting events such as tap, long press, double tap, press, release, move, etc., and can obtain touch information. An essential component for home and travel.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of GestureDetector", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Tap event 【Function()】", + "【onDoubleTap】 : Double tap event 【GestureTapCallback】", + "【onLongPress】 : Long press event 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Details of GestureDetector", + "desc": [ + "【onTapDown】 : Press down callback 【GestureTapDownCallback】", + "【onTapUp】 : Tap release callback 【GestureTapUpCallback】", + "【onTapCancel】 : Tap cancel 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Pan Events of GestureDetector", + "desc": [ + "【onPanDown】 : Press down callback 【GestureDragDownCallback】", + "【onPanEnd】 : Drag end 【GestureDragEndCallback】", + "【onPanStart】 : Drag start 【GestureDragStartCallback】", + "【onPanUpdate】 : Drag update 【GestureDragUpdateCallback】", + "【onPanCancel】 : Drag cancel 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json new file mode 100644 index 00000000..25e66c3a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Detector de gestos", + "info": "Detector de eventos de gestos del componente, puede aceptar eventos como clics, pulsaciones largas, doble clic, presionar, soltar, mover, etc., y puede obtener información de los puntos de contacto, un componente esencial para viajes y hogar.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de GestureDetector", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【GestureTapCallback】", + "【onLongPress】 : Evento de pulsación larga 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Información detallada de GestureDetector", + "desc": [ + "【onTapDown】 : Callback de presionar 【GestureTapDownCallback】", + "【onTapUp】 : Callback de levantar el clic 【GestureTapUpCallback】", + "【onTapCancel】 : Cancelar clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventos Pan de GestureDetector", + "desc": [ + "【onPanDown】 : Callback de presionar 【GestureDragDownCallback】", + "【onPanEnd】 : Fin de arrastre 【GestureDragEndCallback】", + "【onPanStart】 : Inicio de arrastre 【GestureDragStartCallback】", + "【onPanUpdate】 : Actualización de arrastre 【GestureDragUpdateCallback】", + "【onPanCancel】 : Cancelar arrastre 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json new file mode 100644 index 00000000..1d3b40ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Détecteur de gestes", + "info": "Détecteur d'événements gestuels pour les composants, peut accepter des événements tels que le clic, le maintien, le double-clic, l'appui, le relâchement, le déplacement, et peut obtenir des informations sur les points de contact, un composant essentiel pour les voyages à domicile.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de GestureDetector", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【GestureTapCallback】", + "【onLongPress】 : Événement de maintien 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Informations détaillées de GestureDetector", + "desc": [ + "【onTapDown】 : Rappel d'appui 【GestureTapDownCallback】", + "【onTapUp】 : Rappel de relâchement 【GestureTapUpCallback】", + "【onTapCancel】 : Annulation de clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Événements Pan de GestureDetector", + "desc": [ + "【onPanDown】 : Rappel d'appui 【GestureDragDownCallback】", + "【onPanEnd】 : Fin de glissement 【GestureDragEndCallback】", + "【onPanStart】 : Début de glissement 【GestureDragStartCallback】", + "【onPanUpdate】 : Mise à jour de glissement 【GestureDragUpdateCallback】", + "【onPanCancel】 : Annulation de glissement 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json new file mode 100644 index 00000000..2b481e78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Rilevatore di gesti", + "info": "Rilevatore di eventi gestuali del componente, può accettare eventi come clic, pressione lunga, doppio clic, premuto, rilasciato, spostamento, ecc., e può ottenere informazioni sui punti di contatto, un componente essenziale per viaggi e casa.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di GestureDetector", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【GestureTapCallback】", + "【onLongPress】 : Evento di pressione lunga 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Dettagli di GestureDetector", + "desc": [ + "【onTapDown】 : Callback di pressione 【GestureTapDownCallback】", + "【onTapUp】 : Callback di rilascio del clic 【GestureTapUpCallback】", + "【onTapCancel】 : Annullamento del clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventi Pan di GestureDetector", + "desc": [ + "【onPanDown】 : Callback di pressione 【GestureDragDownCallback】", + "【onPanEnd】 : Fine del trascinamento 【GestureDragEndCallback】", + "【onPanStart】 : Inizio del trascinamento 【GestureDragStartCallback】", + "【onPanUpdate】 : Aggiornamento del trascinamento 【GestureDragUpdateCallback】", + "【onPanCancel】 : Annullamento del trascinamento 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json new file mode 100644 index 00000000..4f3f9f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "ジェスチャー検出器", + "info": "コンポーネントのジェスチャーイベントを検出するデテクターで、クリック、長押し、ダブルクリック、押下、解放、移動などのイベントを受け取り、タッチポイントの情報を取得できます。家庭や旅行に必須のコンポーネントです。", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【GestureTapCallback】", + "【onLongPress】 : 長押しイベント 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector詳細情報", + "desc": [ + "【onTapDown】 : 押下コールバック 【GestureTapDownCallback】", + "【onTapUp】 : クリック解放コールバック 【GestureTapUpCallback】", + "【onTapCancel】 : クリックキャンセル 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetectorのPanイベント", + "desc": [ + "【onPanDown】 : 押下コールバック 【GestureDragDownCallback】", + "【onPanEnd】 : ドラッグ終了 【GestureDragEndCallback】", + "【onPanStart】 : ドラッグ開始 【GestureDragStartCallback】", + "【onPanUpdate】 : ドラッグ更新 【GestureDragUpdateCallback】", + "【onPanCancel】 : ドラッグキャンセル 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json new file mode 100644 index 00000000..520768ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "제스처 감지기", + "info": "컴포넌트 제스처 이벤트를 감지하는 장치로, 클릭, 길게 누르기, 더블 클릭, 누르기, 떼기, 이동 등의 이벤트를 받아들일 수 있으며, 접촉점 정보를 얻을 수 있습니다. 집에서 여행할 때 필수 컴포넌트입니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector 기본 이벤트", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【GestureTapCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector 상세 정보", + "desc": [ + "【onTapDown】 : 누르기 콜백 【GestureTapDownCallback】", + "【onTapUp】 : 클릭 떼기 콜백 【GestureTapUpCallback】", + "【onTapCancel】 : 클릭 취소 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetector의 Pan 이벤트", + "desc": [ + "【onPanDown】 : 누르기 콜백 【GestureDragDownCallback】", + "【onPanEnd】 : 드래그 종료 【GestureDragEndCallback】", + "【onPanStart】 : 드래그 시작 【GestureDragStartCallback】", + "【onPanUpdate】 : 드래그 업데이트 【GestureDragUpdateCallback】", + "【onPanCancel】 : 드래그 취소 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json new file mode 100644 index 00000000..f53b6704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Detector de Gestos", + "info": "Detector de eventos de gestos do componente, pode aceitar eventos como clique, pressionamento longo, duplo clique, pressionar, soltar, mover, etc., e pode obter informações de toque, um componente essencial para viagens e uso doméstico.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do GestureDetector", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【GestureTapCallback】", + "【onLongPress】 : Evento de pressionamento longo 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Detalhes do GestureDetector", + "desc": [ + "【onTapDown】 : Callback de pressionar 【GestureTapDownCallback】", + "【onTapUp】 : Callback de soltar o clique 【GestureTapUpCallback】", + "【onTapCancel】 : Cancelamento do clique 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventos de Pan do GestureDetector", + "desc": [ + "【onPanDown】 : Callback de pressionar 【GestureDragDownCallback】", + "【onPanEnd】 : Fim do arrasto 【GestureDragEndCallback】", + "【onPanStart】 : Início do arrasto 【GestureDragStartCallback】", + "【onPanUpdate】 : Atualização do arrasto 【GestureDragUpdateCallback】", + "【onPanCancel】 : Cancelamento do arrasto 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json new file mode 100644 index 00000000..0ee8016d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Детектор жестов", + "info": "Детектор событий жестов компонента, который может принимать события, такие как нажатие, долгое нажатие, двойное нажатие, нажатие, отпускание, перемещение и т.д., а также может получать информацию о точках касания. Незаменимый компонент для домашнего использования и путешествий.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события GestureDetector", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【GestureTapCallback】", + "【onLongPress】 : Событие долгого нажатия 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Детальная информация GestureDetector", + "desc": [ + "【onTapDown】 : Обратный вызов нажатия 【GestureTapDownCallback】", + "【onTapUp】 : Обратный вызов отпускания нажатия 【GestureTapUpCallback】", + "【onTapCancel】 : Отмена нажатия 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "События Pan GestureDetector", + "desc": [ + "【onPanDown】 : Обратный вызов нажатия 【GestureDragDownCallback】", + "【onPanEnd】 : Завершение перетаскивания 【GestureDragEndCallback】", + "【onPanStart】 : Начало перетаскивания 【GestureDragStartCallback】", + "【onPanUpdate】 : Обновление перетаскивания 【GestureDragUpdateCallback】", + "【onPanCancel】 : Отмена перетаскивания 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json new file mode 100644 index 00000000..483a6bd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "手势监听器", + "info": "组件手势事件的检测器,可接受点击、长按、双击,按下、松开、移动等事件,并可以获取触点信息,居家旅行必备组件。", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【GestureTapCallback】", + "【onLongPress】 : 长按事件 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector详情信息", + "desc": [ + "【onTapDown】 : 按下回调 【GestureTapDownCallback】", + "【onTapUp】 : 点击抬起回调 【GestureTapUpCallback】", + "【onTapCancel】 : 点击取消 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetector的Pan事件", + "desc": [ + "【onPanDown】 : 按下回调 【GestureDragDownCallback】", + "【onPanEnd】 : 拖动结束 【GestureDragEndCallback】", + "【onPanStart】 : 开始拖动 【GestureDragStartCallback】", + "【onPanUpdate】 : 拖动更新 【GestureDragUpdateCallback】", + "【onPanCancel】 : 拖动取消 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart new file mode 100644 index 00000000..b9f20e61 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class CustomGestureDetector extends StatefulWidget { + const CustomGestureDetector({Key? key}) : super(key: key); + + @override + _CustomGestureDetectorState createState() => _CustomGestureDetectorState(); +} + +class _CustomGestureDetectorState extends State { + String _info = ''; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => setState(() => _info = 'onTap'), + onDoubleTap: () => setState(() => _info = 'onDoubleTap'), + onLongPress: () => setState(() => _info = 'onLongPress'), + child: Container( + alignment: Alignment.center, + width: 300, + height: 300 * 0.4, + color: Colors.grey.withAlpha(33), + child: Text( + _info, + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart new file mode 100644 index 00000000..c9d42241 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class TapGestureDetector extends StatefulWidget { + const TapGestureDetector({Key? key}) : super(key: key); + + @override + _TapGestureDetectorState createState() => _TapGestureDetectorState(); +} + +class _TapGestureDetectorState extends State { + String _info = ''; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTapDown: (detail) => setState(() => _info = + 'onTapDown:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), + onTapUp: (detail) => setState(() => _info = + 'onTapUp:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), + onTapCancel: () => setState(() => _info = 'onTapCancel'), + child: Container( + alignment: Alignment.center, + width: 300, + height: 300 * 0.618, + color: Colors.grey.withAlpha(33), + child: Text( + _info, + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart new file mode 100644 index 00000000..34558bb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class PanGestureDetector extends StatefulWidget { + const PanGestureDetector({Key? key}) : super(key: key); + + @override + _PanGestureDetectorState createState() => _PanGestureDetectorState(); +} + +class _PanGestureDetectorState extends State { + String _info = ''; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onPanDown: (detail) => setState(() => _info = + 'onPanDown:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), + onPanEnd: (detail) => setState(() => _info = + 'onPanEnd:\n初速度:${detail.primaryVelocity}\n最终速度:${detail.velocity}'), + onPanUpdate: (detail) => setState(() => _info = + 'onPanUpdate:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), + onPanStart: (detail) => setState(() => _info = + 'onPanStart:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), + onPanCancel: () => setState(() => _info = 'onTapCancel'), + child: SingleChildScrollView( + child: Container( + alignment: Alignment.center, + width: 300, + height: 300 * 0.618, + color: Colors.grey.withAlpha(33), + child: Text( + _info, + style: const TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json new file mode 100644 index 00000000..5bc18b0f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Rasterlinien-Komponente", + "info": "Kann eine Komponente aufnehmen und ein Raster darauf zeichnen. Eigenschaften wie Farbe, Linienstärke, Abstand usw. können angegeben werden.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager Grundlegende Eigenschaften", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【color】: Farbe 【Color】", + "【interval】: Seitenlänge des kleinen Blocks 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager Unterteilung", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【color】: Farbe 【Color】", + "【subdivisions】: Anzahl der Unterblöcke im kleinen Block 【int】", + "【divisions】: Anzahl der Unterteilungen der Unterblöcke im kleinen Block 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json new file mode 100644 index 00000000..6b1cffee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Grid Line Component", + "info": "Can contain a component and draw a grid on it. Properties such as color, line width, spacing, etc., can be specified.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager Basic Properties", + "desc": [ + "【child】: Child component 【Widget】", + "【color】: Color 【Color】", + "【interval】: Small block side length 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager Subdivision", + "desc": [ + "【child】: Child component 【Widget】", + "【color】: Color 【Color】", + "【subdivisions】: Number of sub-blocks in a small block 【int】", + "【divisions】: Number of subdivisions of sub-blocks in a small block 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json new file mode 100644 index 00000000..82a72db5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente de líneas de cuadrícula", + "info": "Puede contener un componente y dibujar una cuadrícula en él. Se pueden especificar propiedades como el color, el ancho de la línea, el espaciado, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades básicas de GridPager", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【color】: Color 【Color】", + "【interval】: Longitud del lado del bloque pequeño 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivisión de GridPager", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【color】: Color 【Color】", + "【subdivisions】: Número de subbloques en el bloque pequeño 【int】", + "【divisions】: Número de divisiones de los subbloques en el bloque pequeño 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json new file mode 100644 index 00000000..04f0e9f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Composant de grille", + "info": "Peut contenir un composant et dessiner une grille dessus. Peut spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, l'espacement, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés de base de GridPager", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【color】: Couleur 【Color】", + "【interval】: Longueur du côté d'un petit bloc 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivision de GridPager", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【color】: Couleur 【Color】", + "【subdivisions】: Nombre de sous-blocs dans un petit bloc 【int】", + "【divisions】: Nombre de subdivisions des sous-blocs dans un petit bloc 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json new file mode 100644 index 00000000..34edfbc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente Griglia", + "info": "Può contenere un componente e disegnare una griglia su di esso. È possibile specificare proprietà come colore, spessore della linea, spaziatura, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà Base di GridPager", + "desc": [ + "【child】: Componente Figlio 【Widget】", + "【color】: Colore 【Color】", + "【interval】: Lunghezza del lato del blocco 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Suddivisione di GridPager", + "desc": [ + "【child】: Componente Figlio 【Widget】", + "【color】: Colore 【Color】", + "【subdivisions】: Numero di sotto-blocchi in un blocco 【int】", + "【divisions】: Numero di suddivisioni dei sotto-blocchi in un blocco 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json new file mode 100644 index 00000000..24f5b37d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "グリッド線コンポーネント", + "info": "1つのコンポーネントを収容し、その上にグリッドを描画します。色、線幅、間隔などの属性を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 基本属性", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【color】: 色 【Color】", + "【interval】: 小片の辺の長さ 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 再分割", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【color】: 色 【Color】", + "【subdivisions】: 小片中の中片の数 【int】", + "【divisions】: 小片中の中片の分割数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json new file mode 100644 index 00000000..a961488c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "그리드 라인 컴포넌트", + "info": "하나의 컴포넌트를 수용할 수 있으며, 그 위에 그리드를 그립니다. 색상, 선 두께, 간격 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 기본 속성", + "desc": [ + "【child】: 자식 컴포넌트 【Widget】", + "【color】: 색상 【Color】", + "【interval】: 작은 블록의 변 길이 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 재분할", + "desc": [ + "【child】: 자식 컴포넌트 【Widget】", + "【color】: 색상 【Color】", + "【subdivisions】: 작은 블록 내의 하위 블록 개수 【int】", + "【divisions】: 작은 블록 내의 하위 블록 분할 수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json new file mode 100644 index 00000000..dfdbfcf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente de Linhas de Grelha", + "info": "Pode conter um componente, desenhando uma grelha sobre ele. Pode especificar propriedades como cor, largura da linha, espaçamento, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades Básicas do GridPager", + "desc": [ + "【child】: Componente filho 【Widget】", + "【color】: Cor 【Color】", + "【interval】: Comprimento do lado do pequeno bloco 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivisão do GridPager", + "desc": [ + "【child】: Componente filho 【Widget】", + "【color】: Cor 【Color】", + "【subdivisions】: Número de sub-blocos no pequeno bloco 【int】", + "【divisions】: Número de divisões dos sub-blocos no pequeno bloco 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json new file mode 100644 index 00000000..39087b7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Компонент с сеткой", + "info": "Может содержать один компонент, на котором рисуется сетка. Можно указать такие свойства, как цвет, толщина линий, расстояние и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные свойства GridPager", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【color】: Цвет 【Color】", + "【interval】: Длина стороны квадрата 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Разделение GridPager", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【color】: Цвет 【Color】", + "【subdivisions】: Количество подблоков в квадрате 【int】", + "【divisions】: Количество разделений подблоков в квадрате 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json new file mode 100644 index 00000000..154fe340 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "网格线组件", + "info": "可容纳一个组件,在其上绘制网格。可指定颜色、线宽、间距等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 基础属性", + "desc": [ + "【child】: 子组件 【Widget】", + "【color】: 颜色 【Color】", + "【interval】: 小块边长 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 再分割", + "desc": [ + "【child】: 子组件 【Widget】", + "【color】: 颜色 【Color】", + "【subdivisions】: 小块中子块个数 【int】", + "【divisions】: 小块中子块的分割数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart new file mode 100644 index 00000000..173bc587 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class CustomGridPaper extends StatelessWidget { + const CustomGridPaper({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 100, + child: GridPaper( + color: Colors.red, + interval: 50, + child: Image.asset( + "assets/images/wy_300x200.webp", + fit: BoxFit.cover, + ))); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart new file mode 100644 index 00000000..3c7ee007 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class DivisionsGridPaper extends StatelessWidget { + const DivisionsGridPaper({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 100, + child: GridPaper( + color: Colors.red, + interval: 50, + divisions: 4, + subdivisions: 4, + child: Image.asset( + "assets/images/wy_300x200.webp", + fit: BoxFit.cover, + ))); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json new file mode 100644 index 00000000..08ad2e81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Rasterkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, kann Kopf-, Fuß- und Unterkomponenten angeben und wird häufig in Rasterlisten verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung von GridTile ist wie folgt", + "desc": [ + "【header】: Kopfkomponente 【Widget】", + "【child】: Unterkomponente 【Widget】", + "【footer】: Fußkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json new file mode 100644 index 00000000..a2693582 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Grid Tile", + "info": "A general list item structure provided by Flutter, which can specify header, footer, and child components, commonly used in grid lists.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of GridTile is as follows", + "desc": [ + "【header】: Header component 【Widget】", + "【child】: Child component 【Widget】", + "【footer】: Footer component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json new file mode 100644 index 00000000..80ba2b89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Mosaico de cuadrícula", + "info": "Una estructura de lista genérica proporcionada por Flutter que permite especificar componentes de cabecera, pie y secundarios, comúnmente utilizada en listas de cuadrícula.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de GridTile es la siguiente", + "desc": [ + "【header】: Componente de cabecera 【Widget】", + "【child】: Componente secundario 【Widget】", + "【footer】: Componente de pie 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json new file mode 100644 index 00000000..1cc76759 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Tuile de grille", + "info": "Une structure d'élément de liste générique fournie par Flutter, permettant de spécifier des composants de tête, de queue et enfants, souvent utilisée dans les listes en grille.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La représentation de base de GridTile est la suivante", + "desc": [ + "【header】: Composant de tête 【Widget】", + "【child】: Composant enfant 【Widget】", + "【footer】: Composant de pied 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json new file mode 100644 index 00000000..5d5022af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Piastrella a griglia", + "info": "Una struttura di voci di lista generica fornita da Flutter, che consente di specificare componenti di testa, coda e figlio, comunemente utilizzata nelle liste a griglia.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di GridTile è la seguente", + "desc": [ + "【header】: componente di testa 【Widget】", + "【child】: componente figlio 【Widget】", + "【footer】: componente di coda 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json new file mode 100644 index 00000000..9124ce39 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "グリッドタイル", + "info": "Flutterが提供する汎用リストエントリ構造で、ヘッダー、フッター、子コンポーネントを指定でき、グリッドリストでよく使用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileの基本的な表現は以下の通りです", + "desc": [ + "【header】: ヘッダーコンポーネント 【Widget】", + "【child】: 子コンポーネント 【Widget】", + "【footer】: フッターコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json new file mode 100644 index 00000000..9cf8a790 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "그리드 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 헤더, 푸터, 자식 컴포넌트를 지정할 수 있으며, 주로 그리드 목록에 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTile의 기본 표현은 다음과 같습니다", + "desc": [ + "【header】: 헤더 컴포넌트 【Widget】", + "【child】: 자식 컴포넌트 【Widget】", + "【footer】: 푸터 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json new file mode 100644 index 00000000..06300e45 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Azulejo de Grade", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, que permite especificar componentes de cabeçalho, rodapé e filhos, comumente usada em listas de grade.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do GridTile é a seguinte", + "desc": [ + "【header】: Componente de cabeçalho 【Widget】", + "【child】: Componente filho 【Widget】", + "【footer】: Componente de rodapé 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json new file mode 100644 index 00000000..6355dbdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Сетка плитки", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, которая позволяет указать компоненты заголовка, нижнего колонтитула и дочерние компоненты, часто используется в списках сеток.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление GridTile выглядит следующим образом", + "desc": [ + "【header】: Компонент заголовка 【Widget】", + "【child】: Дочерний компонент 【Widget】", + "【footer】: Компонент нижнего колонтитула 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json new file mode 100644 index 00000000..b55b947b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "网格瓦片", + "info": "Flutter提供的一个通用列表条目结构,可指定头、尾、子组件,常用于网格列表。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTile的基本表现如下", + "desc": [ + "【header】: 头组件 【Widget】", + "【child】: 子组件 【Widget】", + "【footer】: 脚组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart new file mode 100644 index 00000000..3d9e7e26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class CustomGridTile extends StatelessWidget { + const CustomGridTile({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 200, + child: GridTile( + header: GridTileBar( + backgroundColor: Colors.blue.withAlpha(120), + trailing: const Icon(Icons.star, color: Colors.red), + leading: const CircleAvatar( + backgroundImage: AssetImage("assets/images/wy_200x300.webp"), + ), + title: const Text("百里·巫缨"), + subtitle: const Text("倾国必倾城"), + ), + child: Opacity( + opacity: 0.5, + child: Image.asset("assets/images/sabar.webp", fit: BoxFit.cover), + ), + footer: const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + "ID:z\$ySX32&29", + style: TextStyle( + shadows: [ + Shadow( + color: Colors.blue, offset: Offset(.1, .1), blurRadius: 2), + ], + ), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json new file mode 100644 index 00000000..5948a854 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Gitterfliesenkopf", + "info": "Eine allgemeine Kopfstruktur, die von Flutter bereitgestellt wird, mit einer Struktur von links, Mitte und rechts. Komponenten können an den entsprechenden Positionen eingefügt werden, was eine einfache Handhabung spezifischer Einträge ermöglicht. Im Vergleich zu ListTile gibt es weniger Attribute.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung von GridTileBar ist wie folgt", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json new file mode 100644 index 00000000..e9db776e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Grid Tile Header", + "info": "A common header structure provided by Flutter, with a left-center-right layout. Components can be inserted into the corresponding positions, making it easy to handle specific items. Compared to ListTile, it has fewer properties.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of GridTileBar is as follows", + "desc": [ + "【leading】: Left component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【backgroundColor】: Background color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json new file mode 100644 index 00000000..28d06cce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra de mosaico de cuadrícula", + "info": "Flutter proporciona una estructura de encabezado común, con una estructura de izquierda, centro y derecha. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente. En comparación con ListTile, tiene menos atributos.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de GridTileBar es la siguiente", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【trailing】: Componente derecho 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【backgroundColor】: Color de fondo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json new file mode 100644 index 00000000..0cd45719 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barre de tuile de grille", + "info": "Une structure de tête générique fournie par Flutter, avec une structure gauche-centre-droite. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques, avec moins d'attributs que ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de GridTileBar est la suivante", + "desc": [ + "【leading】: Composant gauche 【Widget】", + "【trailing】: Composant de queue 【Widget】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json new file mode 100644 index 00000000..c43d5fb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra della piastrella della griglia", + "info": "Una struttura di intestazione generica fornita da Flutter, con una struttura sinistra-centro-destra. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendolo molto conveniente per gestire voci specifiche, con meno attributi rispetto a ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di GridTileBar è la seguente", + "desc": [ + "【leading】: Componente sinistro 【Widget】", + "【trailing】: Componente destro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json new file mode 100644 index 00000000..334e2d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "グリッドタイルバー", + "info": "Flutterが提供する一般的なヘッダー構造で、左中右の構造です。対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。ListTileと比較して、属性が少ないです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBarの基本的な表現は以下の通りです", + "desc": [ + "【leading】: 左側のコンポーネント 【Widget】", + "【trailing】: 右側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【backgroundColor】: 背景色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json new file mode 100644 index 00000000..239ae928 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "그리드 타일 헤더", + "info": "Flutter에서 제공하는 일반적인 헤더 구조로, 왼쪽, 중앙, 오른쪽 구조를 가지고 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있으며, ListTile에 비해 속성이 적습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBar의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【backgroundColor】: 배경색 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json new file mode 100644 index 00000000..c130ca60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra de Azulejo de Grade", + "info": "Uma estrutura de cabeçalho genérica fornecida pelo Flutter, com uma estrutura de esquerda, centro e direita. Componentes podem ser inseridos nas posições correspondentes, o que facilita a adaptação a itens específicos, com menos atributos em comparação com o ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A representação básica do GridTileBar é a seguinte", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【trailing】: Componente direito 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【backgroundColor】: Cor de fundo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json new file mode 100644 index 00000000..39586e3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Сетка плитки", + "info": "Flutter предоставляет универсальную структуру заголовка, которая имеет структуру слева, по центру и справа. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к конкретным элементам, по сравнению с ListTile, атрибутов меньше.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление GridTileBar выглядит следующим образом", + "desc": [ + "【leading】: Левый компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【backgroundColor】: Цвет фона 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json new file mode 100644 index 00000000..799a543b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "网格瓦片头", + "info": "Flutter提供的一个通用头结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目,相比ListTile而言,属性较少。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBar的基本表现如下", + "desc": [ + "【leading】: 左侧组件 【Widget】", + "【trailing】: 尾组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【backgroundColor】: 背景色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart new file mode 100644 index 00000000..b5960402 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + + +class CustomGridTileBar extends StatelessWidget { + const CustomGridTileBar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GridTileBar( + backgroundColor: Colors.blue.withAlpha(120), + trailing: const Icon(Icons.star, color: Colors.red), + leading: const CircleAvatar( + backgroundImage: AssetImage("assets/images/wy_200x300.webp"), + ), + title: const Text("百里·巫缨"), + subtitle: const Text("倾国必倾城"), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json new file mode 100644 index 00000000..26249c9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Rasterkomponente", + "info": "Enthält mehrere Komponenten und organisiert sie in einem Raster. Kann über count, extent, custom, builder usw. konstruiert werden. Hat Eigenschaften wie Innenabstand, ob umgekehrt, Scroll-Controller usw.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count Konstruktion", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【crossAxisCount】 : Anzahl der Boxen pro Zeile in der Hauptachse 【int】", + "【mainAxisSpacing】 : Abstand zwischen den Zeilen in der Hauptachse 【double】", + "【crossAxisSpacing】 : Abstand zwischen den Zeilen in der Querachse 【double】", + "【childAspectRatio】 : Verhältnis von Hauptlänge zu Querlänge der Box 【double】", + "【crossAxisCount】 : Anzahl der Boxen pro Zeile in der Hauptachse 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView Scrollrichtung", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt gescrollt wird 【bool】", + "【shrinkWrap】 : Ob bei fehlenden Grenzen umwickelt wird 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView Scrollrichtung", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt gescrollt wird 【bool】", + "【shrinkWrap】 : Ob bei fehlenden Grenzen umwickelt wird 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder Konstruktion", + "desc": [ + "【itemCount】 : Anzahl der Einträge 【int】", + "【gridDelegate】 : Rasterdelegat 【SliverGridDelegate】", + "【itemBuilder】 : Eintragskonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json new file mode 100644 index 00000000..a99d2fdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Grid Component", + "info": "Accommodates multiple components in a grid manner. Can be constructed via count, extent, custom, builder, etc. Has properties such as padding, whether to reverse, scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count Construction", + "desc": [ + "【children】 : List of child components 【List】", + "【crossAxisCount】 : Number of boxes per row on the main axis 【int】", + "【mainAxisSpacing】 : Spacing between rows on the main axis 【double】", + "【crossAxisSpacing】 : Spacing between rows on the cross axis 【double】", + "【childAspectRatio】 : Main length/cross length of the box 【double】", + "【crossAxisCount】 : Number of boxes per row on the main axis 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView Scroll Direction", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when there is no boundary 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView Scroll Direction", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when there is no boundary 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder Construction", + "desc": [ + "【itemCount】 : Number of items 【int】", + "【gridDelegate】 : Grid delegate 【SliverGridDelegate】", + "【itemBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json new file mode 100644 index 00000000..62b7abda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente de cuadrícula", + "info": "Contiene múltiples componentes y los organiza en forma de cuadrícula. Se puede construir mediante count, extent, custom, builder, etc. Tiene propiedades como el relleno interno, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construcción de GridView.count", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【crossAxisCount】 : Número de cajas por fila en el eje principal 【int】", + "【mainAxisSpacing】 : Espaciado entre filas en el eje principal 【double】", + "【crossAxisSpacing】 : Espaciado entre filas en el eje transversal 【double】", + "【childAspectRatio】 : Relación entre la longitud principal y la longitud transversal de la caja 【double】", + "【crossAxisCount】 : Número de cajas por fila en el eje principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de desplazamiento de GridView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Dirección de desplazamiento de GridView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construcción de GridView.builder", + "desc": [ + "【itemCount】 : Número de elementos 【int】", + "【gridDelegate】 : Delegado de cuadrícula 【SliverGridDelegate】", + "【itemBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json new file mode 100644 index 00000000..56ed3d5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Composant de grille", + "info": "Contient plusieurs composants et les organise en grille. Peut être construit via count, extent, custom, builder, etc. Possède des propriétés telles que la marge intérieure, la direction inverse, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construction de GridView.count", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【crossAxisCount】 : Nombre de boîtes par ligne sur l'axe principal 【int】", + "【mainAxisSpacing】 : Espacement entre les lignes sur l'axe principal 【double】", + "【crossAxisSpacing】 : Espacement entre les lignes sur l'axe transversal 【double】", + "【childAspectRatio】 : Rapport longueur principale/longueur transversale de la boîte 【double】", + "【crossAxisCount】 : Nombre de boîtes par ligne sur l'axe principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de GridView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inversé 【bool】", + "【shrinkWrap】 : Encapsulation lorsque sans limites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direction de défilement de GridView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inversé 【bool】", + "【shrinkWrap】 : Encapsulation lorsque sans limites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construction de GridView.builder", + "desc": [ + "【itemCount】 : Nombre d'éléments 【int】", + "【gridDelegate】 : Délégué de grille 【SliverGridDelegate】", + "【itemBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json new file mode 100644 index 00000000..c3b9b94f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente griglia", + "info": "Contiene più componenti e li organizza in una griglia. Può essere costruito utilizzando count, extent, custom, builder, ecc. Ha proprietà come padding, reverse, controller di scorrimento, ecc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Costruzione GridView.count", + "desc": [ + "【children】 : Lista di componenti figli 【List】", + "【crossAxisCount】 : Numero di box per riga nell'asse principale 【int】", + "【mainAxisSpacing】 : Spaziatura tra le righe nell'asse principale 【double】", + "【crossAxisSpacing】 : Spaziatura tra le righe nell'asse trasversale 【double】", + "【childAspectRatio】 : Rapporto lunghezza principale/lunghezza trasversale del box 【double】", + "【crossAxisCount】 : Numero di elementi per riga nell'asse principale 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento GridView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direzione di scorrimento GridView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Costruzione GridView.builder", + "desc": [ + "【itemCount】 : Numero di elementi 【int】", + "【gridDelegate】 : Delegato della griglia 【SliverGridDelegate】", + "【itemBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json new file mode 100644 index 00000000..c3a5a7a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "グリッドコンポーネント", + "info": "複数のコンポーネントを収容し、グリッド方式で表示します。count、extent、custom、builderなどを使用して構築できます。内側の余白、逆方向かどうか、スクロールコントローラーなどの属性があります。", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count構築", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【crossAxisCount】 : 主軸一行のボックス数 【int】", + "【mainAxisSpacing】 : 主軸各行の間隔 【double】", + "【crossAxisSpacing】 : 交差軸各行の間隔 【double】", + "【childAspectRatio】 : ボックスの主軸長/交差軸長 【double】", + "【crossAxisCount】 : 主軸一行の数 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridViewスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridViewスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder構築", + "desc": [ + "【itemCount】 : 項目数 【int】", + "【gridDelegate】 : グリッドデリゲート 【SliverGridDelegate】", + "【itemBuilder】 : 項目ビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json new file mode 100644 index 00000000..68a10541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "그리드 컴포넌트", + "info": "여러 컴포넌트를 포함하고 그리드 방식으로 배치합니다. count, extent, custom, builder 등을 통해 구성할 수 있습니다. 내부 여백, 반대 방향 여부, 스크롤 컨트롤러 등의 속성이 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count 구성", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【List】", + "【crossAxisCount】 : 주축 한 줄의 box 수 【int】", + "【mainAxisSpacing】 : 주축 각 줄 간격 【double】", + "【crossAxisSpacing】 : 교차축 각 줄 간격 【double】", + "【childAspectRatio】 : box 주 길이/교차축 길이 【double】", + "【crossAxisCount】 : 주축 한 줄 수 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder 구성", + "desc": [ + "【itemCount】 : 항목 수 【int】", + "【gridDelegate】 : 그리드 대리자 【SliverGridDelegate】", + "【itemBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json new file mode 100644 index 00000000..21b7bcc5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente de Grade", + "info": "Acomoda vários componentes em formato de grade. Pode ser construído através de count, extent, custom, builder, etc. Possui propriedades como padding, reversão, controlador de deslize, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construção de GridView.count", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【crossAxisCount】 : Número de caixas por linha no eixo principal 【int】", + "【mainAxisSpacing】 : Espaçamento entre linhas no eixo principal 【double】", + "【crossAxisSpacing】 : Espaçamento entre linhas no eixo cruzado 【double】", + "【childAspectRatio】 : Proporção do comprimento principal/comprimento do eixo cruzado da caixa 【double】", + "【crossAxisCount】 : Número de caixas por linha no eixo principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslize do GridView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se desliza na direção inversa 【bool】", + "【shrinkWrap】 : Se envolve quando não há limites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direção de Deslize do GridView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se desliza na direção inversa 【bool】", + "【shrinkWrap】 : Se envolve quando não há limites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construção de GridView.builder", + "desc": [ + "【itemCount】 : Número de itens 【int】", + "【gridDelegate】 : Delegado de grade 【SliverGridDelegate】", + "【itemBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json new file mode 100644 index 00000000..4dc330ef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Сетка", + "info": "Содержит несколько компонентов и отображает их в виде сетки. Может быть создан с использованием count, extent, custom, builder и других методов. Имеет свойства, такие как внутренние отступы, обратное направление, контроллер прокрутки и другие.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Конструктор GridView.count", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【crossAxisCount】 : Количество элементов в строке по главной оси 【int】", + "【mainAxisSpacing】 : Расстояние между строками по главной оси 【double】", + "【crossAxisSpacing】 : Расстояние между строками по поперечной оси 【double】", + "【childAspectRatio】 : Соотношение длины по главной оси к длине по поперечной оси 【double】", + "【crossAxisCount】 : Количество элементов в строке по главной оси 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки GridView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обертывание при отсутствии границ 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Направление прокрутки GridView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обертывание при отсутствии границ 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Конструктор GridView.builder", + "desc": [ + "【itemCount】 : Количество элементов 【int】", + "【gridDelegate】 : Делегат сетки 【SliverGridDelegate】", + "【itemBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json new file mode 100644 index 00000000..226589b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "网格组件", + "info": "容纳多个组件,并以网格的方式。可以通过count、extent、custom、builder等构造。有内边距、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count构造", + "desc": [ + "【children】 : 子组件列表 【List】", + "【crossAxisCount】 : 主轴一行box数量 【int】", + "【mainAxisSpacing】 : 主轴每行间距 【double】", + "【crossAxisSpacing】 : 交叉轴每行间距 【double】", + "【childAspectRatio】 : box主长/交叉轴长 【double】", + "【crossAxisCount】 : 主轴一行数量 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder构造", + "desc": [ + "【itemCount】 : 条目数量 【int】", + "【gridDelegate】 : 网格代理 【SliverGridDelegate】", + "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart new file mode 100644 index 00000000..475b961f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart @@ -0,0 +1,56 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-27 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 163, +// "name": 'GridView.count构造', +// "priority": 1, +// "subtitle": +// "【children】 : 子组件列表 【List】\n" +// "【crossAxisCount】 : 主轴一行box数量 【int】\n" +// "【mainAxisSpacing】 : 主轴每行间距 【double】\n" +// "【crossAxisSpacing】 : 交叉轴每行间距 【double】\n" +// "【childAspectRatio】 : box主长/交叉轴长 【double】\n" +// "【crossAxisCount】 : 主轴一行数量 【int】", +// } +class CustomGridView extends StatelessWidget { + const CustomGridView({super.key}); + + List get data => List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: GridView.count( + crossAxisCount: 4, + mainAxisSpacing: 2, + crossAxisSpacing: 2, + childAspectRatio: 1 / 0.618, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Container _buildItem(Color color) => Container( + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ), + ), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart new file mode 100644 index 00000000..32281c03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-27 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 163, +// "name": 'GridView滑动方向', +// "priority": 2, +// "subtitle": +// "【scrollDirection】 : 滑动方向 【Axis】\n" +// "【reverse】 : 是否反向滑动 【bool】\n" +// "【shrinkWrap】 : 无边界时是否包裹 【bool】", +// } +class HorizontalGridView extends StatelessWidget { + const HorizontalGridView({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: GridView.count( + scrollDirection: Axis.horizontal, + reverse: true, + crossAxisCount: 4, + mainAxisSpacing: 2, + crossAxisSpacing: 2, + childAspectRatio: 0.618, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Container _buildItem(Color color) => Container( + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ), + ), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart new file mode 100644 index 00000000..c42658dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-27 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 163, +// "name": 'GridView滑动方向', +// "priority": 2, +// "subtitle": +// "【scrollDirection】 : 滑动方向 【Axis】\n" +// "【reverse】 : 是否反向滑动 【bool】\n" +// "【shrinkWrap】 : 无边界时是否包裹 【bool】", +// } +class ExtentGridView extends StatelessWidget { + const ExtentGridView({super.key}); + + List get data => List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: GridView.extent( + scrollDirection: Axis.horizontal, + maxCrossAxisExtent: 80.0, + mainAxisSpacing: 2, + crossAxisSpacing: 2, + childAspectRatio: 0.618, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Container _buildItem(Color color) => Container( + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ), + ), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node4_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart similarity index 92% rename from packages/widgets/lib/StatelessWidget/GirdView/node4_builder.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart index a60215cf..a0b2ca75 100644 --- a/packages/widgets/lib/StatelessWidget/GirdView/node4_builder.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart @@ -14,9 +14,9 @@ import 'package:flutter/material.dart'; // "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】", // } class BuilderGridView extends StatelessWidget { - BuilderGridView({Key? key}) : super(key: key); + const BuilderGridView({super.key}); - final List data = List.generate(128, (i) => Color(0xFF33FFF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF33FFF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json new file mode 100644 index 00000000..a7e5179a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html-Elementansicht", + "info": "Einbetten eines HTML-Elements in die Widget-Hierarchie von Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in HtmlElementView", + "desc": [ + "【child】 : Untergeordnete Komponente 【child】", + "【viewType】 : Eindeutige Kennung des HTML-Elements 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json new file mode 100644 index 00000000..5c1a76ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html element view", + "info": "Embeds an HTML element within the Widget hierarchy of Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to HtmlElementView", + "desc": [ + "【child】 : Child widget 【child】", + "【viewType】 : Unique identifier for the HTML element 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json new file mode 100644 index 00000000..7411690d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista de elemento html", + "info": "Incrusta un elemento HTML en la jerarquía de Widgets de Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a HtmlElementView", + "desc": [ + "【child】 : componente hijo 【child】", + "【viewType】 : identificador único del elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json new file mode 100644 index 00000000..a597b30a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vue d'élément html", + "info": "Intégrer un élément HTML dans la hiérarchie des Widgets de Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à HtmlElementView", + "desc": [ + "【child】 : composant enfant 【child】", + "【viewType】 : identifiant unique de l'élément html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json new file mode 100644 index 00000000..03d1b146 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista elemento html", + "info": "Incorpora un elemento HTML nella gerarchia dei widget di Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a HtmlElementView", + "desc": [ + "【child】 : componente figlio 【child】", + "【viewType】 : identificatore unico dell'elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json new file mode 100644 index 00000000..ee3c57da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html エレメントビュー", + "info": "Flutter Web の Widget 階層に HTML エレメントを埋め込みます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 紹介", + "desc": [ + "【child】 : 子コンポーネント 【child】", + "【viewType】 : htmlエレメントのユニーク識別子 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json new file mode 100644 index 00000000..16031534 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html 요소 뷰", + "info": "Flutter Web의 위젯 계층 구조에 HTML 요소를 삽입합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 소개", + "desc": [ + "【child】 : 자식 위젯 【child】", + "【viewType】 : html 요소 고유 식별자 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json new file mode 100644 index 00000000..5b0863d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista de elemento html", + "info": "Incorpora um elemento HTML na hierarquia de Widgets do Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao HtmlElementView", + "desc": [ + "【child】 : componente filho 【child】", + "【viewType】 : identificador único do elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json new file mode 100644 index 00000000..3a7aea92 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html элемент представления", + "info": "Встраивает HTML-элемент в иерархию виджетов Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в HtmlElementView", + "desc": [ + "【child】 : дочерний компонент 【child】", + "【viewType】 : уникальный идентификатор HTML-элемента 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json new file mode 100644 index 00000000..899721db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html 元素视图", + "info": "在 Flutter Web 的 Widget 层次结构中嵌入一个 HTML 元素。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 介绍", + "desc": [ + "【child】 : 子组件 【child】", + "【viewType】 : html元素唯一表识 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart new file mode 100644 index 00000000..edbf1324 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/11 +/// contact me by email 1981462002@qq.com +/// + +class HtmlElementViewDemo extends StatelessWidget { + const HtmlElementViewDemo({Key? key}) : super(key: key); + + final String info = + '该组件只能用于 Flutter Web 中,嵌入 Html 元素的较为昂贵。' + '内部基于 PlatformViewLink 和 PlatformViewSurface 组件实现。'; + + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json new file mode 100644 index 00000000..a4370c7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Symbolkomponente", + "info": "Komponente zur Anzeige von Symbolen. Ermöglicht die Angabe von Symbolressourcen, Größe und Farbe. Sehr einfach, aber sehr nützlich", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Zum Anzeigen eines Symbols", + "desc": [ + "【Eingabeparameter】 : Symboldaten 【IconData】", + "【size】 : Größe 【double】", + "【color】: Farbe 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Verwendung von benutzerdefinierten Symbolen", + "desc": [ + "Symbolschriftarten können von der iconfont-Website heruntergeladen und verwendet werden" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json new file mode 100644 index 00000000..8952d62b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Icon Component", + "info": "Component for displaying icons. Can specify icon resources, size, and color. Very simple, but very useful", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display an icon", + "desc": [ + "【Input】 : Icon data 【IconData】", + "【size】 : Size 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Use custom icons", + "desc": [ + "You can download icon fonts from the iconfont website for use" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json new file mode 100644 index 00000000..5fe3cb43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente de icono", + "info": "Componente para mostrar iconos. Puede especificar el recurso del icono, el tamaño y el color. Muy simple, pero muy útil", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Para mostrar un icono", + "desc": [ + "【Parámetro de entrada】: Datos del icono 【IconData】", + "【size】: Tamaño 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usar iconos personalizados", + "desc": [ + "Puede descargar fuentes de iconos desde el sitio web de iconfont para su uso" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json new file mode 100644 index 00000000..280fb11f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Composant d'icône", + "info": "Composant pour l'affichage d'icônes. Permet de spécifier la ressource d'icône, la taille, la couleur. Très simple, mais très utile", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pour afficher une icône", + "desc": [ + "【Paramètre】 : Données de l'icône 【IconData】", + "【size】 : Taille 【double】", + "【color】: Couleur 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Utiliser des icônes personnalisées", + "desc": [ + "Vous pouvez télécharger des polices d'icônes sur le site iconfont pour les utiliser" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json new file mode 100644 index 00000000..ede363f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente Icona", + "info": "Componente per la visualizzazione delle icone. Puoi specificare la risorsa dell'icona, la dimensione e il colore. Molto semplice, ma molto utile", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Per visualizzare un'icona", + "desc": [ + "【Parametro】 : Dati dell'icona 【IconData】", + "【size】 : Dimensione 【double】", + "【color】: Colore 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usa icone personalizzate", + "desc": [ + "Puoi scaricare i caratteri delle icone dal sito iconfont per usarli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json new file mode 100644 index 00000000..74877e3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "アイコンコンポーネント", + "info": "アイコン表示用のコンポーネントです。アイコンリソース、サイズ、色を指定できます。非常にシンプルですが、非常に便利です。", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "アイコンを表示するために使用", + "desc": [ + "【引数】: アイコンデータ 【IconData】", + "【size】: サイズ 【double】", + "【color】: 色 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "カスタムアイコンを使用", + "desc": [ + "iconfontウェブサイトからアイコンフォントをダウンロードして使用できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json new file mode 100644 index 00000000..f7e049a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "아이콘 컴포넌트", + "info": "아이콘 표시를 위한 컴포넌트입니다. 아이콘 리소스, 크기, 색상을 지정할 수 있습니다. 매우 간단하지만 매우 유용합니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "아이콘을 표시하기 위해 사용", + "desc": [ + "【입력 매개변수】 : 아이콘 데이터 【IconData】", + "【size】 : 크기 【double】", + "【color】: 색상 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "사용자 정의 아이콘 사용", + "desc": [ + "iconfont 웹사이트에서 아이콘 폰트를 다운로드하여 사용할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json new file mode 100644 index 00000000..fb473652 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente de Ícone", + "info": "Componente para exibição de ícones. Pode especificar o recurso do ícone, tamanho e cor. Muito simples, mas muito útil", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um ícone", + "desc": [ + "【Parâmetro de entrada】: Dados do ícone 【IconData】", + "【size】: Tamanho 【double】", + "【color】: Cor 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usar ícone personalizado", + "desc": [ + "Pode baixar fontes de ícones no site iconfont para uso" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json new file mode 100644 index 00000000..9cda5c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Компонент иконки", + "info": "Компонент для отображения иконок. Можно указать ресурс иконки, размер, цвет. Очень просто, но очень полезно", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Для отображения иконки", + "desc": [ + "【Входные параметры】 : данные иконки 【IconData】", + "【size】 : размер 【double】", + "【color】: цвет 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Использование пользовательской иконки", + "desc": [ + "Можно скачать шрифт иконки с сайта iconfont для использования" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json new file mode 100644 index 00000000..6b2847df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "图标组件", + "info": "用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但是非常用", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个图标", + "desc": [ + "【入参】 :图标数据 【IconData】", + "【size】 : 大小 【double】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "使用自定义图标", + "desc": [ + "可在iconfont网站中下载图标字体进行使用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart new file mode 100644 index 00000000..4a27ebe7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart @@ -0,0 +1,23 @@ + + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + + +class CustomIcon extends StatelessWidget { + const CustomIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: const [ + Icon(Icons.send, color: Colors.orange, size: 60), + Icon(Icons.android, color: Colors.green, size: 100), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart new file mode 100644 index 00000000..0bbffd9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart @@ -0,0 +1,30 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + + +class MyIcon extends StatelessWidget { + const MyIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + TolyIcon.icon_search, + TolyIcon.icon_star, + TolyIcon.icon_layout, + TolyIcon.icon_star_ok + ].map((e) => Icon( + e, + color: Colors.green, + size: 60, + ),).toList(), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json new file mode 100644 index 00000000..095206db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Symbolschaltfläche", + "info": "Klickbare Symbolschaltfläche, die Symbolinformationen, Innenabstand, Größe, Farbe usw. angeben kann und Klickereignisse empfängt.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton-Eigenschaften", + "desc": [ + "【icon】: Symbolkomponente 【Widget】", + "【tooltip】: Langzeitdruck-Hinweistext 【String】", + "【highlightColor】: Langzeitdruck-Highlight-Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【onPressed】: Klickereignis 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json new file mode 100644 index 00000000..8284e78a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Icon Button", + "info": "A clickable icon button that can specify icon information, padding, size, color, etc., and receives click events.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton Properties", + "desc": [ + "【icon】: Icon component 【Widget】", + "【tooltip】: Long press tooltip text 【String】", + "【highlightColor】: Long press highlight color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【onPressed】: Click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json new file mode 100644 index 00000000..7432a0b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Botón de icono", + "info": "Botón de icono clickeable, puede especificar información del icono, padding, tamaño, color, etc., y recibe eventos de clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades de IconButton", + "desc": [ + "【icon】: Componente de icono 【Widget】", + "【tooltip】: Texto de sugerencia al mantener presionado 【String】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【onPressed】: Evento de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json new file mode 100644 index 00000000..1cbaf9eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Bouton d'icône", + "info": "Bouton d'icône cliquable, peut spécifier des informations d'icône, un remplissage, une taille, une couleur, etc., et reçoit des événements de clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés d'IconButton", + "desc": [ + "【icon】: Composant d'icône 【Widget】", + "【tooltip】: Texte d'info-bulle lors d'un appui long 【String】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【onPressed】: Événement de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json new file mode 100644 index 00000000..31729448 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Pulsante Icona", + "info": "Pulsante icona cliccabile, può specificare informazioni sull'icona, spaziatura interna, dimensione, colore, ecc., riceve eventi di clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà IconButton", + "desc": [ + "【icon】: Componente icona 【Widget】", + "【tooltip】: Testo di suggerimento per pressione prolungata 【String】", + "【highlightColor】: Colore evidenziato per pressione prolungata 【Color】", + "【splashColor】: Colore effetto ondulazione 【Color】", + "【onPressed】: Evento di clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json new file mode 100644 index 00000000..39425031 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "アイコンボタン", + "info": "クリック可能なアイコンボタンで、アイコン情報、パディング、サイズ、色などを指定でき、クリックイベントを受け取ります。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButtonプロパティ", + "desc": [ + "【icon】: アイコンコンポーネント 【Widget】", + "【tooltip】: 長押し時のヒントテキスト 【String】", + "【highlightColor】: 長押し時のハイライト色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【onPressed】: クリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json new file mode 100644 index 00000000..69529b1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "아이콘 버튼", + "info": "클릭 가능한 아이콘 버튼으로, 아이콘 정보, 패딩, 크기, 색상 등을 지정할 수 있으며 클릭 이벤트를 수신합니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton 속성", + "desc": [ + "【icon】: 아이콘 컴포넌트 【Widget】", + "【tooltip】: 길게 누를 때 표시되는 텍스트 【String】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json new file mode 100644 index 00000000..06ef0ae6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Botão de Ícone", + "info": "Botão de ícone clicável, pode especificar informações de ícone, preenchimento interno, tamanho, cor, etc., e recebe eventos de clique.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades do IconButton", + "desc": [ + "【icon】: Componente de ícone 【Widget】", + "【tooltip】: Texto de dica ao pressionar 【String】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【onPressed】: Evento de clique 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json new file mode 100644 index 00000000..cc27ab35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Кнопка с иконкой", + "info": "Кликабельная кнопка с иконкой, можно указать информацию об иконке, внутренние отступы, размер, цвет и т.д., принимает событие клика.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Свойства IconButton", + "desc": [ + "【icon】: Компонент иконки 【Widget】", + "【tooltip】: Текст подсказки при долгом нажатии 【String】", + "【highlightColor】: Цвет подсветки при долгом нажатии 【Color】", + "【splashColor】: Цвет эффекта волны 【Color】", + "【onPressed】: Событие клика 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json new file mode 100644 index 00000000..b8e6bf4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "图标按钮", + "info": "可点击的图标按钮,可指定图标信息、内边距、大小、颜色等,接收点击事件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton属性", + "desc": [ + "【icon】: 图标组件 【Widget】", + "【tooltip】: 长按提示文字 【String】", + "【highlightColor】: 长按高亮色 【Color】", + "【splashColor】: 水波纹色 【Color】", + "【onPressed】: 点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart new file mode 100644 index 00000000..a3fff848 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class CustomIconButton extends StatelessWidget { + const CustomIconButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: IconButton( + padding: const EdgeInsets.only(), + onPressed: () {}, + icon: const Icon(Icons.android, size: 40, color: Colors.green), + tooltip: "android", + highlightColor: Colors.orangeAccent, + splashColor: Colors.blue, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json new file mode 100644 index 00000000..c9c0f95a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Container", + "info": "Eine Komponente, die ein Bild in eine einfarbige Farbe umwandelt. Größe und Farbe können angegeben werden.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wird verwendet, um ein einfarbiges Bild anzuzeigen", + "desc": [ + "【Parameter】: Bildressource 【ImageProvider】", + "【size】: Größe 【double】", + "【color】: Farbe der Markierung 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json new file mode 100644 index 00000000..90f16806 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Container", + "info": "A component used to turn an image into a solid color. You can specify the size and color.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a solid color image", + "desc": [ + "【Parameter】: Image resource 【ImageProvider】", + "【size】: Size 【double】", + "【color】: Badge color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json new file mode 100644 index 00000000..09e681c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Contenedor", + "info": "Componente utilizado para convertir una imagen en un color sólido. Puede especificar el tamaño y el color.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Se utiliza para mostrar una imagen de color sólido", + "desc": [ + "【Parámetro de entrada】: Recurso de imagen 【ImageProvider】", + "【size】: Tamaño 【double】", + "【color】: Color de la etiqueta 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json new file mode 100644 index 00000000..36b48738 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Conteneur", + "info": "Un composant pour transformer une image en une couleur unie. Peut spécifier la taille et la couleur.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher une image en couleur unie", + "desc": [ + "【Paramètre】 : Ressource d'image 【ImageProvider】", + "【size】 : Taille 【double】", + "【color】: Couleur de l'étiquette 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json new file mode 100644 index 00000000..f32ca86a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Contenitore", + "info": "Componente utilizzato per trasformare un'immagine in un colore solido. È possibile specificare dimensioni e colore.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un'immagine a tinta unita", + "desc": [ + "【Parametro】 : Risorsa immagine 【ImageProvider】", + "【size】 : Dimensione 【double】", + "【color】: Colore del badge 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json new file mode 100644 index 00000000..f14e7c89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "コンテナ", + "info": "画像を単色に変えるためのコンポーネントです。サイズや色を指定できます。", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "単色の画像を表示するために使用", + "desc": [ + "【入参】 : 画像リソース 【ImageProvider】", + "【size】 : サイズ 【double】", + "【color】: バッジの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json new file mode 100644 index 00000000..11ec8ae0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "컨테이너", + "info": "이미지를 단색으로 변경하는 컴포넌트입니다. 크기와 색상을 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "단색 이미지를 표시하는 데 사용", + "desc": [ + "【입력 매개변수】 : 이미지 리소스 【ImageProvider】", + "【size】 : 크기 【double】", + "【color】: 배지 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json new file mode 100644 index 00000000..7cf446f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Recipiente", + "info": "Componente usado para transformar uma imagem em uma cor sólida. Pode especificar o tamanho e a cor.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir uma imagem de cor sólida", + "desc": [ + "【Parâmetro de entrada】: Recurso de imagem 【ImageProvider】", + "【size】: Tamanho 【double】", + "【color】: Cor do ícone 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json new file mode 100644 index 00000000..f560ccf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Контейнер", + "info": "Компонент для преобразования изображения в однотонный цвет. Можно указать размер и цвет.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Используется для отображения однотонного изображения", + "desc": [ + "【Параметр】 : Ресурс изображения 【ImageProvider】", + "【size】 : Размер 【double】", + "【color】: Цвет индикатора 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json new file mode 100644 index 00000000..f86199f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "容器", + "info": "用于将一个图片变为纯色的组件。可指定大小、颜色。", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个纯色图片", + "desc": [ + "【入参】 : 图片资源 【ImageProvider】", + "【size】 : 大小 【double】", + "【color】: 角标颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart new file mode 100644 index 00000000..c687766c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class CustomImageIcon extends StatelessWidget { + const CustomImageIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Map data = { + Colors.blue: 50.0, + Colors.red: 60.0, + Colors.green: 70.0, + Colors.yellow: 80.0, + }; + return Wrap( + spacing: 10, + children: data.keys + .map((e) => ImageIcon( + const AssetImage("assets/images/leaf.webp"), + color: e, + size: data[e], + )) + .toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json new file mode 100644 index 00000000..b6e32c70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Kombinierter Chip", + "info": "Ähnlich wie die Chip-Komponente, integriert Klick-, Lösch- und Auswahlereignisse. Hinweis: Klick- und Auswahlereignisse können nicht gleichzeitig vorhanden sein.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann Klick- und Lösch-Ereignisse akzeptieren", + "desc": [ + "【onPressed】: Klick-Ereignis 【Function()】", + "【onDeleted】: Lösch-Ereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Kann Auswahl-Ereignisse akzeptieren", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【onSelected】: Auswahl-Ereignis 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json new file mode 100644 index 00000000..6c0ac259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Comprehensive Chip", + "info": "Similar in style to the Chip component, it integrates click, delete, and select events into one. Note: Click event and select event cannot coexist.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Can accept click and delete events", + "desc": [ + "【onPressed】: Click event 【Function()】", + "【onDeleted】: Delete event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Can accept select event", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onSelected】: Select event 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json new file mode 100644 index 00000000..bf5a73a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrado", + "info": "Estilo similar al componente Chip, integra eventos de clic, eliminación y selección en uno. Nota: Los eventos de clic y selección no pueden coexistir.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Puede aceptar eventos de clic y eliminación", + "desc": [ + "【onPressed】: Evento de clic 【Function()】", + "【onDeleted】: Evento de eliminación 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Puede aceptar eventos de selección", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onSelected】: Evento de selección 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json new file mode 100644 index 00000000..f4ffd569 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Puce Intégrée", + "info": "Un style similaire au composant Chip, intégrant les événements de clic, de suppression et de sélection en un seul. Remarque : les événements de clic et de sélection ne peuvent pas coexister.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut accepter les événements de clic et de suppression", + "desc": [ + "【onPressed】: Événement de clic 【Function()】", + "【onDeleted】: Événement de suppression 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Peut accepter l'événement de sélection", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【onSelected】: Événement de sélection 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json new file mode 100644 index 00000000..dc95c4e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrato", + "info": "Stile simile al componente Chip, integrato con eventi di clic, eliminazione e selezione. Nota: gli eventi di clic e selezione non possono coesistere.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può accettare eventi di clic ed eliminazione", + "desc": [ + "【onPressed】: Evento di clic 【Function()】", + "【onDeleted】: Evento di eliminazione 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Può accettare eventi di selezione", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【onSelected】: Evento di selezione 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json new file mode 100644 index 00000000..31471526 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "統合チップ", + "info": "Chipコンポーネントと同様のスタイルで、クリック、削除、選択イベントを統合しています。注意: クリックイベントと選択イベントは同時に存在できません。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "クリック、削除イベントを受け取ることができます", + "desc": [ + "【onPressed】: クリックイベント 【Function()】", + "【onDeleted】: 削除イベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "選択イベントを受け取ることができます", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onSelected】: 選択イベント 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json new file mode 100644 index 00000000..63de89c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "종합 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 클릭, 삭제, 선택 이벤트를 하나로 통합했습니다. 주의: 클릭 이벤트와 선택 이벤트는 동시에 존재할 수 없습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "클릭 및 삭제 이벤트를 수신할 수 있음", + "desc": [ + "【onPressed】: 클릭 이벤트 【Function()】", + "【onDeleted】: 삭제 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "선택 이벤트를 수신할 수 있음", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onSelected】: 선택 이벤트 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json new file mode 100644 index 00000000..41eaaf1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrado", + "info": "Estilo semelhante ao componente Chip, integra eventos de clique, exclusão e seleção em um só. Nota: os eventos de clique e seleção não podem coexistir.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode aceitar eventos de clique e exclusão", + "desc": [ + "【onPressed】: Evento de clique 【Function()】", + "【onDeleted】: Evento de exclusão 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Pode aceitar eventos de seleção", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【onSelected】: Evento de seleção 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json new file mode 100644 index 00000000..d1eb785c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Комплексный чип", + "info": "Стиль, похожий на компонент Chip, объединяет события нажатия, удаления и выбора в одном элементе. Обратите внимание: события нажатия и выбора не могут существовать одновременно.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Может принимать события нажатия и удаления", + "desc": [ + "【onPressed】: Событие нажатия 【Function()】", + "【onDeleted】: Событие удаления 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Может принимать событие выбора", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onSelected】: Событие выбора 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json new file mode 100644 index 00000000..9d99ecd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "综合小条", + "info": "和Chip组件类似的样式,集成了点击、删除、选择事件为一体。注意:点击事件和选择事件不能同时存在。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可以接受点击、删除事件", + "desc": [ + "【onPressed】: 点击事件 【Function()】", + "【onDeleted】: 删除事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "可以接受选中事件", + "desc": [ + "【selected】: 是否选中 【bool】", + "【onSelected】: 选中事件 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart new file mode 100644 index 00000000..3d1161be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class PressInputChip extends StatefulWidget { + const PressInputChip({Key? key}) : super(key: key); + + @override + _PressInputChipState createState() => _PressInputChipState(); +} + +class _PressInputChipState extends State { + bool _delete = false; + + @override + Widget build(BuildContext context) { + return InputChip( + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + label: Text( + !_delete ? + "This is a InputChip." : + "You are clicked delete icon."), + backgroundColor: Colors.grey.withAlpha(66), + avatar: Image.asset("assets/images/icon_head.webp"), + selectedColor: Colors.orangeAccent.withAlpha(88), + selectedShadowColor: Colors.blue, + shadowColor: Colors.orangeAccent, + elevation: 3, + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + onDeleted: () => setState(() => _delete = !_delete)); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart new file mode 100644 index 00000000..f19dcb12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + + + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class SelectInputChip extends StatefulWidget { + const SelectInputChip({Key? key}) : super(key: key); + + @override + _SelectInputChipState createState() => _SelectInputChipState(); +} + +class _SelectInputChipState extends State { + bool _select = false; + + @override + Widget build(BuildContext context) { + return InputChip( + selected: _select, + padding: const EdgeInsets.all(5), + labelPadding: const EdgeInsets.all(3), + label: const Text("This is a InputChip."), + backgroundColor: Colors.grey.withAlpha(66), + avatar: Image.asset("assets/images/icon_head.webp"), + selectedColor: Colors.orangeAccent.withAlpha(88), + selectedShadowColor: Colors.blue, + shadowColor: Colors.orangeAccent, + elevation: 3, + onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), + onSelected: (bool value) { + setState(() { + _select = value; + }); + print("onSelected"); + }, + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json new file mode 100644 index 00000000..483c5b99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Listenkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, mit einer Struktur von links, Mitte und rechts. An den entsprechenden Positionen können Komponenten eingefügt werden, was es sehr einfach macht, bestimmte Einträge zu verarbeiten.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung von ListTile", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【contentPadding】: Innenabstand 【EdgeInsetsGeometry】", + "【onLongPress】: Klick-Ereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahl-Effekt und Long-Press-Ereignis von ListTile", + "desc": [ + "【selected】: Ist ausgewählt 【bool】", + "【onTap】: Klick-Ereignis 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft von ListTile", + "desc": [ + "【dense】: Ist dicht 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json new file mode 100644 index 00000000..cb894918 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "List Tile", + "info": "A general list item structure provided by Flutter, which has a left-center-right structure. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of ListTile is as follows", + "desc": [ + "【leading】: Left component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【contentPadding】: Inner padding 【EdgeInsetsGeometry】", + "【onLongPress】: Click event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile selection effect and long press event", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onTap】: Click event 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of ListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json new file mode 100644 index 00000000..4437361e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Lista de fichas", + "info": "Una estructura de elementos de lista común proporcionada por Flutter, con una estructura de izquierda, centro y derecha. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de ListTile es la siguiente", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【trailing】: Componente final 【Widget】", + "【contentPadding】: Relleno interno 【EdgeInsetsGeometry】", + "【onLongPress】: Evento de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección y evento de pulsación prolongada de ListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onTap】: Evento de clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de disposición densa de ListTile", + "desc": [ + "【dense】: Si está en disposición densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json new file mode 100644 index 00000000..dccc7dea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Tuile de liste", + "info": "Une structure d'élément de liste générique fournie par Flutter, avec une structure gauche-centre-droite. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des éléments spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de ListTile est la suivante", + "desc": [ + "【leading】: Composant de gauche 【Widget】", + "【title】: Composant du haut au centre 【Widget】", + "【subtitle】: Composant du bas au centre 【Widget】", + "【trailing】: Composant de fin 【Widget】", + "【contentPadding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onLongPress】: Événement de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection et événement de pression longue de ListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【onTap】: Événement de clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de ListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json new file mode 100644 index 00000000..282eaca6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Piastrella della lista", + "info": "Una struttura comune per gli elementi della lista fornita da Flutter, con una struttura sinistra-centro-destra. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile adattarsi a elementi specifici.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di ListTile è la seguente", + "desc": [ + "【leading】: Componente sinistro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【trailing】: Componente finale 【Widget】", + "【contentPadding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onLongPress】: Evento di clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione e evento di pressione prolungata di ListTile", + "desc": [ + "【selected】: Selezionato 【bool】", + "【onTap】: Evento di clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di disposizione compatta di ListTile", + "desc": [ + "【dense】: Disposizione compatta 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json new file mode 100644 index 00000000..86428b00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "リストタイル", + "info": "Flutterが提供する一般的なリスト項目構造で、左中右の構造を持っています。対応する位置にコンポーネントを挿入することができ、特定の項目に簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileの基本的な表現は以下の通りです", + "desc": [ + "【leading】: 左側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【trailing】: 末尾のコンポーネント 【Widget】", + "【contentPadding】: 内側の余白 【EdgeInsetsGeometry】", + "【onLongPress】: クリックイベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTileの選択効果と長押しイベント", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onTap】: クリックイベント 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json new file mode 100644 index 00000000..3b4aef74 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "리스트 타일", + "info": "Flutter에서 제공하는 일반적인 리스트 항목 구조로, 왼쪽, 중앙, 오른쪽 구조를 가지고 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있으며, 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTile의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【contentPadding】: 내부 여백 【EdgeInsetsGeometry】", + "【onLongPress】: 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile 선택 효과 및 길게 누르기 이벤트", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onTap】: 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json new file mode 100644 index 00000000..f73b46a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Azulejo de Lista", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de esquerda, centro e direita. Componentes podem ser inseridos nas posições correspondentes, o que pode lidar facilmente com itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do ListTile é a seguinte", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【trailing】: Componente final 【Widget】", + "【contentPadding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onLongPress】: Evento de clique 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção e evento de pressionamento longo do ListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【onTap】: Evento de clique 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do ListTile", + "desc": [ + "【dense】: Se é denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json new file mode 100644 index 00000000..1ae22bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Список плиток", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет структуру слева, по центру и справа. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление ListTile выглядит следующим образом", + "desc": [ + "【leading】: Левый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【contentPadding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onLongPress】: Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора и событие долгого нажатия ListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onTap】: Событие нажатия 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения ListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json new file mode 100644 index 00000000..aee1c845 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "列表瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTile的基本表现如下", + "desc": [ + "【leading】: 左侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【trailing】: 尾组件 【Widget】", + "【contentPadding】: 内边距 【EdgeInsetsGeometry】", + "【onLongPress】: 点击事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile选中效果和长按事件", + "desc": [ + "【selected】: 是否选中 【bool】", + "【onTap】: 点击事件 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart new file mode 100644 index 00000000..7e7f533d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomListTile extends StatelessWidget { + const CustomListTile({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + title: const Text("以梦为马"), + subtitle: const Text("海子"), + contentPadding: const EdgeInsets.all(5), + trailing: const Icon(Icons.more_vert), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart new file mode 100644 index 00000000..5262e161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class SelectListTile extends StatefulWidget { + const SelectListTile({Key? key}) : super(key: key); + + @override + _SelectListTileState createState() => _SelectListTileState(); +} + +class _SelectListTileState extends State { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + selected: _selected, + title: const Text("以梦为马"), + subtitle: const Text("海子"), + contentPadding: const EdgeInsets.all(5), + trailing: const Icon(Icons.more_vert), + onTap: () => setState(() => _selected = !_selected), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart new file mode 100644 index 00000000..347c420d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class DenseListTile extends StatefulWidget { + const DenseListTile({Key? key}) : super(key: key); + + @override + _DenseListTileState createState() => _DenseListTileState(); +} + +class _DenseListTileState extends State { + bool _dense = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.webp"), + title: const Text("以梦为马"), + subtitle: const Text("海子"), + selected: false, + contentPadding: const EdgeInsets.all(5), + trailing: const Icon(Icons.more_vert), + dense: _dense, + onTap: () => setState(() => _dense = !_dense), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json new file mode 100644 index 00000000..0d813b29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Listenkomponente", + "info": "Führende Figur bei der Anzeige von Listen, die mehrere Unterkomponenten aufnehmen kann und über Builder, Separated, Custom usw. konstruiert werden kann. Verfügt über Eigenschaften wie Innenabstand, Umkehrung, Scroll-Controller usw.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Horizontales Scrollen mit ListView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Umgekehrtes Scrollen 【bool】", + "【shrinkWrap】 : Bei fehlenden Grenzen einwickeln 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder Konstruktion", + "desc": [ + "【itemCount】 : Anzahl der Elemente 【int】", + "【itemBuilder】 : Elementkonstruktor 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated Konstruktion", + "desc": [ + "【separatorBuilder】 : Elementkonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json new file mode 100644 index 00000000..df175a34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "List Component", + "info": "The leader in list display, accommodating multiple sub-components, can be constructed through builder, separated, custom, etc. It has properties such as padding, whether to reverse, scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListView", + "desc": [ + "【children】 : List of child components 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Horizontal Scrolling of ListView", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when unbounded 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder Construction", + "desc": [ + "【itemCount】 : Number of items 【int】", + "【itemBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated Construction", + "desc": [ + "【separatorBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json new file mode 100644 index 00000000..77fe43fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente de lista", + "info": "El líder en la visualización de listas, capaz de contener múltiples componentes hijos, puede construirse mediante builder, separated, custom, etc. Tiene propiedades como el relleno interno, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Desplazamiento horizontal de ListView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construcción de ListView.builder", + "desc": [ + "【itemCount】 : Número de elementos 【int】", + "【itemBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construcción de ListView.separated", + "desc": [ + "【separatorBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json new file mode 100644 index 00000000..c376522b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Composant de liste", + "info": "Le leader de l'affichage de listes, contenant plusieurs sous-composants, peut être construit via builder, separated, custom, etc. Possède des attributs tels que le padding, la direction inverse, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListView", + "desc": [ + "【children】 : Liste des sous-composants 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Défilement horizontal de ListView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inverse 【bool】", + "【shrinkWrap】 : Enveloppe sans limite 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construction de ListView.builder", + "desc": [ + "【itemCount】 : Nombre d'éléments 【int】", + "【itemBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construction de ListView.separated", + "desc": [ + "【separatorBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json new file mode 100644 index 00000000..2e4d601a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente Lista", + "info": "Leader nella visualizzazione delle liste, contiene più componenti figli, può essere costruito con builder, separated, custom, ecc. Ha proprietà come padding, reverse, controller di scorrimento, ecc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ListView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scorrimento orizzontale di ListView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Costruzione di ListView.builder", + "desc": [ + "【itemCount】 : Numero di elementi 【int】", + "【itemBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Costruzione di ListView.separated", + "desc": [ + "【separatorBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json new file mode 100644 index 00000000..6b1e00e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "リストコンポーネント", + "info": "リスト表示のリーダーであり、複数の子コンポーネントを収容し、builder、separated、customなどを介して構築できます。内側の余白、反転の有無、スクロールコントローラーなどの属性があります。", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListViewの横方向スクロール", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 反転スクロールの有無 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builderの構築", + "desc": [ + "【itemCount】 : アイテムの数 【int】", + "【itemBuilder】 : アイテムビルダー 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separatedの構築", + "desc": [ + "【separatorBuilder】 : アイテムビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json new file mode 100644 index 00000000..3eea3377 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "리스트 컴포넌트", + "info": "리스트 표시의 선두주자로, 여러 하위 컴포넌트를 수용할 수 있으며 builder, separated, custom 등을 통해 구성할 수 있습니다. 내부 여백, 반대 방향 여부, 스크롤 컨트롤러 등의 속성이 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView 기본 사용", + "desc": [ + "【children】 : 하위 컴포넌트 리스트 【List】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListView 가로 스크롤", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계가 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder 구성", + "desc": [ + "【itemCount】 : 항목 개수 【int】", + "【itemBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated 구성", + "desc": [ + "【separatorBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json new file mode 100644 index 00000000..695d7485 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente de Lista", + "info": "O líder na exibição de listas, acomoda vários subcomponentes, pode ser construído através de builder, separated, custom, etc. Possui atributos como padding, reversão, controlador de deslizamento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ListView", + "desc": [ + "【children】 : Lista de subcomponentes 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Deslizamento horizontal do ListView", + "desc": [ + "【scrollDirection】 : Direção de deslizamento 【Axis】", + "【reverse】 : Deslizamento reverso 【bool】", + "【shrinkWrap】 : Envolver quando sem limites 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construção do ListView.builder", + "desc": [ + "【itemCount】 : Número de itens 【int】", + "【itemBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construção do ListView.separated", + "desc": [ + "【separatorBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json new file mode 100644 index 00000000..5999aa8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Компонент списка", + "info": "Лидер в отображении списков, вмещает несколько дочерних компонентов, может быть построен с помощью builder, separated, custom и других. Имеет такие свойства, как внутренние отступы, обратное направление, контроллер прокрутки и другие.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Горизонтальная прокрутка ListView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обернуть ли при отсутствии границ 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Конструкция ListView.builder", + "desc": [ + "【itemCount】 : Количество элементов 【int】", + "【itemBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Конструкция ListView.separated", + "desc": [ + "【separatorBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json new file mode 100644 index 00000000..c3e9400b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "列表组件", + "info": "列表显示的领军人物,容纳多个子组件,可以通过builder、separated、custom等构造。有内边距、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListView横向滑动", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder构造", + "desc": [ + "【itemCount】 : 条目个数 【int】", + "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated构造", + "desc": [ + "【separatorBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart new file mode 100644 index 00000000..a6c2a115 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-27 +/// contact me by email 1981462002@qq.com + +class CustomListView extends StatelessWidget { + const CustomListView({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + TextStyle get textStyle => const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 5), + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart new file mode 100644 index 00000000..ff9458e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class HorizontalListView extends StatelessWidget { + const HorizontalListView({super.key}); + + List get data => [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + TextStyle get textStyle => const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: ListView( + reverse: true, + shrinkWrap: true, + scrollDirection: Axis.horizontal, + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ListView/node3_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart similarity index 77% rename from packages/widgets/lib/StatelessWidget/ListView/node3_builder.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart index d951c4d8..b479f73f 100644 --- a/packages/widgets/lib/StatelessWidget/ListView/node3_builder.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart @@ -2,20 +2,11 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView.builder构造', -// "priority": 3, -// "subtitle": -// "【itemCount】 : 条目个数 【int】\n" -// "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】", -// } class BuilderListView extends StatelessWidget { - BuilderListView({Key? key}) : super(key: key); + const BuilderListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/packages/widgets/lib/StatelessWidget/ListView/node4_separated.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart similarity index 81% rename from packages/widgets/lib/StatelessWidget/ListView/node4_separated.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart index 4105d108..8ccca75a 100644 --- a/packages/widgets/lib/StatelessWidget/ListView/node4_separated.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart @@ -2,19 +2,11 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView.separated构造', -// "priority": 3, -// "subtitle": -// "【separatorBuilder】 : 条目构造器 【IndexedWidgetBuilder】", -// } class SeparatedListView extends StatelessWidget { - SeparatedListView({Key? key}) : super(key: key); + const SeparatedListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json new file mode 100644 index 00000000..2ade155c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ereignis-Listener", + "info": "Der Listener für Komponentenereignisse kann Ereignisse wie Drücken, Loslassen, Bewegen, Abbrechen usw. akzeptieren. Im Vergleich zu GestureDetector ist es primitiver und kann mehr Informationen liefern.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Listener-Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onPointerDown】 : Drücken-Ereignis 【Function(PointerDownEvent)】", + "【onPointerMove】 : Bewegen-Ereignis 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Loslassen-Ereignis 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Abbrechen-Ereignis 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json new file mode 100644 index 00000000..143fa9e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Event Listener", + "info": "A listener for component events, which can accept events such as press, release, move, cancel, etc. It is more primitive compared to GestureDetector and can obtain more information.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of Listener", + "desc": [ + "【child】 : Child component 【Widget】", + "【onPointerDown】 : Press event 【Function(PointerDownEvent)】", + "【onPointerMove】 : Move event 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Release event 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Cancel event 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json new file mode 100644 index 00000000..a601b4c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Escuchador de eventos", + "info": "Escuchador de eventos de componentes, puede aceptar eventos como presionar, soltar, mover, cancelar, etc. Es más primitivo en comparación con GestureDetector y puede obtener más información.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de Listener", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onPointerDown】 : Evento de presionar 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento de mover 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento de soltar 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento de cancelar 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json new file mode 100644 index 00000000..9fc55937 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Écouteur d'événements", + "info": "Un écouteur d'événements pour les composants, capable de recevoir des événements tels que l'appui, le relâchement, le déplacement et l'annulation. Plus primitif que GestureDetector, il permet d'obtenir plus d'informations.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de Listener", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onPointerDown】 : Événement d'appui 【Function(PointerDownEvent)】", + "【onPointerMove】 : Événement de déplacement 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Événement de relâchement 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Événement d'annulation 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json new file mode 100644 index 00000000..727234e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ascoltatore di eventi", + "info": "Un ascoltatore di eventi del componente, può accettare eventi come premere, rilasciare, muovere, annullare, ecc. Rispetto a GestureDetector è più primitivo e può ottenere più informazioni.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di Listener", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onPointerDown】 : Evento di pressione 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento di movimento 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento di rilascio 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento di annullamento 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json new file mode 100644 index 00000000..bed58802 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "イベントリスナー", + "info": "コンポーネントイベントのリスナーで、押下、離す、移動、キャンセルなどのイベントを受け取ることができます。GestureDetectorと比較して原始的で、より多くの情報を取得できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onPointerDown】 : 押下イベント 【Function(PointerDownEvent)】", + "【onPointerMove】 : 移動イベント 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 離すイベント 【Function(PointerUpEvent)】", + "【onPointerCancel】 : キャンセルイベント 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json new file mode 100644 index 00000000..51d4280f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "이벤트 리스너", + "info": "컴포넌트 이벤트의 리스너로, 누름, 놓음, 이동, 취소 등의 이벤트를 수신할 수 있습니다. GestureDetector보다 원시적이며, 더 많은 정보를 얻을 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener 기본 이벤트", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onPointerDown】 : 누름 이벤트 【Function(PointerDownEvent)】", + "【onPointerMove】 : 이동 이벤트 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 놓음 이벤트 【Function(PointerUpEvent)】", + "【onPointerCancel】 : 취소 이벤트 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json new file mode 100644 index 00000000..9902d216 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ouvinte de Eventos", + "info": "Ouvinte de eventos do componente, pode aceitar eventos como pressionar, soltar, mover, cancelar, etc. Comparado ao GestureDetector, é mais primitivo e pode obter mais informações.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do Listener", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onPointerDown】 : Evento de pressionar 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento de mover 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento de soltar 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento de cancelar 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json new file mode 100644 index 00000000..2a43cf61 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Слушатель событий", + "info": "Слушатель событий компонента, который может принимать события нажатия, отпускания, перемещения, отмены и т.д. Более примитивен, чем GestureDetector, но предоставляет больше информации.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события Listener", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onPointerDown】 : Событие нажатия 【Function(PointerDownEvent)】", + "【onPointerMove】 : Событие перемещения 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Событие отпускания 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Событие отмены 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json new file mode 100644 index 00000000..8053c35a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "事件监听器", + "info": "组件事件的监听器,可接受按下、松开、移动、取消等事件。较GestureDetector比较原始,可获取的信息也更多。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onPointerDown】 : 按下事件 【Function(PointerDownEvent)】", + "【onPointerMove】 : 移动事件 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 抬起事件 【Function(PointerUpEvent)】", + "【onPointerCancel】 : 取消事件 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart new file mode 100644 index 00000000..f302a3eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomListener extends StatefulWidget { + const CustomListener({Key? key}) : super(key: key); + + @override + _CustomListenerState createState() => _CustomListenerState(); +} + +class _CustomListenerState extends State { + String _info = ''; + + @override + Widget build(BuildContext context) { + return Listener( + onPointerDown: (detail) => setState(() => _info = detail.toString()), + onPointerMove: (detail) => setState(() => _info = detail.toString()), + onPointerUp: (detail) => setState(() => _info = detail.toString()), + onPointerCancel: (detail) => setState(() => _info = detail.toString()), + + child: Container( + alignment: Alignment.center, + width: 300, + height: 300 * 0.618, + color: Colors.grey.withAlpha(33), + child: Text( + _info, + style: const TextStyle(fontSize: 16, color: Colors.blue), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json new file mode 100644 index 00000000..30fb3fcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Banner-Komponente", + "info": "Materialstil Banner-Komponente, unterstützt links-mitte-rechts oder links-mitte-unten Struktur, kann Ränder, Hintergrundfarbe usw. angeben", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Verwendung von MaterialBanner in einer Zeile", + "desc": [ + "【content】 : Mittlere Komponente 【Widget】", + "【leading】: Linke Komponente 【Widget】", + "【actions】: Liste der rechten Komponenten 【List】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Ob die Schaltflächen unten sind 【bool】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Verwendung von MaterialBanner in zwei Zeilen", + "desc": [ + "【contentTextStyle】: Stil der mittleren Position 【TextStyle】", + "【leadingPadding】: Rand der linken Komponente 【EdgeInsetsGeometry】", + "Wenn die Anzahl der Endkomponenten größer als 1 ist, ist die Struktur der Komponente links-mitte-unten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json new file mode 100644 index 00000000..ceb877a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Banner Component", + "info": "A Material-style banner component that supports left-center-right or left-center-bottom structures, and allows specifying margins, background colors, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Usage of MaterialBanner in a Single Line", + "desc": [ + "【content】: Middle component 【Widget】", + "【leading】: Left component 【Widget】", + "【actions】: List of right components 【List】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Whether buttons are below 【bool】", + "【backgroundColor】: Background color 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Usage of MaterialBanner in Two Lines", + "desc": [ + "【contentTextStyle】: Style for the middle position 【TextStyle】", + "【leadingPadding】: Padding for the left component 【EdgeInsetsGeometry】", + "When the number of trailing components is greater than 1, the component structure is left-center-bottom." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json new file mode 100644 index 00000000..e1743171 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente de banner", + "info": "Componente de banner de estilo Material, compatible con estructuras de izquierda, centro, derecha o izquierda, centro, abajo, y permite especificar márgenes, colores de fondo, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso de MaterialBanner en una fila", + "desc": [ + "【content】 : Componente central 【Widget】", + "【leading】: Componente izquierdo 【Widget】", + "【actions】: Lista de componentes derechos 【List】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Si los botones están abajo 【bool】", + "【backgroundColor】: Color de fondo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso de MaterialBanner en dos filas", + "desc": [ + "【contentTextStyle】: Estilo de la posición central 【TextStyle】", + "【leadingPadding】: Márgenes del componente izquierdo 【EdgeInsetsGeometry】", + "Cuando el número de componentes en la cola es mayor que 1, la estructura del componente es izquierda, centro, abajo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json new file mode 100644 index 00000000..5a3856d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Composant de bannière", + "info": "Composant de bannière de style Material, prenant en charge les structures gauche-centre-droite ou gauche-centre-bas, peut spécifier les marges, la couleur de fond, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Utilisation d'une ligne de MaterialBanner", + "desc": [ + "【content】 : Composant central 【Widget】", + "【leading】: Composant gauche 【Widget】", + "【actions】: Liste des composants droits 【List】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Si les boutons sont en bas 【bool】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Utilisation de deux lignes de MaterialBanner", + "desc": [ + "【contentTextStyle】: Style de la position centrale 【TextStyle】", + "【leadingPadding】: Marge du composant gauche 【EdgeInsetsGeometry】", + "Lorsque le nombre de composants de fin est supérieur à 1, la structure du composant est gauche-centre-bas." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json new file mode 100644 index 00000000..905bb35a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente Banner", + "info": "Componente banner in stile Material, supporta strutture sinistra-centro-destra o sinistra-centro-basso, può specificare margini, colore di sfondo, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso di MaterialBanner su una riga", + "desc": [ + "【content】 : Componente centrale 【Widget】", + "【leading】: Componente sinistro 【Widget】", + "【actions】: Lista dei componenti destri 【List】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Se i pulsanti sono in basso 【bool】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso di MaterialBanner su due righe", + "desc": [ + "【contentTextStyle】: Stile della posizione centrale 【TextStyle】", + "【leadingPadding】: Margine del componente sinistro 【EdgeInsetsGeometry】", + "Quando il numero di componenti di coda è maggiore di 1, la struttura del componente è sinistra-centro-basso." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json new file mode 100644 index 00000000..6757a59d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "バナーコンポーネント", + "info": "Materialスタイルのバナーコンポーネントで、左中右または左中下の構造をサポートし、余白や背景色などを指定できます", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner一行の使用", + "desc": [ + "【content】 : 中間コンポーネント 【Widget】", + "【leading】: 左側コンポーネント 【Widget】", + "【actions】: 右側コンポーネントリスト 【List】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【forceActionsBelow】: ボタンを下に配置するかどうか 【bool】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner二行の使用", + "desc": [ + "【contentTextStyle】: 中間位置のスタイル 【TextStyle】", + "【leadingPadding】: 左側コンポーネントの余白 【EdgeInsetsGeometry】", + "末尾のコンポーネント数が1より多い場合、このコンポーネントの構造は左中下になります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json new file mode 100644 index 00000000..8451bdd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "배너 컴포넌트", + "info": "Material 스타일의 배너 컴포넌트, 좌중우 또는 좌중하 구조를 지원하며, 여백 및 배경색 등을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner 한 줄 사용", + "desc": [ + "【content】 : 중간 컴포넌트 【Widget】", + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【actions】: 오른쪽 컴포넌트 리스트 【List】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【forceActionsBelow】: 버튼이 아래에 있는지 여부 【bool】", + "【backgroundColor】: 배경색 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner 두 줄 사용", + "desc": [ + "【contentTextStyle】: 중간 위치 스타일 【TextStyle】", + "【leadingPadding】: 왼쪽 컴포넌트 여백 【EdgeInsetsGeometry】", + "꼬리 컴포넌트 수가 1보다 크면, 이 컴포넌트 구조는 좌중하입니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json new file mode 100644 index 00000000..6875665c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente de Banner", + "info": "Componente de banner no estilo Material, suporta estruturas esquerda-centro-direita ou esquerda-centro-abaixo, pode especificar margens, cor de fundo, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso de uma linha do MaterialBanner", + "desc": [ + "【content】: Componente do meio 【Widget】", + "【leading】: Componente esquerdo 【Widget】", + "【actions】: Lista de componentes direitos 【List】", + "【padding】: Margem interna 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Se os botões estão abaixo 【bool】", + "【backgroundColor】: Cor de fundo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso de duas linhas do MaterialBanner", + "desc": [ + "【contentTextStyle】: Estilo da posição central 【TextStyle】", + "【leadingPadding】: Margem do componente esquerdo 【EdgeInsetsGeometry】", + "Quando o número de componentes finais é maior que 1, a estrutura do componente é esquerda-centro-abaixo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json new file mode 100644 index 00000000..9c6300b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Компонент баннера", + "info": "Компонент баннера в стиле Material, поддерживает структуру слева-в центре-справа или слева-в центре-снизу, можно указать отступы, цвет фона и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Использование MaterialBanner в одну строку", + "desc": [ + "【content】 : Центральный компонент 【Widget】", + "【leading】: Левый компонент 【Widget】", + "【actions】: Список правых компонентов 【List】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Кнопки внизу 【bool】", + "【backgroundColor】: Цвет фона 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Использование MaterialBanner в две строки", + "desc": [ + "【contentTextStyle】: Стиль центральной позиции 【TextStyle】", + "【leadingPadding】: Отступ левого компонента 【EdgeInsetsGeometry】", + "Когда количество конечных компонентов больше 1, структура компонента становится слева-в центре-снизу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json new file mode 100644 index 00000000..d4af77e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "横幅组件", + "info": "Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner一行的使用", + "desc": [ + "【content】 : 中间组件 【Widget】", + "【leading】: 左侧组件 【Widget】", + "【actions】: 右侧组件列表 【List】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【forceActionsBelow】: 是否按钮在下方 【bool】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner两行的使用", + "desc": [ + "【contentTextStyle】: 中间位置样式 【TextStyle】", + "【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】", + "当尾部组件数量大于1,该组件结构为左中下。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart new file mode 100644 index 00000000..9d122366 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com + +class MaterialBannerDemo extends StatelessWidget { + const MaterialBannerDemo({Key? key}) : super(key: key); + + final String info = 'Welcome to Flutter Unit!'; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + MaterialBanner( + content: Text( + info, + style: const TextStyle(color: Colors.white), + ), + backgroundColor: Colors.purple, + leading: const Icon(Icons.info, color: Colors.lightBlueAccent), + padding: const EdgeInsetsDirectional.only(start: 16.0, top: 2.0), + forceActionsBelow: false, + // 默认false + actions: const [ + Text( + 'I KNOW', + style: TextStyle( + color: Colors.orange, + fontWeight: FontWeight.bold, + fontSize: 14), + ) + ], + )], + ); + } + +} diff --git a/packages/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart similarity index 83% rename from packages/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart index 7f3c18e7..d2fe347e 100644 --- a/packages/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 211, -// "name": 'MaterialBanner两行的使用', -// "priority": 2, -// "subtitle": "【contentTextStyle】: 中间位置样式 【TextStyle】\n" -// "【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】\n" -// "当尾部组件数量大于1,该组件结构为左中下。", -// } + class MaterialBannerDemoTwo extends StatelessWidget { const MaterialBannerDemoTwo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json new file mode 100644 index 00000000..01da8b87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Material-Schaltfläche", + "info": "Eine allgemeine Material-Schaltfläche, die auf RawMaterialButton basiert. Kann ein Unterelement enthalten, kann Farbe, Form usw. definieren und kann Klick- und Long-Press-Ereignisse empfangen.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton Klick-Ereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【height】: Höhe 【double】", + "【elevation】: Schattentiefe 【double】", + "【child】: Unterelement 【Widget】", + "【textColor】: Textfarbe des Unterelements 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klick-Ereignis 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton Long-Press-Ereignis", + "desc": [ + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【onLongPress】: Long-Press-Ereignis 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Benutzerdefinierte Form der MaterialButton", + "desc": [ + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json new file mode 100644 index 00000000..b9c3470e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Material Button", + "info": "A general Material button implemented based on RawMaterialButton. It can contain a child component, define colors, shapes, etc., and can receive click and long press events.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Ripple Color 【Color】", + "【height】: Height 【double】", + "【elevation】: Elevation 【double】", + "【child】: Child Component 【Widget】", + "【textColor】: Child Component Text Color 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton Long Press Event", + "desc": [ + "【highlightColor】: Long Press Highlight Color 【Color】", + "【onLongPress】: Long Press Event 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton Custom Shape", + "desc": [ + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json new file mode 100644 index 00000000..afd5833a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Botón de Material", + "info": "Botón de Material genérico implementado basado en RawMaterialButton. Puede contener un componente hijo, puede definir colores, formas, etc., y puede recibir eventos de clic y pulsación prolongada.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de MaterialButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de efecto de ondas 【Color】", + "【height】: Altura 【double】", + "【elevation】: Profundidad de sombra 【double】", + "【child】: Componente hijo 【Widget】", + "【textColor】: Color del texto del componente hijo 【Color】", + "【highlightColor】: Color de resaltado al pulsar prolongadamente 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento de pulsación prolongada de MaterialButton", + "desc": [ + "【highlightColor】: Color de resaltado al pulsar prolongadamente 【Color】", + "【onLongPress】: Evento de pulsación prolongada 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizada de MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json new file mode 100644 index 00000000..3f348033 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Bouton Matériel", + "info": "Bouton Matériel générique basé sur RawMaterialButton. Peut contenir un composant enfant, peut définir des couleurs, des formes, etc., et peut recevoir des événements de clic et de pression longue.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic de MaterialButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【height】: Hauteur 【double】", + "【elevation】: Profondeur de l'ombre 【double】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'une pression longue 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Événement de pression longue de MaterialButton", + "desc": [ + "【highlightColor】: Couleur de surbrillance lors d'une pression longue 【Color】", + "【onLongPress】: Événement de pression longue 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forme personnalisée de MaterialButton", + "desc": [ + "【shape】: Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json new file mode 100644 index 00000000..59809688 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Pulsante Material", + "info": "Un pulsante Material generico implementato sulla base di RawMaterialButton. Può contenere un componente figlio, può definire colori, forme e altre rappresentazioni, e può ricevere eventi di clic e pressione prolungata.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di MaterialButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore dell'effetto a increspatura 【Color】", + "【height】: Altezza 【double】", + "【elevation】: Profondità dell'ombra 【double】", + "【child】: Componente figlio 【Widget】", + "【textColor】: Colore del testo del componente figlio 【Color】", + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento di clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento di pressione prolungata di MaterialButton", + "desc": [ + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【onLongPress】: Evento di pressione prolungata 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizzata di MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json new file mode 100644 index 00000000..2ced6186 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "マテリアルボタン", + "info": "RawMaterialButtonをベースにした汎用Materialボタンです。子コンポーネントを保持でき、色や形状などの表現を定義でき、クリックや長押しイベントを受け取ることができます。", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【height】: 高さ 【double】", + "【elevation】: 影の深さ 【double】", + "【child】: 子コンポーネント 【Widget】", + "【textColor】: 子コンポーネントのテキスト色 【Color】", + "【highlightColor】: 長押しハイライト色 【Color】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton長押しイベント", + "desc": [ + "【highlightColor】: 長押しハイライト色 【Color】", + "【onLongPress】: 長押しイベント 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButtonのカスタム形状", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json new file mode 100644 index 00000000..a2ea2918 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "재료 버튼", + "info": "RawMaterialButton를 기반으로 구현된 일반 Material 버튼입니다. 하나의 자식 위젯을 포함할 수 있으며, 색상, 모양 등을 정의할 수 있고, 클릭 및 길게 누르기 이벤트를 받을 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【height】: 높이 【double】", + "【elevation】: 그림자 깊이 【double】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton 길게 누르기 이벤트", + "desc": [ + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【onLongPress】: 길게 누르기 이벤트 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton의 사용자 정의 모양", + "desc": [ + "【shape】: 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json new file mode 100644 index 00000000..b6784cc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Botão de Material", + "info": "Botão Material genérico implementado com base no RawMaterialButton. Pode conter um componente filho, permite definir cor, forma e outras aparências, e pode receber eventos de clique e pressão longa.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do MaterialButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【height】: Altura 【double】", + "【elevation】: Profundidade da sombra 【double】", + "【child】: Componente filho 【Widget】", + "【textColor】: Cor do texto do componente filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento de pressão longa do MaterialButton", + "desc": [ + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【onLongPress】: Evento de pressão longa 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizada do MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json new file mode 100644 index 00000000..de0df3d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Материальная кнопка", + "info": "Универсальная Material кнопка, реализованная на основе RawMaterialButton. Может содержать дочерний компонент, позволяет определять цвет, форму и другие характеристики, может принимать события нажатия и длительного нажатия.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия MaterialButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвет водяного эффекта 【Color】", + "【height】: Высота 【double】", + "【elevation】: Глубина тени 【double】", + "【child】: Дочерний компонент 【Widget】", + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Событие длительного нажатия MaterialButton", + "desc": [ + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【onLongPress】: Событие длительного нажатия 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Пользовательская форма MaterialButton", + "desc": [ + "【shape】: Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json new file mode 100644 index 00000000..649b27fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "材料按钮", + "info": "基于RawMaterialButton实现的通用Material按钮。可盛放一个子组件,能定义颜色、形状等表现,可接收点击和长按事件。", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【height】: 高 【double】", + "【elevation】: 影深 【double】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton长按事件", + "desc": [ + "【highlightColor】: 长按高亮色 【Color】", + "【onLongPress】: 长按事件 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton的自定义形状", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart new file mode 100644 index 00000000..40b063c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomMaterialButton extends StatelessWidget { + const CustomMaterialButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialButton( + height: 40, + elevation: 5, + color: Colors.blue, + textColor: Colors.white, + splashColor: Colors.orangeAccent, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + child: const Text("MaterialButton"), + onPressed: () { + + // Navigator.of(context).pushNamed('AboutMePage'); + }); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart new file mode 100644 index 00000000..a0d3c2ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class LongPressMaterialButton extends StatelessWidget { + const LongPressMaterialButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialButton( + height: 40, + elevation: 5, + color: Colors.blue, + highlightColor: Colors.green, + textColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + child: const Text("MaterialButton"), + onLongPress: () { + // Navigator.of(context).pushNamed('AboutMePage'); + }, + onPressed: () { + // Navigator.of(context).pushNamed('AboutMePage'); + }); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart new file mode 100644 index 00000000..5e497291 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class ShapeMaterialButton extends StatelessWidget { + const ShapeMaterialButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 20, + children: [ + SizedBox( + width: 40, + height: 40, + child: MaterialButton( + padding: const EdgeInsets.all(0), + textColor: const Color(0xffFfffff), + elevation: 3, + color: Colors.blue, + highlightColor: const Color(0xffF88B0A), + splashColor: Colors.red, + child: const Icon( + Icons.add, + color: Colors.white, + ), + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + ), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), + ), + SizedBox( + width: 100, + height: 40, + child: MaterialButton( + padding: const EdgeInsets.all(0), + textColor: const Color(0xffFfffff), + elevation: 3, + color: Colors.blue, + highlightColor: const Color(0xffF88B0A), + splashColor: Colors.red, + child: const Icon( + Icons.remove, + color: Colors.white, + ), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15))), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json new file mode 100644 index 00000000..68f51a75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barriere Modul", + "info": "Entspricht einer Vorhangschicht, die verhindert, dass der Benutzer mit den dahinter liegenden Widgets interagiert. Es kann durch dismissible festgelegt werden, ob beim Klicken der Rückgabestapel ausgelöst wird. Im Quellcode wird es für Dialog-bezogene Komponenten verwendet.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier Einführung", + "desc": [ + "【dismissible】 : Klicken, um zurückzukehren 【bool】", + "【color】 : Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json new file mode 100644 index 00000000..2a27ad7a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Modal Barrier", + "info": "Equivalent to a curtain layer, preventing users from interacting with the Widget behind it. It can be determined by dismissible whether to trigger the back stack when clicked. Used in the source code for Dialog related components.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ModalBarrier", + "desc": [ + "【dismissible】: Whether to return when clicked 【bool】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json new file mode 100644 index 00000000..9756ab1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barrera Modal", + "info": "Equivale a una capa de cortina que evita que el usuario interactúe con los Widgets detrás de ella. Se puede decidir si se activa la pila de retorno al hacer clic a través de dismissible. En el código fuente, se utiliza para componentes relacionados con Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ModalBarrier", + "desc": [ + "【dismissible】: Si se retorna al hacer clic 【bool】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json new file mode 100644 index 00000000..c81a6a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barrière modale", + "info": "Équivaut à une couche de rideau, empêchant l'utilisateur d'interagir avec les Widgets derrière. Peut être configuré pour déclencher ou non la pile de retour lors d'un clic via dismissible. Utilisé dans les composants liés à Dialog dans le code source.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ModalBarrier", + "desc": [ + "【dismissible】 : Retour au clic 【bool】", + "【color】 : Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json new file mode 100644 index 00000000..e6ffe765 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barriera Modale", + "info": "Equivale a uno strato di tenda che impedisce all'utente di interagire con i widget dietro di esso. È possibile decidere se attivare lo stack di ritorno al clic tramite dismissible. Nel codice sorgente è utilizzato per i componenti relativi a Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ModalBarrier", + "desc": [ + "【dismissible】 : Ritorna al clic 【bool】", + "【color】 : Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json new file mode 100644 index 00000000..9993ed79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "バリアモード", + "info": "これは一種のカーテン層に相当し、ユーザーがその背後にあるウィジェットとやり取りするのを防ぎます。dismissibleを介して、クリック時に戻るスタックをトリガーするかどうかを決定できます。ソースコードではDialog関連のコンポーネントに使用されています。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 紹介", + "desc": [ + "【dismissible】 : クリック時に戻るかどうか 【bool】", + "【color】 : 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json new file mode 100644 index 00000000..1ee2365e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "배리어 모드", + "info": "막대기와 같은 역할을 하며, 사용자가 뒤에 있는 위젯과 상호 작용하지 못하도록 합니다. dismissible을 통해 클릭 시 반환 스택을 트리거할지 여부를 결정할 수 있습니다. 소스 코드에서는 Dialog 관련 컴포넌트에 사용됩니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 소개", + "desc": [ + "【dismissible】 : 클릭 시 반환 여부 【bool】", + "【color】 : 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json new file mode 100644 index 00000000..42c896a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barreira Modal", + "info": "Equivale a uma camada de cortina, impedindo que o usuário interaja com os Widgets por trás dela. Pode ser decidido através de dismissible se, ao clicar, deve-se acionar a pilha de retorno. No código-fonte, é usado para componentes relacionados ao Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ModalBarrier", + "desc": [ + "【dismissible】 : Clicar retorna 【bool】", + "【color】 : Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json new file mode 100644 index 00000000..3102cc56 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Барьер", + "info": "Эквивалентно слою занавеса, который предотвращает взаимодействие пользователя с виджетами за ним. Можно определить, будет ли нажатие вызывать возврат в стек, с помощью dismissible. В исходном коде используется для компонентов, связанных с диалогами.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ModalBarrier", + "desc": [ + "【dismissible】 : Возврат при нажатии 【bool】", + "【color】 : Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json new file mode 100644 index 00000000..1cd6dd28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "屏障模", + "info": "相当于一块幕布层,防止用户与其背后的 Widget 交互,可以通过 dismissible 决定点击时,是否触发返回栈。源码中用于 Dialog 相关组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 介绍", + "desc": [ + "【dismissible】 : 点击是否返回 【bool】", + "【color】 : 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart new file mode 100644 index 00000000..449fd8ef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com + +class ModalBarrierDemo extends StatelessWidget { + const ModalBarrierDemo({Key? key}) : super(key: key); + + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + height: 100, + child: Stack(alignment: Alignment.center, children: [ + ModalBarrier( + dismissible: true, + color: Colors.grey.withOpacity(0.3), + ), + const Text('点击背景返回') + ]), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json new file mode 100644 index 00000000..3cc6538b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Navigationsleiste", + "info": "Allgemeine Strukturkomponente mit links, mittig und rechts Modus, kann den Abstand der mittleren Komponente zum linken Rand und ob sie zentriert ist, festlegen. Der Quellcode wird in Strukturen wie der AppBar verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der NavigationToolbar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【middle】: Mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【centerMiddle】: Ob die mittlere Komponente zentriert ist 【bool】", + "【middleSpacing】: Abstand der mittleren Komponente zum linken Rand 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json new file mode 100644 index 00000000..b6475225 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Navigation Toolbar", + "info": "A general structural component with left-center-right mode, which can specify the left margin of the middle component and whether it is centered. The source code is used in the structure of navigation bars such as AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NavigationToolbar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Right component 【Widget】", + "【centerMiddle】: Whether the middle component is centered 【bool】", + "【middleSpacing】: Distance of the middle component from the left 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json new file mode 100644 index 00000000..d168fd87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra de herramientas de navegación", + "info": "Componente de estructura común en modo izquierdo, central y derecho, se puede especificar el margen izquierdo del componente central y si está centrado. El código fuente lo utiliza en estructuras de barras de navegación como AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NavigationToolbar", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【middle】: Componente central 【Widget】", + "【trailing】: Componente derecho 【Widget】", + "【centerMiddle】: Si el componente central está centrado 【bool】", + "【middleSpacing】: Distancia del componente central al margen izquierdo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json new file mode 100644 index 00000000..ef615c10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barre d'outils de navigation", + "info": "Un composant structurel universel avec un modèle gauche-centre-droit, qui permet de spécifier la marge gauche du composant central et s'il est centré. Le code source est utilisé dans des structures de barres de navigation comme AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NavigationToolbar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【middle】: Composant central 【Widget】", + "【trailing】: Composant droit 【Widget】", + "【centerMiddle】: Si le composant central est centré 【bool】", + "【middleSpacing】: Distance du composant central par rapport à la gauche 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json new file mode 100644 index 00000000..378c4499 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra degli strumenti di navigazione", + "info": "Componente strutturale generico con modalità sinistra, centrale e destra, può specificare la distanza del componente centrale dal margine sinistro e se è centrato. Il codice sorgente viene utilizzato in strutture come AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di NavigationToolbar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】: Componente centrale 【Widget】", + "【trailing】: Componente destro 【Widget】", + "【centerMiddle】: Se il componente centrale è centrato 【bool】", + "【middleSpacing】: Distanza del componente centrale dal lato sinistro 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json new file mode 100644 index 00000000..ce590eda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "ナビゲーションツールバー", + "info": "左中右モードの汎用構造コンポーネントで、中央コンポーネントの左側のマージンと中央揃えかどうかを指定できます。ソースコードはAppBarなどのナビゲーションバー構造で使用されています。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbarの基本的な使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【middle】: 中央コンポーネント 【Widget】", + "【trailing】: 右側コンポーネント 【Widget】", + "【centerMiddle】: 中央コンポーネントを中央揃えにするかどうか 【bool】", + "【middleSpacing】: 中央コンポーネントの左側からの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json new file mode 100644 index 00000000..4c9cd245 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "네비게이션 툴바", + "info": "좌중우 모드의 일반 구조 컴포넌트로, 중간 컴포넌트의 왼쪽 여백 및 중앙 정렬 여부를 지정할 수 있습니다. 소스 코드는 AppBar 등 네비게이션 바 구조에서 이를 사용합니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbar 기본 사용", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】: 중간 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【centerMiddle】: 중간 컴포넌트 중앙 정렬 여부 【bool】", + "【middleSpacing】: 중간 컴포넌트의 왼쪽 여백 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json new file mode 100644 index 00000000..8dec55ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra de Ferramentas de Navegação", + "info": "Componente estrutural genérico no modo esquerdo-central-direito, pode especificar a margem esquerda do componente central e se está centralizado. O código-fonte é usado em estruturas de barras de navegação como AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NavigationToolbar", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【middle】: Componente central 【Widget】", + "【trailing】: Componente direito 【Widget】", + "【centerMiddle】: Se o componente central está centralizado 【bool】", + "【middleSpacing】: Distância do componente central à esquerda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json new file mode 100644 index 00000000..8a398841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Панель навигации", + "info": "Универсальный структурный компонент с левым, центральным и правым режимами, можно указать отступ центрального компонента от левого края и выравнивание по центру. Исходный код используется в структурах навигационных панелей, таких как AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NavigationToolbar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】: Центральный компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【centerMiddle】: Выравнивание центрального компонента по центру 【bool】", + "【middleSpacing】: Расстояние центрального компонента от левого края 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json new file mode 100644 index 00000000..0fea6ef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "导航工具条", + "info": "左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】: 中间组件 【Widget】", + "【trailing】: 右侧组件组件 【Widget】", + "【centerMiddle】: 中间组件是否居中 【bool】", + "【middleSpacing】: 中间组件距左距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart new file mode 100644 index 00000000..37e89d96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/20 +/// contact me by email 1981462002@qq.com + +class NavigationToolbarDemo extends StatelessWidget { + const NavigationToolbarDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: const [ + SizedBox( + height: 60, + child: NavigationToolbar( + leading: Icon(Icons.ac_unit), + middle: Text('middleSpacing#true'), + middleSpacing: 20, + centerMiddle: true, + trailing: Icon(Icons.more_vert), + ), + ), + SizedBox( + height: 60, + child: NavigationToolbar( + leading: Icon(Icons.ac_unit), + middle: Text('middleSpacing#false'), + middleSpacing: 20, + centerMiddle: false, + trailing: Icon(Icons.more_vert), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json new file mode 100644 index 00000000..7ed6f083 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Benachrichtigungs-Listener", + "info": "Sie können den generischen Typ T von Notification angeben, um Änderungen dieses Typs zu überwachen. Flutter bietet viele integrierte Benachrichtigungen für das Scrollen, aber Sie können auch benutzerdefinierte Benachrichtigungen erstellen und überwachen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Überwachung von OverscrollIndicatorNotification", + "desc": [ + "Diese Benachrichtigung wird nur dann zurückgerufen, wenn bis zum obersten oder untersten Rand gescrollt wird. Die Eigenschaft 'leading' bestimmt, ob es sich um den oberen oder unteren Rand handelt. Darüber hinaus kann die blaue Schattierung beim Scrollen am oberen und unteren Rand durch notification#disallowGlow() entfernt werden." + ] + }, + { + "file": "node2_update.dart", + "name": "Überwachung von ScrollUpdateNotification", + "desc": [ + "Während des Scrollvorgangs werden die Scroll-Daten zurückgerufen, sodass Sie eine Vielzahl von Daten für Operationen erhalten können." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json new file mode 100644 index 00000000..798e2267 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Notification Listener", + "info": "You can specify the sub-generic type T of Notification to listen for changes of that type. Flutter has many built-in sliding Notifications, and of course, you can also customize Notifications for listening.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listen to OverscrollIndicatorNotification", + "desc": [ + "This notification is called back when sliding to the top and bottom, and it is judged whether it is the top or bottom by the leading property. In addition, you can remove the blue shadow at the top and bottom sliding through notification#disallowGlow()." + ] + }, + { + "file": "node2_update.dart", + "name": "Listen to ScrollUpdateNotification", + "desc": [ + "During the sliding process, the sliding data is called back, and you can obtain a large amount of data to operate." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json new file mode 100644 index 00000000..f70e983b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Escuchador de notificaciones", + "info": "Puede especificar el subgenérico T de Notification para escuchar cambios en ese tipo. Flutter tiene muchas notificaciones de desplazamiento integradas, por supuesto, también puedes personalizar las notificaciones para escucharlas.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Escuchar OverscrollIndicatorNotification", + "desc": [ + "Esta notificación se devuelve de llamada después de deslizarse hasta la parte superior e inferior, y se juzga si es la parte superior o la inferior a través de la propiedad leading. Además, a través de notification#disallowGlow(), se puede eliminar la sombra azul de deslizamiento superior e inferior." + ] + }, + { + "file": "node2_update.dart", + "name": "Escuchar ScrollUpdateNotification", + "desc": [ + "Durante el proceso de desplazamiento, se devuelven los datos de desplazamiento, y puedes obtener una gran cantidad de datos para operar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json new file mode 100644 index 00000000..8ae278a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Écouteur de notifications", + "info": "Vous pouvez spécifier le sous-générique T de Notification pour écouter les changements de ce type. Flutter intègre de nombreuses notifications de défilement, bien sûr, vous pouvez également personnaliser les notifications pour les écouter.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Écouter OverscrollIndicatorNotification", + "desc": [ + "Cette notification est rappelée uniquement lors du défilement vers le haut ou le bas, en utilisant la propriété leading pour déterminer si c'est le haut ou le bas. De plus, en utilisant notification#disallowGlow(), vous pouvez supprimer l'ombre bleue du défilement en haut et en bas." + ] + }, + { + "file": "node2_update.dart", + "name": "Écouter ScrollUpdateNotification", + "desc": [ + "Pendant le défilement, les données de défilement sont rappelées, vous pouvez obtenir de nombreuses données pour les manipuler." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json new file mode 100644 index 00000000..a9a7e5c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Ascoltatore di Notifiche", + "info": "È possibile specificare il sottotipo generico T di Notification per monitorare i cambiamenti di quel tipo. Flutter include molte notifiche di scorrimento integrate, ma puoi anche creare e monitorare notifiche personalizzate.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Monitorare OverscrollIndicatorNotification", + "desc": [ + "Questa notifica viene richiamata solo quando si scorre fino in cima o in fondo, e si può determinare se si tratta della cima o del fondo tramite la proprietà leading. Inoltre, è possibile rimuovere l'ombra blu dello scorrimento in cima e in fondo utilizzando notification#disallowGlow()." + ] + }, + { + "file": "node2_update.dart", + "name": "Monitorare ScrollUpdateNotification", + "desc": [ + "Durante lo scorrimento, i dati di scorrimento vengono richiamati, permettendoti di ottenere molti dati per operazioni successive." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json new file mode 100644 index 00000000..24341936 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "通知リスナー", + "info": "NotificationのサブジェネリックTを指定して、そのタイプの変更を監視できます。Flutterには多くのスライドNotificationが組み込まれており、もちろん独自のNotificationを監視することもできます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverscrollIndicatorNotificationを監視", + "desc": [ + "この通知は、最上部または最下部にスライドしたときにコールバックされ、leadingプロパティを使用して上部か下部かを判断します。また、notification#disallowGlow()を使用して、上部と下部のスライド時の青色の影を取り除くことができます。" + ] + }, + { + "file": "node2_update.dart", + "name": "ScrollUpdateNotificationを監視", + "desc": [ + "スライド中にスライドデータをコールバックし、大量のデータを取得して操作することができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json new file mode 100644 index 00000000..e514456f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "알림 리스너", + "info": "Notification의 하위 제네릭 T를 지정하여 해당 유형의 변경 사항을 감지할 수 있습니다. Flutter에는 많은 스크롤 Notification이 내장되어 있으며, 물론 사용자 정의 Notification을 감지할 수도 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverscrollIndicatorNotification 감지", + "desc": [ + "이 알림은 스크롤이 가장 위나 가장 아래에 도달했을 때 콜백되며, leading 속성을 통해 상단인지 하단인지 판단할 수 있습니다. 또한 notification#disallowGlow()를 통해 상하단 스크롤 시 파란색 그림자를 제거할 수 있습니다." + ] + }, + { + "file": "node2_update.dart", + "name": "ScrollUpdateNotification 감지", + "desc": [ + "스크롤 과정에서 스크롤 데이터를 콜백하며, 이를 통해 많은 데이터를 얻어 작업할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json new file mode 100644 index 00000000..debe830e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Ouvinte de Notificação", + "info": "Pode especificar o subgenérico T de Notification para monitorar alterações desse tipo. O Flutter possui muitas Notificações de deslizamento integradas, mas você também pode criar e monitorar suas próprias Notificações personalizadas.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Monitorar OverscrollIndicatorNotification", + "desc": [ + "Esta notificação é chamada de volta apenas quando o deslizamento atinge o topo ou o fundo, e o atributo leading determina se é o topo ou o fundo. Além disso, através de notification#disallowGlow(), é possível remover a sombra azul do deslizamento no topo e no fundo." + ] + }, + { + "file": "node2_update.dart", + "name": "Monitorar ScrollUpdateNotification", + "desc": [ + "Durante o processo de deslizamento, os dados de deslizamento são chamados de volta, permitindo que você obtenha uma grande quantidade de dados para operações." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json new file mode 100644 index 00000000..25132315 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Слушатель уведомлений", + "info": "Можно указать подтип T для Notification, чтобы отслеживать изменения этого типа. В Flutter встроено множество уведомлений о прокрутке, конечно, вы также можете настроить свои собственные уведомления для отслеживания.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Отслеживание OverscrollIndicatorNotification", + "desc": [ + "Это уведомление вызывается только при прокрутке до самого верха или низа, и можно определить, верх это или низ, с помощью свойства leading. Кроме того, с помощью notification#disallowGlow() можно убрать синюю тень при прокрутке вверху и внизу." + ] + }, + { + "file": "node2_update.dart", + "name": "Отслеживание ScrollUpdateNotification", + "desc": [ + "В процессе прокрутки данные о прокрутке передаются обратно, и вы можете получить множество данных для работы." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json new file mode 100644 index 00000000..e659e451 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "通知监听器", + "info": "可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "监听OverscrollIndicatorNotification", + "desc": [ + "该通知之后在滑动到最顶和最底是回调,通过leading属性判断是顶部还是底部。另外通过notification#disallowGlow(),可以去除顶底滑动蓝色阴影" + ] + }, + { + "file": "node2_update.dart", + "name": "监听ScrollUpdateNotification", + "desc": [ + "在滑动过程中对滑动数据进行回调,你可以获取大量数据来进行操作。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart new file mode 100644 index 00000000..ed6f9456 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart @@ -0,0 +1,61 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/14 +/// contact me by email 1981462002@qq.com + + +class NotificationListenerDemo extends StatefulWidget { + const NotificationListenerDemo({Key? key}) : super(key: key); + + @override + _NotificationListenerDemoState createState() => _NotificationListenerDemoState(); +} + +class _NotificationListenerDemoState extends State { + final List data = List.generate(30, (i) => '第${i + 1}条'); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 250, + child: NotificationListener( + onNotification: _onNotification, + child: CupertinoScrollbar( + child: ListView.separated( + itemBuilder: _buildItem, + itemCount: data.length, + separatorBuilder: (_,__)=>const Divider(height: 5,), + ), + )), + ); + } + + bool _onNotification(OverscrollIndicatorNotification notification) { + if (notification.leading) { + notification.disallowIndicator(); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('已滑到顶部'), + backgroundColor: Colors.blue, + duration: Duration(milliseconds: 200), + )); + } else { + notification.disallowIndicator(); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('已滑到底部'), + duration: Duration(milliseconds: 200), + backgroundColor: Colors.blue, + )); + } + + return true; + } + + Widget _buildItem(BuildContext context, int index) { + return Container( + height: 50, + alignment: Alignment.center, + child: Text(data[index],style: TextStyle(color: Theme.of(context).primaryColor,fontSize: 18),), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart similarity index 86% rename from packages/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart rename to modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart index 990f803e..b7195b1d 100644 --- a/packages/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/14 /// contact me by email 1981462002@qq.com -/// 说明: NotificationListener 210 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 -// { -// "widgetId": 220, -// "name": "监听ScrollUpdateNotification", -// "priority": 2, -// "subtitle": "在滑动过程中对滑动数据进行回调,你可以获取大量数据来进行操作。", -// } + class NotificationListenerUpdate extends StatefulWidget { const NotificationListenerUpdate({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json new file mode 100644 index 00000000..a5091791 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Ausrichtungs-Builder", + "info": "Kann zurückmelden, ob das übergeordnete Element horizontal oder vertikal ist, und kann darauf basierend verschiedene untergeordnete Elemente erstellen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OrientationBuilder", + "desc": [ + "【builder】 : Ausrichtungskomponenten-Builder 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json new file mode 100644 index 00000000..77d4311f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Orientation Builder", + "info": "Can callback whether the parent component is horizontal or vertical, and can build different child components based on this.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OrientationBuilder", + "desc": [ + "【builder】: Orientation component builder 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json new file mode 100644 index 00000000..79d4f460 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Constructor de Orientación", + "info": "Puede devolver una llamada para determinar si el componente padre es horizontal o vertical, y puede construir diferentes componentes secundarios en consecuencia.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OrientationBuilder", + "desc": [ + "【builder】: Constructor de componentes de orientación 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json new file mode 100644 index 00000000..b026d882 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Constructeur d'orientation", + "info": "Capable de rappeler si le composant parent est horizontal ou vertical, et peut construire différents composants enfants en conséquence.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'OrientationBuilder", + "desc": [ + "【builder】 : Constructeur de composant d'orientation 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json new file mode 100644 index 00000000..3ee33c71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Costruttore di Orientamento", + "info": "Può richiamare se il componente genitore è orizzontale o verticale, e può costruire diversi componenti figli in base a ciò.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di OrientationBuilder", + "desc": [ + "【builder】 : Costruttore del componente di orientamento 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json new file mode 100644 index 00000000..51eafbef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "方向ビルダー", + "info": "親コンポーネントが横向きか縦向きかをコールバックでき、それに応じて異なる子コンポーネントを構築できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilderの基本的な使用", + "desc": [ + "【builder】 : 方向コンポーネントビルダー 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json new file mode 100644 index 00000000..acd5e42f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "방향 빌더", + "info": "부모 구성 요소가 가로 방향인지 세로 방향인지 콜백할 수 있으며, 이를 기반으로 다른 자식 구성 요소를 구축할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilder 기본 사용", + "desc": [ + "【builder】 : 방향 구성 요소 빌더 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json new file mode 100644 index 00000000..db124afa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Construtor de Orientação", + "info": "Pode retornar se o componente pai é horizontal ou vertical, e pode construir diferentes componentes filhos com base nisso.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do OrientationBuilder", + "desc": [ + "【builder】 : Construtor de componentes de orientação 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json new file mode 100644 index 00000000..060e68fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Ориентация строителя", + "info": "Может обратно вызывать, является ли родительский компонент горизонтальным или вертикальным, и может создавать различные дочерние компоненты на основе этого.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OrientationBuilder", + "desc": [ + "【builder】 : Строитель компонента ориентации 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json new file mode 100644 index 00000000..3a25ec69 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "方向构造器", + "info": "能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilder基本使用", + "desc": [ + "【builder】 : 方向组件构造器 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart new file mode 100644 index 00000000..1f383a90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com + +class OrientationBuilderDemo extends StatefulWidget { + const OrientationBuilderDemo({Key? key}) : super(key: key); + + @override + _OrientationBuilderDemoState createState() => _OrientationBuilderDemoState(); +} + +class _OrientationBuilderDemoState extends State { + double _width = 200; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: _width, + height: 200, + child: OrientationBuilder(builder: _builder), + color: Colors.orange, + ), + _buildSlider() + ], + ); + } + + //根据回调的orientation返回组件 + Widget _builder(BuildContext context, Orientation orientation) { + switch(orientation){ + case Orientation.portrait: + return const Icon(Icons.phone_android,size: 60,); + case Orientation.landscape: + return const RotatedBox( + quarterTurns: 1, + child: Icon(Icons.phone_android,size: 60,)); + default: return Container(); + } + } + + Widget _buildSlider() =>Slider( + value: _width, + max: 350.0, + min: 80.0, + divisions: 17, + onChanged: (v)=> setState(() => _width= v), + ); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json new file mode 100644 index 00000000..5b472ff8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Umriss-Schaltfläche", + "info": "Schaltfläche mit Rahmenstil, basierend auf MaterialButton implementiert, alle Eigenschaften ähnlich wie MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton Klickereignis", + "desc": [ + "【textColor】: Textfarbe der Unterkomponente 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【highlightedBorderColor】: Rahmenfarbe bei Hervorhebung 【Color】", + "【child】: Unterkomponente 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【borderSide】: Randlinie 【BorderSide】", + "【onPressed】: Klickereignis 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Die OutlineButton-Schaltfläche hat die Bühne in Flutter 3.0 verlassen. Der Ersatz ist die OutlinedButton-Schaltfläche.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Umriss-Schaltfläche", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json new file mode 100644 index 00000000..d8fffcfb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Outline Button", + "info": "A button with a border style, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton Click Event", + "desc": [ + "【textColor】: Text color of child component 【Color】", + "【splashColor】: Ripple color 【Color】", + "【highlightColor】: Long press highlight color 【Color】", + "【highlightedBorderColor】: Border color when highlighted 【Color】", + "【child】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderSide】: Border side 【BorderSide】", + "【onPressed】: Click event 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'The OutlineButton has been phased out in Flutter 3.0. It is replaced by the OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json new file mode 100644 index 00000000..48c34e9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Botón de contorno", + "info": "Botón con estilo de borde, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de OutlineButton", + "desc": [ + "【textColor】: Color del texto del componente hijo 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【highlightedBorderColor】: Color del borde al resaltar 【Color】", + "【child】: Componente hijo 【Widget】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【borderSide】: Línea del borde 【BorderSide】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón OutlineButton dejó de estar disponible en Flutter 3.0. Su reemplazo es el botón OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Botón de contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json new file mode 100644 index 00000000..5dfc0235 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Bouton à contour", + "info": "Bouton de style à bordure, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic OutlineButton", + "desc": [ + "【textColor】: Couleur du texte des composants enfants 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【highlightedBorderColor】: Couleur de la bordure en surbrillance 【Color】", + "【child】: Composant enfant 【Widget】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【borderSide】: Bordure 【BorderSide】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton OutlineButton a quitté la scène historique dans Flutter 3.0. Il est remplacé par le bouton OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Bouton à contour", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json new file mode 100644 index 00000000..0b312f10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Pulsante a contorno", + "info": "Pulsante con stile bordo, implementato basandosi su MaterialButton, tutte le proprietà sono simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di OutlineButton", + "desc": [ + "【textColor】: Colore del testo del componente figlio 【Color】", + "【splashColor】: Colore dell'effetto ripple 【Color】", + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【highlightedBorderColor】: Colore del bordo durante l'evidenziazione 【Color】", + "【child】: Componente figlio 【Widget】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【borderSide】: Linea del bordo 【BorderSide】", + "【onPressed】: Evento di clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante OutlineButton è stato ritirato in Flutter 3.0. Il suo sostituto è il pulsante OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Pulsante a contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json new file mode 100644 index 00000000..6ff6ea27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "アウトライン ボタン", + "info": "枠線スタイルのボタンで、MaterialButtonをベースに実装されており、すべてのプロパティはMaterialButtonと同様です。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButtonクリックイベント", + "desc": [ + "【textColor】: 子コンポーネントのテキストカラー 【Color】", + "【splashColor】: 波紋カラー 【Color】", + "【highlightColor】: 長押し時のハイライトカラー 【Color】", + "【highlightedBorderColor】: ハイライト時の枠線カラー 【Color】", + "【child】: 子コンポーネント 【Widget】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【borderSide】: 枠線 【BorderSide】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton ボタンは Flutter3.0 で歴史の舞台から退場しました。代替として OutlinedButton ボタンがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(枠線ボタン", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json new file mode 100644 index 00000000..8105312e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "아웃라인 버튼", + "info": "테두리 스타일 버튼, MaterialButton을 기반으로 구현되었으며, 모든 속성은 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton 클릭 이벤트", + "desc": [ + "【textColor】: 자식 컴포넌트 텍스트 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【highlightedBorderColor】: 강조 시 테두리 색상 【Color】", + "【child】: 자식 컴포넌트 【Widget】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【borderSide】: 테두리 선 【BorderSide】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton 버튼은 Flutter3.0에서 역사의 무대에서 퇴장했습니다. 대체자는 OutlinedButton 버튼입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(아웃라인 버튼", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json new file mode 100644 index 00000000..dedf8eff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Botão de Contorno", + "info": "Botão de estilo de borda, implementado com base no MaterialButton, todas as propriedades são semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do OutlineButton", + "desc": [ + "【textColor】: Cor do texto do componente filho 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【highlightedBorderColor】: Cor da borda ao destacar 【Color】", + "【child】: Componente filho 【Widget】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【borderSide】: Linha da borda 【BorderSide】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão OutlineButton saiu de cena no Flutter 3.0. O substituto é o botão OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Botão de Contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json new file mode 100644 index 00000000..b4a9f8a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Кнопка с контуром", + "info": "Кнопка с рамкой, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия OutlineButton", + "desc": [ + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【splashColor】: Цвет водяного эффекта 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【highlightedBorderColor】: Цвет рамки при подсветке 【Color】", + "【child】: Дочерний компонент 【Widget】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【borderSide】: Линия рамки 【BorderSide】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка OutlineButton ушла в историю с выходом Flutter 3.0. Ее заменила кнопка OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Кнопка с контуром", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json new file mode 100644 index 00000000..ffaa5f47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "线框按钮", + "info": "边框样式按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton点击事件", + "desc": [ + "【textColor】: 子组件文字颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【highlightedBorderColor】: 高亮时框色 【Color】", + "【child】: 子组件 【Widget】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【borderSide】: 边线 【BorderSide】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton 按钮于 Flutter3.0 退出历史舞台。取代者为 OutlinedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(边线按钮", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart new file mode 100644 index 00000000..3c8df034 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomOutlineButton extends StatelessWidget { + const CustomOutlineButton({Key? key}) : super(key: key); + + final String info = + 'OutlineButton 按钮于 Flutter3.0 退出历史舞台。取代者为 OutlinedButton 按钮。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json new file mode 100644 index 00000000..a459a8b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Seitenspeicher", + "info": "Kann den Seitenstatus speichern und den Status beim Wechseln der Seite beibehalten. Im Quellcode wird es in ScrollView, PageView, ExpansionTile usw. verwendet.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PageStorage", + "desc": [ + "【bucket】 : Speicherbereich 【PageStorageBucket】", + "【child】: Untergeordnete Komponente 【Widget】", + "Beim Initialisieren der Komponente beim Wechseln der Oberfläche wird der Status nicht zurückgesetzt. Wie bei CountWidget muss die untergeordnete Komponente beim Initialisieren den Status aus dem Speicher lesen und beim Ändern des Status den Status in den Speicher schreiben. Außerdem ist PageStorage bereits in MaterialApp integriert, aber Sie können auch ein PageStorage erstellen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json new file mode 100644 index 00000000..dd4ed4b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Page Storage", + "info": "Can store the state of a page, maintaining the state when switching pages. It is used in ScrollView, PageView, ExpansionTile, etc. in the source code.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PageStorage", + "desc": [ + "【bucket】: Storage Area 【PageStorageBucket】", + "【child】: Child Widget 【Widget】", + "When switching interfaces and initializing components, the state will not be reset. As in the CountWidget example, the child component needs to read the state from the storage during initialization and write the state to the storage when changing the state. Additionally, MaterialApp already has PageStorage built-in, but you can also create your own PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json new file mode 100644 index 00000000..ca743ed2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Almacenamiento de Página", + "info": "Puede almacenar el estado de la página, manteniendo el estado al cambiar de página. En el código fuente, se utiliza en ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PageStorage", + "desc": [ + "【bucket】: Área de almacenamiento 【PageStorageBucket】", + "【child】: Componente hijo 【Widget】", + "Al cambiar de interfaz y inicializar componentes, el estado no se restablecerá. Como en CountWidget, el componente hijo necesita leer el estado del almacenamiento durante la inicialización y escribir el estado en el almacenamiento al cambiar el estado. Además, si usas MaterialApp, ya tiene PageStorage incorporado, pero también puedes crear uno." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json new file mode 100644 index 00000000..5c913143 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Stockage de page", + "info": "Permet de stocker l'état de la page, ce qui permet de maintenir l'état lors du changement de page. Il est utilisé dans le code source de ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PageStorage", + "desc": [ + "【bucket】 : Zone de stockage 【PageStorageBucket】", + "【child】: Composant enfant 【Widget】", + "Lors de l'initialisation des composants en changeant d'interface, l'état n'est pas réinitialisé. Comme dans CountWidget, le composant enfant doit lire l'état du stockage lors de l'initialisation et écrire l'état dans le stockage lors du changement d'état. De plus, si vous utilisez MaterialApp, PageStorage est déjà intégré, mais vous pouvez également créer un PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json new file mode 100644 index 00000000..53e06b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Memoria di pagina", + "info": "Consente di memorizzare lo stato della pagina, mantenendo lo stato durante il cambio di pagina. Nel codice sorgente, viene utilizzato in ScrollView, PageView, ExpansionTile, ecc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PageStorage", + "desc": [ + "【bucket】 : Area di archiviazione 【PageStorageBucket】", + "【child】: Componente figlio 【Widget】", + "Quando si inizializzano i componenti durante il cambio di interfaccia, lo stato non viene reimpostato. Ad esempio, nel caso di CountWidget, il componente figlio deve leggere lo stato dalla memoria durante l'inizializzazione e scrivere lo stato nella memoria quando lo stato cambia. Inoltre, se si utilizza MaterialApp, PageStorage è già integrato, ma è comunque possibile creare un PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json new file mode 100644 index 00000000..14259a6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "ページストレージ", + "info": "ページの状態を保存することができ、ページを切り替える際に状態を保持することができます。ソースコードでは、ScrollView、PageView、ExpansionTileなどに適用されています。", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorageの基本使用", + "desc": [ + "【bucket】 : ストレージエリア 【PageStorageBucket】", + "【child】: 子コンポーネント 【Widget】", + "上記のインターフェースを切り替える際、コンポーネントの初期化時に状態がリセットされることはありません。例えばCountWidgetでは、子コンポーネントは初期化時にストレージから状態を読み取り、状態を変更する際に状態をストレージに書き込む必要があります。また、MaterialAppを使用すると、すでにPageStorageが組み込まれていますが、自分でPageStorageを作成することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json new file mode 100644 index 00000000..77bbbfac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "페이지 스토리지", + "info": "페이지 상태를 저장할 수 있으며, 페이지 전환 시 상태를 유지할 수 있습니다. 소스 코드에서 ScrollView, PageView, ExpansionTile 등에 적용되어 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorage 기본 사용", + "desc": [ + "【bucket】 : 저장 영역 【PageStorageBucket】", + "【child】: 자식 위젯 【Widget】", + "위에서 인터페이스를 전환할 때 초기화 컴포넌트는 상태를 재설정하지 않습니다. 위의 CountWidget과 같이, 자식 컴포넌트는 초기화 시 스토리지에서 상태를 읽어야 하며, 상태를 변경할 때 상태를 스토리지에 기록해야 합니다. 또한, MaterialApp을 사용하면 이미 내장된 PageStorage가 있지만, PageStorage를 직접 생성할 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json new file mode 100644 index 00000000..e440872a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Armazenamento de Página", + "info": "Pode armazenar o estado da página, mantendo o estado ao alternar entre páginas. No código-fonte, é aplicado em ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PageStorage", + "desc": [ + "【bucket】: Área de armazenamento 【PageStorageBucket】", + "【child】: Componente filho 【Widget】", + "Ao alternar a interface e inicializar componentes, o estado não será redefinido. Como no CountWidget, o componente filho precisa ler o estado do armazenamento durante a inicialização e escrever o estado no armazenamento ao alterar o estado. Além disso, se usar o MaterialApp, o PageStorage já está embutido, mas você também pode criar um PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json new file mode 100644 index 00000000..16b638c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Хранилище страниц", + "info": "Позволяет сохранять состояние страницы, чтобы оно сохранялось при переключении страниц. Используется в исходном коде в ScrollView, PageView, ExpansionTile и других.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PageStorage", + "desc": [ + "【bucket】 : Область хранения 【PageStorageBucket】", + "【child】: Дочерний компонент 【Widget】", + "При переключении интерфейса инициализация компонентов не сбрасывает состояние. Например, CountWidget, дочерний компонент должен читать состояние из хранилища при инициализации и записывать состояние в хранилище при изменении состояния. Кроме того, если вы используете MaterialApp, PageStorage уже встроен, но вы также можете создать PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json new file mode 100644 index 00000000..f511ec00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "页面存储器", + "info": "可以将页面状态进行存储,在切页时可以保持状态。源码中在ScrollView、PageView、ExpansionTile等皆有应用。", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorage基本使用", + "desc": [ + "【bucket】 : 存储区 【PageStorageBucket】", + "【child】: 子组件 【Widget】", + "上面切换界面初始化组件时并不会将状态重置。如上CountWidget,子组件需要在初始化时从存储器中读取状态,在改变状态时将状态量写入存储器。另外,如果使用MaterialApp已经内置了PageStorage,不过你也可以创建PageStorage。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart new file mode 100644 index 00000000..5f7cf6a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/14 +/// contact me by email 1981462002@qq.com + + +class PageStorageDemo extends StatefulWidget { + const PageStorageDemo({Key? key}) : super(key: key); + + @override + _PageStorageDemoState createState() => _PageStorageDemoState(); +} + +class _PageStorageDemoState extends State { + int _pageIndex = 0; + final PageStorageBucket _bucket = PageStorageBucket(); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Scaffold( + body: PageStorage( + child: _buildContentByIndex(), + bucket: _bucket, + ), + bottomNavigationBar: BottomNavigationBar( + elevation: 0, + backgroundColor: Colors.blueAccent.withAlpha(55), + currentIndex: _pageIndex, + onTap: (int index) { + setState(() { + _pageIndex = index; + }); + }, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.settings), + label: 'Setting', + ), + ], + ), + ), + ); + } + + Widget _buildContentByIndex() { + if (_pageIndex == 0) { + return const CountWidget(key: PageStorageKey('CountWidget1')); + } + + if (_pageIndex == 1) { + return const CountWidget(key: PageStorageKey('CountWidget2')); + } + + return ListView(); + } +} + +class CountWidget extends StatefulWidget { + const CountWidget({Key? key}) : super(key: key); + + @override + _CountWidgetState createState() => _CountWidgetState(); +} + +class _CountWidgetState extends State { + int _count = 0; + + @override + void initState() { + super.initState(); + _count = PageStorage.of(context)?.readState(context); + } + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('点击了$_count次'), + MaterialButton( + onPressed: _addCount, + child: const Icon( + Icons.add, + color: Colors.white, + ), + color: Colors.green, + shape: const CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), + )) + ], + ), + ); + } + + void _addCount() { + setState(() { + _count++; + PageStorage.of(context)?.writeState(context, _count); + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json new file mode 100644 index 00000000..68fa7dad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Platzhalter-Komponente", + "info": "Eine Platzhalter-Komponente mit einem Rechteck und einem Kreuz, bei der Farbe, Linienstärke, Breite, Höhe usw. angegeben werden können.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Eigenschaften des Platzhalters", + "desc": [ + "【color】: Farbe 【Color】", + "【strokeWidth】: Linienstärke 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Fallback-Eigenschaften des Platzhalters", + "desc": [ + "Wenn der Bereich keine Breiten- und Höhenbeschränkungen hat, die Breite und Höhe der Platzhalter-Komponente.", + "【fallbackHeight】: Höhe 【double】", + "【fallbackWidth】: Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json new file mode 100644 index 00000000..2b970383 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Placeholder Component", + "info": "A placeholder component with a rectangle and a cross, which can specify properties such as color, stroke width, width, and height.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder Basic Properties", + "desc": [ + "【color】: Color 【Color】", + "【strokeWidth】: Stroke Width 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder Fallback Properties", + "desc": [ + "When there are no width and height constraints in the area, the width and height of the placeholder component.", + "【fallbackHeight】: Height 【double】", + "【fallbackWidth】: Width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json new file mode 100644 index 00000000..95a7a9a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente de marcador de posición", + "info": "Un componente de marcador de posición con un rectángulo y una cruz, que puede especificar propiedades como color, grosor de línea, ancho y alto.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades básicas de Placeholder", + "desc": [ + "【color】: Color 【Color】", + "【strokeWidth】: Grosor de línea 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propiedades de fallback de Placeholder", + "desc": [ + "Cuando no hay restricciones de ancho y alto en el área, el ancho y alto del componente de marcador de posición.", + "【fallbackHeight】: Alto 【double】", + "【fallbackWidth】: Ancho 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json new file mode 100644 index 00000000..d9df0a99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Composant d'espace réservé", + "info": "Un composant d'espace réservé avec un rectangle et une croix, pouvant spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, la largeur et la hauteur.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés de base de Placeholder", + "desc": [ + "【color】: Couleur 【Color】", + "【strokeWidth】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propriétés de fallback de Placeholder", + "desc": [ + "Lorsque la zone n'a pas de contraintes de largeur et de hauteur, la largeur et la hauteur du composant d'espace réservé.", + "【fallbackHeight】: Hauteur 【double】", + "【fallbackWidth】: Largeur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json new file mode 100644 index 00000000..3b343b5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente segnaposto", + "info": "Un componente segnaposto con un rettangolo e una croce, che può specificare proprietà come colore, larghezza della linea, larghezza e altezza.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà di base del Placeholder", + "desc": [ + "【color】: Colore 【Color】", + "【strokeWidth】: Larghezza della linea 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Proprietà fallback del Placeholder", + "desc": [ + "Quando non ci sono vincoli di larghezza e altezza nell'area, la larghezza e l'altezza del componente segnaposto.", + "【fallbackHeight】: Altezza 【double】", + "【fallbackWidth】: Larghezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json new file mode 100644 index 00000000..295dc30f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "プレースホルダーコンポーネント", + "info": "矩形とバツ印のプレースホルダーコンポーネントで、色、線の太さ、幅と高さなどの属性を指定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholderの基本属性", + "desc": [ + "【color】: 色 【Color】", + "【strokeWidth】: 線の太さ 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholderのfallback属性", + "desc": [ + "エリアに幅と高さの制約がない場合のプレースホルダーコンポーネントの幅と高さ。", + "【fallbackHeight】: 高さ 【double】", + "【fallbackWidth】: 幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json new file mode 100644 index 00000000..fe00fc2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "플레이스홀더 컴포넌트", + "info": "사각형과 엑스 표시가 있는 플레이스홀더 컴포넌트로, 색상, 선 두께, 너비 및 높이 등의 속성을 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder 기본 속성", + "desc": [ + "【color】: 색상 【Color】", + "【strokeWidth】: 선 두께 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder의 fallback 속성", + "desc": [ + "해당 영역에 너비와 높이 제약이 없을 때 플레이스홀더 컴포넌트의 너비와 높이.", + "【fallbackHeight】: 높이 【double】", + "【fallbackWidth】: 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json new file mode 100644 index 00000000..a74137ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente de Espaço Reservado", + "info": "Um componente de espaço reservado com um retângulo e um X, que permite especificar propriedades como cor, largura da linha, altura e largura.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades Básicas do Placeholder", + "desc": [ + "【color】: Cor 【Color】", + "【strokeWidth】: Espessura da Linha 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propriedades Fallback do Placeholder", + "desc": [ + "Quando a área não tem restrições de altura e largura, a altura e largura do componente de espaço reservado.", + "【fallbackHeight】: Altura 【double】", + "【fallbackWidth】: Largura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json new file mode 100644 index 00000000..51a97602 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Компонент-заглушка", + "info": "Прямоугольный компонент-заглушка с крестиком, можно указать цвет, толщину линии, ширину, высоту и другие свойства.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные свойства Placeholder", + "desc": [ + "【color】: Цвет 【Color】", + "【strokeWidth】: Толщина линии 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Свойства fallback Placeholder", + "desc": [ + "Ширина и высота компонента-заглушки, если в области нет ограничений по ширине и высоте.\"", + "【fallbackHeight】: Высота 【double】", + "【fallbackWidth】: Ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json new file mode 100644 index 00000000..00869967 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "占位组件", + "info": "一个矩形和叉叉的占位组件,可指定颜色、线宽、宽高等属性。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder基础属性", + "desc": [ + "【color】: 颜色 【Color】", + "【strokeWidth】: 线粗 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder的fallback属性", + "desc": [ + "当所在区域无宽高约束时,占位组件的宽高。\"", + "【fallbackHeight】: 高 【double】", + "【fallbackWidth】: 宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart new file mode 100644 index 00000000..560a8a2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomPlaceholder extends StatelessWidget { + const CustomPlaceholder({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const SizedBox( + width: 100, + height: 100*0.618, + child: Placeholder( + color: Colors.orangeAccent, + strokeWidth: 2, + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart new file mode 100644 index 00000000..680283b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class FallbackPlaceholder extends StatelessWidget { + const FallbackPlaceholder({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const UnconstrainedBox( + child: Placeholder( + color: Colors.blue, + strokeWidth: 2, + fallbackHeight: 100, + fallbackWidth: 150, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json new file mode 100644 index 00000000..63de5e98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Richtungsbasierte Positionierung", + "info": "Funktioniert wie die Positioned-Komponente, aber mit unterschiedlichen Eigenschaftsnamen. Kann nur in einem Stack verwendet werden und ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PositionedDirectional", + "desc": [ + "【child】 : Komponente 【Widget】", + "【top】 : Abstand zum oberen Rand des Elternelements 【double】", + "【end】 : Abstand zum rechten Rand des Elternelements 【double】", + "【start】 : Abstand zum linken Rand des Elternelements 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternelements 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json new file mode 100644 index 00000000..950dd697 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Directional Positioning", + "info": "Same functionality as the Positioned component, but with different property names. It can only be used in a Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PositionedDirectional", + "desc": [ + "【child】 : Component 【Widget】", + "【top】 : Distance to the top of the parent 【double】", + "【end】 : Distance to the right of the parent 【double】", + "【start】 : Distance to the left of the parent 【double】", + "【bottom】 : Distance to the bottom of the parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json new file mode 100644 index 00000000..8796fef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posicionamiento direccional", + "info": "Funciona igual que el componente Positioned, pero con nombres de propiedades diferentes. Solo se puede usar en Stack, y permite colocar un componente con precisión especificando las distancias desde la parte superior, inferior, izquierda y derecha.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distancia desde la parte superior del padre 【double】", + "【end】 : Distancia desde la derecha del padre 【double】", + "【start】 : Distancia desde la izquierda del padre 【double】", + "【bottom】 : Distancia desde la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json new file mode 100644 index 00000000..cf354b50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Positionnement directionnel", + "info": "Fonctionne comme le composant Positioned, mais avec des noms de propriétés différents. Ne peut être utilisé que dans une Stack, permet de positionner précisément un composant en spécifiant les distances par rapport au haut, à gauche, à droite et au bas.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PositionedDirectional", + "desc": [ + "【child】 : Composant 【Widget】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【end】 : Distance par rapport à la droite du parent 【double】", + "【start】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json new file mode 100644 index 00000000..6fb07841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posizionamento Direzionale", + "info": "Funziona come il componente Positioned, ma con nomi di attributi diversi. Può essere utilizzato solo in Stack e consente di posizionare con precisione un componente specificando le distanze da sinistra, destra, alto e basso.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【end】 : Distanza dal bordo destro del genitore 【double】", + "【start】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json new file mode 100644 index 00000000..63112a1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "方向定位", + "info": "Positionedコンポーネントと同じ機能で、属性名が異なります。Stack内でのみ使用でき、左上右下の距離を指定してコンポーネントを正確に配置できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【top】 : 親の上端までの距離 【double】", + "【end】 : 親の右端までの距離 【double】", + "【start】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json new file mode 100644 index 00000000..b807c3b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "방향 위치 지정", + "info": "Positioned 컴포넌트와 기능이 동일하며, 속성 이름이 다릅니다. Stack에서만 사용할 수 있으며, 상하좌우 거리를 지정하여 특정 컴포넌트를 정확하게 배치할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【top】 : 부모 상단까지의 거리 【double】", + "【end】 : 부모 오른쪽까지의 거리 【double】", + "【start】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json new file mode 100644 index 00000000..b594afb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posicionamento Direcional", + "info": "Funciona da mesma forma que o componente Positioned, mas com nomes de propriedades diferentes. Só pode ser usado em Stack, e permite especificar distâncias de cima, esquerda, direita e baixo para posicionar um componente com precisão.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distância até o topo do pai 【double】", + "【end】 : Distância até a direita do pai 【double】", + "【start】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json new file mode 100644 index 00000000..e0978368 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Направленное позиционирование", + "info": "Функциональность аналогична компоненту Positioned, но с разными именами свойств. Может использоваться только в Stack, позволяет точно разместить компонент, указав расстояния до верха, низа, левого и правого краев.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PositionedDirectional", + "desc": [ + "【child】 : Компонент 【Widget】", + "【top】 : Расстояние до верхнего края родителя 【double】", + "【end】 : Расстояние до правого края родителя 【double】", + "【start】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до нижнего края родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json new file mode 100644 index 00000000..225dc999 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "方向定位", + "info": "和Positioned组件功能一样,属性名不同。只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【top】 : 到父顶距离 【double】", + "【end】 : 到父右距离 【double】", + "【start】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart new file mode 100644 index 00000000..d918c053 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomPositionedDirectional extends StatelessWidget { + const CustomPositionedDirectional({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Widget yellowBox = Container( + color: Colors.yellow, + height: 100, + width: 100, + ); + + Widget redBox = Container( + color: Colors.red, + height: 90, + width: 90, + ); + + Widget greenBox = Container( + color: Colors.green, + height: 80, + width: 80, + ); + + Widget cyanBox = Container( + color: Colors.cyanAccent, + height: 70, + width: 70, + ); + + return Container( + width: 200, + height: 120, + color: Colors.grey.withAlpha(33), + child: Stack( + children: [ + yellowBox, + redBox, + PositionedDirectional(top: 20, start: 20, child: greenBox), + PositionedDirectional( + child: cyanBox, + bottom: 10, + end: 10, + ) + ], + )); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json new file mode 100644 index 00000000..462a98c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Bevorzugte Größe", + "info": "Implementiert das PreferredSizeWidget-Interface, kann ein Kind-Widget aufnehmen, bevorzugte Größe festlegen und übt keine Einschränkungen auf sein Kind-Widget aus.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize passt die Höhe der AppBar an", + "desc": [ + "【preferredSize】 : Größe 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Umwandlung und Verwendung von PreferredSize", + "desc": [ + "【PreferredSize wandelt ein normales Widget in ein PreferredSizeWidget um" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json new file mode 100644 index 00000000..9dfdf89e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Preferred Size", + "info": "Implements the PreferredSizeWidget interface, can contain a child component, sets the preferred size, and does not impose any constraints on its child component.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Adjusting AppBar Height with PreferredSize", + "desc": [ + "【preferredSize】 : size 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversion and Usage of PreferredSize", + "desc": [ + "【PreferredSize converts a regular component into a PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json new file mode 100644 index 00000000..eaa44d85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Tamaño preferido", + "info": "Implementa la interfaz PreferredSizeWidget, puede contener un componente hijo, establece un tamaño preferido y no impone ninguna restricción a su componente hijo.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajustar la altura de AppBar con PreferredSize", + "desc": [ + "【preferredSize】 : tamaño 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Uso de conversión de PreferredSize", + "desc": [ + "【PreferredSize convierte un componente normal en un PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json new file mode 100644 index 00000000..24b4e2a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Taille préférée", + "info": "Implémente l'interface PreferredSizeWidget, peut contenir un composant enfant, définit une taille préférée et n'impose aucune contrainte à son composant enfant.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajuster la hauteur de l'AppBar avec PreferredSize", + "desc": [ + "【preferredSize】 : taille 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversion et utilisation de PreferredSize", + "desc": [ + "【PreferredSize convertit un composant ordinaire en PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json new file mode 100644 index 00000000..280de33e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Dimensione Preferita", + "info": "Implementa l'interfaccia PreferredSizeWidget, può contenere un componente figlio, imposta una dimensione preferita e non applica alcun vincolo al suo componente figlio.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Regolazione dell'altezza dell'AppBar con PreferredSize", + "desc": [ + "【preferredSize】 : dimensione 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversione e utilizzo di PreferredSize", + "desc": [ + "【PreferredSize converte un componente comune in un PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json new file mode 100644 index 00000000..7e8a0068 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "優先サイズ", + "info": "PreferredSizeWidgetインターフェースを実装しており、子コンポーネントを収容し、優先サイズを設定しますが、子コンポーネントに制約を課しません。", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSizeでAppBarの高さを調整", + "desc": [ + "【preferredSize】 : サイズ 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSizeの変換と使用", + "desc": [ + "【PreferredSizeは通常のコンポーネントをPreferredSizeWidgetに変換します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json new file mode 100644 index 00000000..8d61e15c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "우선 크기", + "info": "PreferredSizeWidget 인터페이스를 구현하여 하나의 자식 위젯을 수용하고 우선 크기를 설정하며, 자식 위젯에 어떠한 제약도 가하지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize로 AppBar 높이 조정", + "desc": [ + "【preferredSize】 : 크기 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSize의 변환 사용", + "desc": [ + "【PreferredSize는 일반 위젯을 PreferredSizeWidget으로 변환합니다" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json new file mode 100644 index 00000000..20c2181b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Tamanho Preferido", + "info": "Implementa a interface PreferredSizeWidget, pode acomodar um componente filho, define o tamanho preferido e não impõe quaisquer restrições ao seu componente filho.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajustar a altura do AppBar com PreferredSize", + "desc": [ + "【preferredSize】 : tamanho 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversão e uso do PreferredSize", + "desc": [ + "【PreferredSize converte um componente comum em PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json new file mode 100644 index 00000000..ded165f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Предпочтительный размер", + "info": "Реализует интерфейс PreferredSizeWidget, может содержать дочерний компонент, устанавливает предпочтительный размер и не накладывает никаких ограничений на свои дочерние компоненты.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Настройка высоты AppBar с помощью PreferredSize", + "desc": [ + "【preferredSize】 : размер 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Преобразование и использование PreferredSize", + "desc": [ + "【PreferredSize преобразует обычный компонент в PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json new file mode 100644 index 00000000..77ca7e11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "优先尺寸", + "info": "实现了PreferredSizeWidget接口,可容纳一个子组件,设置优先尺寸,不会对其子组件施加任何约束。", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize调整AppBar高度", + "desc": [ + "【preferredSize】 : 尺寸 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSize的转化使用", + "desc": [ + "【PreferredSize将普通组件转化为PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart new file mode 100644 index 00000000..3879b6d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com + +class CustomPreferredSize extends StatelessWidget { + const CustomPreferredSize({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Scaffold( + appBar: PreferredSize( + preferredSize: const Size.fromHeight(150), + child: AppBar( + title: const Text('PreferredSize'), + ), + ), + ), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart similarity index 78% rename from packages/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart rename to modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart index 1202bbf9..b68bf26c 100644 --- a/packages/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 204, -// "name": 'PreferredSize的转化使用', -// "priority": 2, -// "subtitle": "【PreferredSize将普通组件转化为PreferredSizeWidget", -// } + class AdapterPreferredSize extends StatelessWidget { const AdapterPreferredSize({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json new file mode 100644 index 00000000..191499f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Auswahlkachel", + "info": "Eine allgemeine Listenelementstruktur, die von Flutter bereitgestellt wird, mit einer mittel-rechten Struktur und einem Radio am Ende. Komponenten können an den entsprechenden Positionen eingefügt werden, wodurch spezifische Elemente leicht angepasst werden können.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile benötigt einen generischen Typ T", + "desc": [ + "【value】 : Elementobjekt 【T】", + "【groupValue】 : Ausgewähltes Objekt 【T】", + "【selected】: Ob ausgewählt 【bool】", + "【secondary】: Rechte Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【onChanged】: Wechselereignis 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile Auswahlfarbe und dichte Anordnung", + "desc": [ + "【activeColor】 : Farbe bei Auswahl 【Color】", + "【dense】: Ob dichte Anordnung 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json new file mode 100644 index 00000000..5da2c4cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Radio Tile", + "info": "A general list item structure provided by Flutter, with a middle-right structure, and a Radio at the end. Components can be inserted at corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requires a generic type T", + "desc": [ + "【value】 : Item object 【T】", + "【groupValue】 : Selected object 【T】", + "【selected】: Whether selected 【bool】", + "【secondary】: Right component 【Widget】", + "【title】: Middle top component 【Widget】", + "【subtitle】: Middle bottom component 【Widget】", + "【onChanged】: Switch event 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile selection color and dense layout", + "desc": [ + "【activeColor】 : Color when selected 【Color】", + "【dense】: Whether dense layout 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json new file mode 100644 index 00000000..4f1d5592 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Elemento de lista de radio", + "info": "Una estructura de elemento de lista genérica proporcionada por Flutter, con una estructura de centro-derecha y un Radio al final. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requiere un tipo genérico T", + "desc": [ + "【value】 : Objeto del elemento 【T】", + "【groupValue】 : Objeto seleccionado 【T】", + "【selected】: Si está seleccionado 【bool】", + "【secondary】: Componente derecho 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de cambio 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Color de selección y disposición densa de RadioListTile", + "desc": [ + "【activeColor】 : Color cuando está seleccionado 【Color】", + "【dense】: Si está en disposición densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json new file mode 100644 index 00000000..80c5b656 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Tuile de bouton radio", + "info": "Une structure de liste générique fournie par Flutter, de structure centrale-droite, avec un bouton radio à la fin. Des composants peuvent être insérés aux positions appropriées, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile nécessite un type générique T", + "desc": [ + "【value】 : objet de l'entrée 【T】", + "【groupValue】 : objet sélectionné 【T】", + "【selected】: si sélectionné 【bool】", + "【secondary】: composant droit 【Widget】", + "【title】: composant supérieur central 【Widget】", + "【subtitle】: composant inférieur central 【Widget】", + "【onChanged】: événement de bascule 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Couleur de sélection et alignement serré de RadioListTile", + "desc": [ + "【activeColor】 : couleur lors de la sélection 【Color】", + "【dense】: si alignement serré 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json new file mode 100644 index 00000000..7f1f85e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Piastrella Radio", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura centrale-destra, e una Radio alla fine. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile adattarsi a voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile richiede un tipo generico T", + "desc": [ + "【value】 : oggetto voce 【T】", + "【groupValue】 : oggetto selezionato 【T】", + "【selected】: se selezionato 【bool】", + "【secondary】: componente a destra 【Widget】", + "【title】: componente superiore centrale 【Widget】", + "【subtitle】: componente inferiore centrale 【Widget】", + "【onChanged】: evento di cambio 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Colore selezionato e disposizione compatta di RadioListTile", + "desc": [ + "【activeColor】 : colore quando selezionato 【Color】", + "【dense】: se disposto in modo compatto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json new file mode 100644 index 00000000..e37e7747 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "ラジオタイル", + "info": "Flutterが提供する一般的なリストアイテム構造で、中央右構造で、末尾にラジオがあります。対応する位置にコンポーネントを挿入でき、特定のアイテムに簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTileはジェネリック型Tを必要とします", + "desc": [ + "【value】 : アイテムオブジェクト 【T】", + "【groupValue】 : 選択オブジェクト 【T】", + "【selected】: 選択されているかどうか 【bool】", + "【secondary】: 右側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【onChanged】: 切り替えイベント 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTileの選択色と密排", + "desc": [ + "【activeColor】 : 選択時の色 【Color】", + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json new file mode 100644 index 00000000..1deb0e6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "라디오 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 중앙-오른쪽 구조이며 끝에 라디오 버튼이 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile은 제네릭 T가 필요합니다", + "desc": [ + "【value】 : 항목 객체 【T】", + "【groupValue】 : 선택된 객체 【T】", + "【selected】: 선택 여부 【bool】", + "【secondary】: 오른쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【onChanged】: 전환 이벤트 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile 선택 색상 및 밀집 배치", + "desc": [ + "【activeColor】 : 선택 시 색상 【Color】", + "【dense】: 밀집 배치 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json new file mode 100644 index 00000000..708dd9bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Azulejo de Rádio", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de centro-direita, e um Rádio na extremidade. Componentes podem ser inseridos nas posições correspondentes, o que permite lidar facilmente com itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requer um tipo genérico T", + "desc": [ + "【value】 : objeto do item 【T】", + "【groupValue】 : objeto selecionado 【T】", + "【selected】: está selecionado 【bool】", + "【secondary】: componente à direita 【Widget】", + "【title】: componente superior no centro 【Widget】", + "【subtitle】: componente inferior no centro 【Widget】", + "【onChanged】: evento de alternância 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Cor de seleção e disposição densa do RadioListTile", + "desc": [ + "【activeColor】 : cor quando selecionado 【Color】", + "【dense】: disposição densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json new file mode 100644 index 00000000..b4a2d170 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Плитка с радиокнопкой", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет структуру с центром справа, в конце которой находится радиокнопка. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к определенным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile требует обобщенный тип T", + "desc": [ + "【value】 : объект элемента 【T】", + "【groupValue】 : выбранный объект 【T】", + "【selected】: выбран ли элемент 【bool】", + "【secondary】: правый компонент 【Widget】", + "【title】: верхний центральный компонент 【Widget】", + "【subtitle】: нижний центральный компонент 【Widget】", + "【onChanged】: событие переключения 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Цвет выбора и плотное расположение RadioListTile", + "desc": [ + "【activeColor】 : цвет при выборе 【Color】", + "【dense】: плотное расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json new file mode 100644 index 00000000..81424424 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "选钮瓦片", + "info": "Flutter提供的一个通用列表条目结构,为中右结构,尾部是一个Radio。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile需要一个泛型T", + "desc": [ + "【value】 : 条目对象 【T】", + "【groupValue】 : 选中对象 【T】", + "【selected】: 是否选中 【bool】", + "【secondary】: 右侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【onChanged】: 切换事件 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile选中色和密排", + "desc": [ + "【activeColor】 : 选中时颜色 【Color】", + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart new file mode 100644 index 00000000..9e32a0cf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + + +enum ItemType { + java, + kotlin, + dart, +} + +class ItemBean { + final String title; + final String subTitle; + final String imgUrl; + + ItemBean(this.title, this.subTitle, this.imgUrl); +} + +class CustomRadioListTile extends StatefulWidget { + const CustomRadioListTile({Key? key}) : super(key: key); + + @override + _CustomRadioListTileState createState() => _CustomRadioListTileState(); +} + +class _CustomRadioListTileState extends State { + final Map languages = { + ItemType.java: + ItemBean("Java", "曾经世界上最流行的语言", "assets/images/java.webp"), + ItemType.kotlin: + ItemBean("Kotlin", "未来世界上最流行的语言", "assets/images/kotlin.webp"), + ItemType.dart: + ItemBean("Dart", "世界上最优雅的语言", "assets/images/dart.webp"), + }; + ItemType _type = ItemType.java; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(11), + child: Column( + mainAxisSize: MainAxisSize.min, + children: languages.keys + .map((type) => RadioListTile( + value: type, + groupValue: _type, + title: Text(languages[type]!.title), + subtitle: Text(languages[type]!.subTitle), + selected: _type == type, + secondary: CircleAvatar( + backgroundImage: AssetImage(languages[type]!.imgUrl), + ), + onChanged: (ItemType? type) => setState(() => _type = type?? _type), + )) + .toList()), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart similarity index 88% rename from packages/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart index ddaa90f8..dcbd3e3c 100644 --- a/packages/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 19, -// "priority": 2, -// "name": "RadioListTile选中色和密排", -// "subtitle": "【activeColor】 : 选中时颜色 【Color】\n" -// "【dense】: 是否密排 【bool】", -// } enum ItemType { java, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json new file mode 100644 index 00000000..f18bf993 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Erhobener Button", + "info": "Ein Button mit Schatten, basierend auf MaterialButton, alle Eigenschaften ähneln MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton Klick-Ereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【elevation】: Schattentiefe 【double】", + "【child】: Untergeordnete Komponente 【Widget】", + "【textColor】: Textfarbe der Untergeordneten Komponente 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klick-Ereignis 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton wurde in Flutter 3.3 aus dem Verkehr gezogen. Der Ersatz ist der ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json new file mode 100644 index 00000000..44af003d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Raised Button", + "info": "A raised button with shadow, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Ripple Color 【Color】", + "【elevation】: Shadow Depth 【double】", + "【child】: Child Widget 【Widget】", + "【textColor】: Child Widget Text Color 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton button has exited the stage in Flutter 3.3. The replacement is the ElevatedButton button.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json new file mode 100644 index 00000000..ed720d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Botón elevado", + "info": "Un botón elevado con sombra, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de RaisedButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【elevation】: Profundidad de la sombra 【double】", + "【child】: Widget hijo 【Widget】", + "【textColor】: Color del texto del widget hijo 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón RaisedButton ha dejado de usarse a partir de Flutter 3.3. Su reemplazo es el botón ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json new file mode 100644 index 00000000..27552483 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Bouton surélevé", + "info": "Bouton surélevé avec ombre, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic sur RaisedButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【elevation】: Profondeur de l'ombre 【double】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton RaisedButton a quitté la scène historique avec Flutter 3.3. Il est remplacé par le bouton ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json new file mode 100644 index 00000000..c2a30a3a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Pulsante sollevato", + "info": "Un pulsante sollevato con ombre, basato su MaterialButton, con proprietà simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di RaisedButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore dell'effetto splash 【Color】", + "【elevation】: Profondità dell'ombra 【double】", + "【child】: Widget figlio 【Widget】", + "【textColor】: Colore del testo del widget figlio 【Color】", + "【highlightColor】: Colore di evidenziazione durante il press lungo 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento di clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante RaisedButton è uscito di scena in Flutter 3.3. Il suo sostituto è il pulsante ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json new file mode 100644 index 00000000..9e5f8b39 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "浮き上がるボタン", + "info": "影付きの浮き上がるボタンで、MaterialButtonを基に実装されています。すべてのプロパティはMaterialButtonと同様です。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋の色 【Color】", + "【elevation】: 影の深さ 【double】", + "【child】: 子ウィジェット 【Widget】", + "【textColor】: 子ウィジェットのテキスト色 【Color】", + "【highlightColor】: 長押し時のハイライト色 【Color】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton ボタンは Flutter3.3 で歴史の舞台から退きました。代替として ElevatedButton ボタンがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json new file mode 100644 index 00000000..a23105c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "떠오르는 버튼", + "info": "그림자가 있는 떠오르는 버튼, MaterialButton을 기반으로 구현되었으며 모든 속성은 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【elevation】: 그림자 깊이 【double】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton 버튼은 Flutter3.3에서 역사의 뒤안길로 사라졌습니다. 대체 버튼은 ElevatedButton입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json new file mode 100644 index 00000000..40fb855c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Botão Elevado", + "info": "Um botão elevado com sombra, baseado no MaterialButton, com todas as propriedades semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do RaisedButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de onda 【Color】", + "【elevation】: Profundidade da sombra 【double】", + "【child】: Widget filho 【Widget】", + "【textColor】: Cor do texto do widget filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Espaçamento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão RaisedButton foi descontinuado no Flutter 3.3. O substituto é o botão ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json new file mode 100644 index 00000000..fccd3d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Кнопка с тенью", + "info": "Кнопка с тенью, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия RaisedButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвол водной ряби 【Color】", + "【elevation】: Глубина тени 【double】", + "【child】: Дочерний виджет 【Widget】", + "【textColor】: Цвет текста дочернего виджета 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка RaisedButton ушла с исторической сцены в Flutter 3.3. Её заменила кнопка ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json new file mode 100644 index 00000000..e1cac5fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "浮起按钮", + "info": "有阴影的浮起按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【elevation】: 影深 【double】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart new file mode 100644 index 00000000..f8123b6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class CustomRaisedButton extends StatelessWidget { + const CustomRaisedButton({Key? key}) : super(key: key); + + final String info = + 'RaisedButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。'; + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json new file mode 100644 index 00000000..8ebab734 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Originalle Lupe", + "info": "Eine Lupe, die jede Komponente darunter vergrößern kann. Kann Eigenschaften wie Dekorationsform, Größe, Versatz usw. festlegen.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung von RawMagnifier", + "desc": [ + "【size】: Größe 【Size】", + "【magnificationScale】: Vergrößerungsmaßstab 【double】", + "【focalPointOffset】: Versatz des vergrößerten Inhalts 【Offset】", + "【decoration】: Dekoration entdecken 【MagnifierDecoration】", + "【child】: Untergeordnete Komponente 【Widget?】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Benutzerdefinierte Dekorationsform für RawMagnifier", + "desc": [ + "Hier wird eine benutzerdefinierte fünfzackige Dekorationsform erstellt" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json new file mode 100644 index 00000000..0000d344 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Original Magnifier", + "info": "A magnifier that can magnify any component below it. Properties such as decoration shape, size, offset, etc., can be set.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Simple use of RawMagnifier", + "desc": [ + "【size】: Size 【Size】", + "【magnificationScale】: Magnification 【double】", + "【focalPointOffset】: Magnification content offset 【Offset】", + "【decoration】: Decoration 【MagnifierDecoration】", + "【child】: Child component 【Widget?】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Custom decoration shape for RawMagnifier", + "desc": [ + "Customize the five-pointed star decoration shape here" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json new file mode 100644 index 00000000..f9ddd7fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lupa original", + "info": "Una lupa que puede ampliar cualquier componente debajo, permite configurar propiedades como la forma de decoración, tamaño, desplazamiento, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawMagnifier", + "desc": [ + "【size】: Tamaño 【Size】", + "【magnificationScale】: Escala de ampliación 【double】", + "【focalPointOffset】: Desplazamiento del contenido ampliado 【Offset】", + "【decoration】: Decoración de la lupa 【MagnifierDecoration】", + "【child】: Componente hijo 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma de decoración personalizada de RawMagnifier", + "desc": [ + "Aquí se personaliza la forma de decoración en estrella de cinco puntas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json new file mode 100644 index 00000000..7238b8f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Loupe brute", + "info": "Une loupe qui peut agrandir n'importe quel composant en dessous, avec des propriétés réglables telles que la forme de décoration, la taille, le décalage, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple de RawMagnifier", + "desc": [ + "【size】 : Taille 【Size】", + "【magnificationScale】 : Échelle de grossissement 【double】", + "【focalPointOffset】: Décalage du point focal 【Offset】", + "【decoration】: Décoration de découverte 【MagnifierDecoration】", + "【child】: Composant enfant 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forme de décoration personnalisée de RawMagnifier", + "desc": [ + "Ici, une forme de décoration en étoile à cinq branches personnalisée" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json new file mode 100644 index 00000000..d8de73b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lente d'ingrandimento originale", + "info": "Una lente d'ingrandimento che può ingrandire qualsiasi componente sottostante, con proprietà come forma decorativa, dimensioni, offset, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice di RawMagnifier", + "desc": [ + "【size】 : Dimensioni 【Size】", + "【magnificationScale】 : Fattore di ingrandimento 【double】", + "【focalPointOffset】: Offset del contenuto ingrandito 【Offset】", + "【decoration】: Decorazione scoperta 【MagnifierDecoration】", + "【child】: Componente figlio 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma decorativa personalizzata di RawMagnifier", + "desc": [ + "Qui viene personalizzata la forma decorativa a stella a cinque punte" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json new file mode 100644 index 00000000..363187ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "原拡大鏡", + "info": "任意のコンポーネントを拡大する拡大鏡で、装飾形状、サイズ、オフセットなどのプロパティを設定できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier の簡単な使用", + "desc": [ + "【size】 : サイズ 【Size】", + "【magnificationScale】 : 倍率 【double】", + "【focalPointOffset】: 拡大内容のオフセット 【Offset】", + "【decoration】: 装飾を発見 【MagnifierDecoration】", + "【child】: 子コンポーネント 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier カスタム装飾形状", + "desc": [ + "ここで五角形の装飾形状をカスタマイズします" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json new file mode 100644 index 00000000..3f6e4036 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "원 확대경", + "info": "아래의 임의의 컴포넌트를 확대할 수 있는 확대경으로, 장식 모양, 크기, 오프셋 등의 속성을 설정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier의 간단한 사용", + "desc": [ + "【size】 : 크기 【Size】", + "【magnificationScale】 : 확대 배율 【double】", + "【focalPointOffset】: 확대 내용 오프셋 【Offset】", + "【decoration】: 장식 발견 【MagnifierDecoration】", + "【child】: 자식 컴포넌트 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier 사용자 정의 장식 모양", + "desc": [ + "여기서 사용자 정의 오각형 장식 모양" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json new file mode 100644 index 00000000..fab2680d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lupa Original", + "info": "Uma lupa que pode ampliar qualquer componente abaixo, com propriedades configuráveis como forma de decoração, tamanho, deslocamento, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simples do RawMagnifier", + "desc": [ + "【size】 : Tamanho 【Size】", + "【magnificationScale】 : Escala de ampliação 【double】", + "【focalPointOffset】: Deslocamento do conteúdo ampliado 【Offset】", + "【decoration】: Decoração descoberta 【MagnifierDecoration】", + "【child】: Componente filho 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma de decoração personalizada do RawMagnifier", + "desc": [ + "Aqui, personaliza-se a forma de decoração em estrela de cinco pontas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json new file mode 100644 index 00000000..43de5b17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Исходная лупа", + "info": "Лупа, которая может увеличивать любой компонент под ней, можно настроить такие свойства, как форма декора, размер, смещение и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование RawMagnifier", + "desc": [ + "【size】 : Размер 【Size】", + "【magnificationScale】 : Увеличение 【double】", + "【focalPointOffset】: Смещение увеличенного содержимого 【Offset】", + "【decoration】: Обнаружение декора 【MagnifierDecoration】", + "【child】: Дочерний компонент 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Пользовательская форма декора RawMagnifier", + "desc": [ + "Здесь пользовательская форма декора в виде пятиконечной звезды" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json new file mode 100644 index 00000000..0eb7cf71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "原放大镜", + "info": "一个可以放大下方任意组件的放大镜,可以设置装饰形状、尺寸、偏移量等属性。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier 的简单使用", + "desc": [ + "【size】 : 尺寸 【Size】", + "【magnificationScale】 : 放大倍率 【double】", + "【focalPointOffset】: 放大内容偏移量 【Offset】", + "【decoration】: 发现装饰 【MagnifierDecoration】", + "【child】: 子组件 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier 自定义装饰形状", + "desc": [ + "这里自定义五角星装饰形状" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart new file mode 100644 index 00000000..a391e622 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class MagnifierCircleShape extends StatefulWidget{ + + const MagnifierCircleShape({super.key}); + + @override + State createState() => _MagnifierCircleShapeState(); +} + +class _MagnifierCircleShapeState extends State { + final Size magnifierSize = const Size(150, 150); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + GestureDetector( + onPanDown: _onPanDown, + onPanEnd: _onPanEnd, + onPanUpdate: _onPanUpdate, + onPanCancel: _onPanCancel, + child: Image.asset('assets/images/sabar_bar.webp')), + Text("张风捷特烈",style: TextStyle(color: Colors.white),), + if(_show) + Positioned( + left: _dragGesturePosition.dx, + top: _dragGesturePosition.dy, + child: _buildMagnifier()), + ], + ); + } + + Widget _buildMagnifier(){ + return RawMagnifier( + decoration: const MagnifierDecoration( + shape: CircleBorder( + side: BorderSide(color: Colors.blue, width: 2), + ), + ), + size: magnifierSize, + // focalPointOffset: Offset(-10, 0), + magnificationScale: 3, + ); + } + + Offset _dragGesturePosition = Offset.zero; + bool _show = false; + + void _onPanDown(DragDownDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + _show = true; + setState(() { + + }); + } + + void _onPanEnd(DragEndDetails details) { + setState(() => _show = false); + } + + void _onPanUpdate(DragUpdateDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + setState(() { + + }); + } + + void _onPanCancel() { + setState(() => _show = false); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart new file mode 100644 index 00000000..69fd1508 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart @@ -0,0 +1,117 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class MagnifierStarShape extends StatefulWidget{ + + const MagnifierStarShape({super.key}); + + @override + State createState() => _MagnifierStarShapeState(); +} + +class _MagnifierStarShapeState extends State { + final Size magnifierSize = const Size(150, 150); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + GestureDetector( + onPanDown: _onPanDown, + onPanEnd: _onPanEnd, + onPanUpdate: _onPanUpdate, + onPanCancel: _onPanCancel, + child: Image.asset('assets/images/sabar_bar.webp')), + Text("张风捷特烈",style: TextStyle(color: Colors.white),), + if(_show) + Positioned( + left: _dragGesturePosition.dx, + top: _dragGesturePosition.dy, + child: _buildMagnifier()), + ], + ); + } + + Widget _buildMagnifier(){ + return RawMagnifier( + decoration: MagnifierDecoration( + shape: _StarShapeBorder(), + ), + size: magnifierSize, + // focalPointOffset: Offset(-10, 0), + magnificationScale: 3, + ); + } + + Offset _dragGesturePosition = Offset.zero; + bool _show = false; + + void _onPanDown(DragDownDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + _show = true; + setState(() { + + }); + } + + void _onPanEnd(DragEndDetails details) { + setState(() => _show = false); + } + + void _onPanUpdate(DragUpdateDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + setState(() { + + }); + } + + void _onPanCancel() { + setState(() => _show = false); + } +} + +class _StarShapeBorder extends ShapeBorder { + final Path _path = Path(); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) { + return Path(); + } + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) => + nStarPath(5, rect.height / 2, rect.height / 2 * 0.5, + dx: rect.width / 2, dy: rect.height / 2); + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) { + Paint paint = Paint()..style=PaintingStyle.stroke..color=Colors.blue..strokeWidth =2; + canvas.drawPath(getOuterPath(rect), paint); + } + + Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) { + double perRad = 2 * pi / num; + double radA = perRad / 2 / 2; + double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA; + _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; + } + + @override + ShapeBorder scale(double t) => this; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json new file mode 100644 index 00000000..74eedc96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Sicherheitsbereich", + "info": "Durch das Hinzufügen von Innenabständen werden Layoutprobleme angepasst, die durch die Besonderheiten einiger Handys (abgerundete Ecken, Notch-Display usw.) verursacht werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea Verwendungstest", + "desc": [ + "【left】 : Ob die linke Seite aktiviert ist 【bool】", + "【top】 : Ob die obere Seite aktiviert ist 【bool】", + "【bottom】 : Ob die untere Seite aktiviert ist 【bool】", + "【right】 : Ob die rechte Seite aktiviert ist 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json new file mode 100644 index 00000000..e50a9b22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Safe Area", + "info": "Adapts layout issues caused by some phone-specific features (rounded corners, notches, etc.) by adding padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea Usage Test", + "desc": [ + "【left】: Whether to enable the left side 【bool】", + "【top】: Whether to enable the top 【bool】", + "【bottom】: Whether to enable the bottom 【bool】", + "【right】: Whether to enable the right side 【bool】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json new file mode 100644 index 00000000..0f677038 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Área segura", + "info": "Adapta los problemas de diseño causados por las características especiales de algunos teléfonos (esquinas redondeadas, muescas, etc.) mediante la adición de relleno.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Prueba de uso de SafeArea", + "desc": [ + "【left】 : Si está habilitado en el lado izquierdo 【bool】", + "【top】 : Si está habilitado en la parte superior 【bool】", + "【bottom】 : Si está habilitado en la parte inferior 【bool】", + "【right】 : Si está habilitado en el lado derecho 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json new file mode 100644 index 00000000..dff12976 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Zone de sécurité", + "info": "Adapte les problèmes de mise en page causés par les particularités de certains téléphones (coins arrondis, encoche, etc.) en ajoutant des marges intérieures.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Test d'utilisation de SafeArea", + "desc": [ + "【left】 : Activer à gauche 【bool】", + "【top】 : Activer en haut 【bool】", + "【bottom】 : Activer en bas 【bool】", + "【right】 : Activer à droite 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json new file mode 100644 index 00000000..b5327219 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Area Sicura", + "info": "Adatta i problemi di layout causati da alcune caratteristiche speciali dei telefoni (angoli arrotondati, notch, ecc.) aggiungendo un padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Test di utilizzo di SafeArea", + "desc": [ + "【left】 : Se abilitare il lato sinistro 【bool】", + "【top】 : Se abilitare la parte superiore 【bool】", + "【bottom】 : Se abilitare la parte inferiore 【bool】", + "【right】 : Se abilitare il lato destro 【bool】", + "【child】 : Widget figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json new file mode 100644 index 00000000..f1b2021a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "セーフエリア", + "info": "パディングを追加することで、一部のスマートフォンの特殊性(角丸、ノッチスクリーンなど)によるレイアウトの問題に対応します。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 使用テスト", + "desc": [ + "【left】 : 左側を有効にするか 【bool】", + "【top】 : 上部を有効にするか 【bool】", + "【bottom】 : 下部を有効にするか 【bool】", + "【right】 : 右側を有効にするか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json new file mode 100644 index 00000000..c9cd66af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "안전 영역", + "info": "일부 휴대폰의 특수성(둥근 모서리, 노치 등)으로 인한 레이아웃 문제를 해결하기 위해 패딩을 추가합니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 사용 테스트", + "desc": [ + "【left】 : 왼쪽 활성화 여부 【bool】", + "【top】 : 상단 활성화 여부 【bool】", + "【bottom】 : 하단 활성화 여부 【bool】", + "【right】 : 오른쪽 활성화 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json new file mode 100644 index 00000000..40f34ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Área Segura", + "info": "Adapta problemas de layout causados por características especiais de alguns telemóveis (cantos arredondados, entalhes, etc.) através da adição de padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Teste de uso do SafeArea", + "desc": [ + "【left】 : Ativar à esquerda 【bool】", + "【top】 : Ativar no topo 【bool】", + "【bottom】 : Ativar na parte inferior 【bool】", + "【right】 : Ativar à direita 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json new file mode 100644 index 00000000..3b34bfc8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Безопасная зона", + "info": "Путём добавления внутренних отступов адаптирует проблемы макета, вызванные особенностями некоторых телефонов (скруглённые углы, вырез для камеры и т.д.).", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Тестирование использования SafeArea", + "desc": [ + "【left】 : Включено ли слева 【bool】", + "【top】 : Включено ли сверху 【bool】", + "【bottom】 : Включено ли снизу 【bool】", + "【right】 : Включено ли справа 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json new file mode 100644 index 00000000..b0c52070 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "安全区", + "info": "通过添加内边距,来适配一些手机本身特殊性(圆角、刘海屏等)而所造成的布局问题。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 使用测试", + "desc": [ + "【left】 : 左侧是否启用 【bool】", + "【top】 : 上方是否启用 【bool】", + "【bottom】 : 下方是否启用 【bool】", + "【right】 : 右侧是否启用 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart new file mode 100644 index 00000000..d32b2dc5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class SafeAreaDemo extends StatelessWidget { + const SafeAreaDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(10), + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SafeAreaPage()), + ); + }, + child: const Text("进入 SafeArea 测试页"), + ), + ); + } +} + +class SafeAreaPage extends StatefulWidget { + const SafeAreaPage({Key? key}) : super(key: key); + + @override + _SafeAreaPageState createState() => _SafeAreaPageState(); +} + +class _SafeAreaPageState extends State { + bool _top = true; + bool _left = true; + bool _right = true; + bool _bottom = true; + + @override + Widget build(BuildContext context) { + return SafeArea( + top: _top, + left: _left, + right: _right, + bottom: _bottom, + child: Scaffold( + appBar: AppBar( + title: const Text( + 'SafeArea 测试', + ), + ), + body: Column( + children: [ + ..._buildSlider(), + Expanded( + child: ListView.separated( + itemCount: 20, + separatorBuilder: (_, __) => const Divider( + height: 1, + ), + itemBuilder: (_, index) => Container( + color: Colors.blue, + // padding: EdgeInsets.only(left: 20), + alignment: Alignment.center, + height: 50, + child: Text( + "第$index个", + style: const TextStyle(fontSize: 24, color: Colors.white), + ), + ), + ), + ), + ], + ), + ), + ); + } + + List _buildSlider()=>[Row( + children: [ + Switch( + value: _top, + onChanged: (v) => setState(() => _top = v), + ), + Text("top: $_top") + ], + ), + Row( + children: [ + Switch( + value: _left, + onChanged: (v) => setState(() => _left = v), + ), + Text("left: $_left") + ], + ), + Row( + children: [ + Switch( + value: _right, + onChanged: (v) => setState(() => _right = v), + ), + Text("right: $_right") + ], + ), + Row( + children: [ + Switch( + value: _bottom, + onChanged: (v) => setState(() => _bottom = v), + ), + Text("bottom: $_bottom") + ], + ),]; +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json new file mode 100644 index 00000000..360fd9ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Bildlaufansicht", + "info": "Diese Komponente wird zur Unterstützung des Scrollens verwendet. Diese Klasse ist eine abstrakte Klasse und kann daher nicht direkt verwendet werden. Sie hat viele Implementierungsklassen wie CustomScrollView, BoxScrollView, ListView und GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView Einführung", + "desc": [ + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【cacheExtent】 : Cache-Länge 【double】", + "【dragStartBehavior】 : Ziehverhalten 【DragStartBehavior】", + "【clipBehavior】 : Ausschneideverhalten 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json new file mode 100644 index 00000000..ba557c9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Scroll View", + "info": "This component is used to support scrolling. This class is an abstract class, so it cannot be used directly. It has many implementation classes, such as CustomScrollView, BoxScrollView, ListView, and GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ScrollView", + "desc": [ + "【reverse】: Whether to reverse 【bool】", + "【scrollDirection】: Scroll direction 【Axis】", + "【cacheExtent】: Cache length 【double】", + "【dragStartBehavior】: Drag behavior 【DragStartBehavior】", + "【clipBehavior】: Clip behavior 【ClipBehavior】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json new file mode 100644 index 00000000..11607c3f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Vista de desplazamiento", + "info": "Este componente se utiliza para soportar el desplazamiento, esta clase es una clase abstracta, por lo que no se puede usar directamente, tiene muchas clases de implementación, como CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ScrollView", + "desc": [ + "【reverse】 : Si es inverso 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【cacheExtent】 : Extensión de caché 【double】", + "【dragStartBehavior】 : Comportamiento de arrastre 【DragStartBehavior】", + "【clipBehavior】 : Comportamiento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json new file mode 100644 index 00000000..555f79b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Vue de défilement", + "info": "Ce composant est utilisé pour prendre en charge le défilement, cette classe est une classe abstraite, donc elle ne peut pas être utilisée directement, elle a de nombreuses classes d'implémentation, telles que CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ScrollView", + "desc": [ + "【reverse】 : Inverser ou non 【bool】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【cacheExtent】 : Longueur de cache 【double】", + "【dragStartBehavior】 : Comportement de glissement 【DragStartBehavior】", + "【clipBehavior】 : Comportement de découpage 【ClipBehavior】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json new file mode 100644 index 00000000..8a725f26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Scorrimento Vista", + "info": "Questo componente è utilizzato per supportare lo scorrimento, questa classe è una classe astratta, quindi non può essere utilizzata direttamente, ha molte classi di implementazione, come CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ScrollView", + "desc": [ + "【reverse】 : Se inverso 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【cacheExtent】 : Estensione della cache 【double】", + "【dragStartBehavior】 : Comportamento di trascinamento 【DragStartBehavior】", + "【clipBehavior】 : Comportamento di ritaglio 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json new file mode 100644 index 00000000..cfdd5527 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "スクロールビュー", + "info": "このコンポーネントはスクロールをサポートするために使用されます。このクラスは抽象クラスであるため、直接使用することはできません。CustomScrollView、BoxScrollView、ListView、GridViewなどの多くの実装クラスがあります。", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 紹介", + "desc": [ + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【cacheExtent】 : キャッシュ長 【double】", + "【dragStartBehavior】 : ドラッグ動作 【DragStartBehavior】", + "【clipBehavior】 : クリップ動作 【ClipBehavior】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json new file mode 100644 index 00000000..b9d21838 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "스크롤 뷰", + "info": "이 컴포넌트는 스크롤을 지원하기 위해 사용됩니다. 이 클래스는 추상 클래스이므로 직접 사용할 수 없으며, CustomScrollView, BoxScrollView, ListView, GridView와 같은 많은 구현 클래스가 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 소개", + "desc": [ + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【cacheExtent】 : 캐시 길이 【double】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【clipBehavior】 : 클리핑 동작 【ClipBehavior】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json new file mode 100644 index 00000000..93d6fbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Rolagem de Visualização", + "info": "Este componente é usado para suporte de rolagem, esta classe é uma classe abstrata, portanto, não pode ser usada diretamente, tem muitas classes de implementação, como CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ScrollView", + "desc": [ + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【cacheExtent】 : Extensão do cache 【double】", + "【dragStartBehavior】 : Comportamento de arrasto 【DragStartBehavior】", + "【clipBehavior】 : Comportamento de corte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json new file mode 100644 index 00000000..6b6a0c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Прокрутка", + "info": "Этот компонент используется для поддержки прокрутки. Этот класс является абстрактным, поэтому его нельзя использовать напрямую. У него есть много реализаций, таких как CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ScrollView", + "desc": [ + "【reverse】 : Обратный ли 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【cacheExtent】 : Длина кэша 【double】", + "【dragStartBehavior】 : Поведение перетаскивания 【DragStartBehavior】", + "【clipBehavior】 : Поведение обрезки 【ClipBehavior】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json new file mode 100644 index 00000000..78028aa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "视滑动图", + "info": "该组件用于滑动的支持,该类是一个抽象类,所以无法直接使用,它有很多实现类,如 CustomScrollView、BoxScrollView、ListView、GridView。", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 介绍", + "desc": [ + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【cacheExtent】 : 缓存长 【double】", + "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】", + "【clipBehavior】 : 裁剪行为 【ClipBehavior】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart new file mode 100644 index 00000000..a17fee85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com + + +class ScrollViewDemo extends StatelessWidget { + const ScrollViewDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: MyScrollView(), + ); + } +} + +class MyScrollView extends ScrollView { + MyScrollView({Key? key}) : super(key: key); + + final String info = + 'ScrollView 其内部依靠 Viewport + Scrollable 实现滑动。它只有一个 buildSlivers 的抽象方法,返回 Sliver 家族 Widget 列表,' + '其子类最简单的是 CustomScrollView,将 slivers 交由用户传递,自身打个酱油。' + 'ListView 和 GridView 在底层源码中也是使用 Sliver 家族相关组件实现的。'; + + final List data = [ + Colors.purple[50]!, + Colors.purple[100]!, + Colors.purple[200]!, + Colors.purple[300]!, + Colors.purple[400]!, + Colors.purple[500]!, + Colors.purple[600]!, + Colors.purple[700]!, + Colors.purple[800]!, + Colors.purple[900]!, + ]; + + @override + List buildSlivers(BuildContext context) { + return [ + _buildSliverAppBar(), + SliverToBoxAdapter( + child: Container( + color: Colors.blue.withOpacity(0.1), + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.all(10), + child: Text(info), + ), + ), + _buildSliverFixedExtentList() + ]; + } + + _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 190.0, + leading: Container( + margin: const EdgeInsets.all(10), + child: Image.asset('assets/images/icon_head.webp')), + flexibleSpace: FlexibleSpaceBar(//伸展处布局 + titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + title: const Text( + '张风捷特烈', + style: TextStyle(color: Colors.black, //标题 + shadows: [ + Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2) + ]), + ), + background: Image.asset( + "assets/images/caver.webp", + fit: BoxFit.cover, + ), + ), + ); + } + + Widget _buildSliverFixedExtentList() => SliverFixedExtentList( + itemExtent: 60, + delegate: SliverChildBuilderDelegate( + (_, int index) => Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: data[index], + child: Text( + colorString(data[index]), + style: const TextStyle(color: Colors.white, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2) + ]), + ), + ), + childCount: data.length), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json new file mode 100644 index 00000000..b8fc3b81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Einfacher Dialog", + "info": "Eine einfache Dialogstruktur, die Kopf- und Mittelkomponenten angeben kann. Verfügt über Textstile und Ränder für Titel und Inhalt sowie Eigenschaften wie Schattentiefe und Form. Wird oft mit SimpleDialogOption verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SimpleDialog", + "desc": [ + "【title】 : Oberste Komponente 【Widget】", + "【children】 : Liste der Unterkomponenten 【List】", + "【titlePadding】 : Oberer Innenabstand 【EdgeInsetsGeometry】", + "【contentPadding】 : Innenabstand des Inhalts 【EdgeInsetsGeometry】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json new file mode 100644 index 00000000..7ed1afdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Simple Dialog", + "info": "A simple dialog structure that allows specifying components for the header and middle sections. It has properties such as text styles and margins for the title and content, as well as shadow depth and shape. Often used in conjunction with SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SimpleDialog", + "desc": [ + "【title】 : Top component 【Widget】", + "【children】 : List of child components 【List】", + "【titlePadding】 : Top padding 【EdgeInsetsGeometry】", + "【contentPadding】 : Content padding 【EdgeInsetsGeometry】", + "【backgroundColor】 : Background color 【Color】", + "【elevation】 : Shadow depth 【double】", + "【shape】 : Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json new file mode 100644 index 00000000..338649a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Cuadro de diálogo simple", + "info": "Una estructura de cuadro de diálogo simple que permite especificar componentes en la parte superior y central. Tiene estilos de texto y márgenes para el título y el contenido, así como propiedades como profundidad de sombra, forma, etc. A menudo se usa junto con SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SimpleDialog", + "desc": [ + "【title】 : Componente superior 【Widget】", + "【children】 : Lista de componentes hijos 【List】", + "【titlePadding】 : Relleno superior 【EdgeInsetsGeometry】", + "【contentPadding】 : Relleno del contenido 【EdgeInsetsGeometry】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json new file mode 100644 index 00000000..a72754b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Boîte de dialogue simple", + "info": "Une structure de boîte de dialogue simple qui permet de spécifier des composants pour l'en-tête et le corps. Elle possède des styles de texte pour le titre et le contenu, ainsi que des propriétés telles que les marges, la profondeur d'ombre, la forme, etc. Elle est souvent utilisée avec SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SimpleDialog", + "desc": [ + "【title】 : Composant supérieur 【Widget】", + "【children】 : Liste des composants enfants 【List】", + "【titlePadding】 : Marge intérieure supérieure 【EdgeInsetsGeometry】", + "【contentPadding】 : Marge intérieure du contenu 【EdgeInsetsGeometry】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur d'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json new file mode 100644 index 00000000..773932ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Finestra di dialogo semplice", + "info": "Una struttura di finestra di dialogo semplice che consente di specificare i componenti nella parte superiore e centrale. Possiede stili di testo e margini per titoli e contenuti, nonché proprietà come profondità dell'ombra, forma, ecc. Spesso utilizzato in combinazione con SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SimpleDialog", + "desc": [ + "【title】 : Componente superiore 【Widget】", + "【children】 : Lista dei componenti figli 【List】", + "【titlePadding】 : Spaziatura interna superiore 【EdgeInsetsGeometry】", + "【contentPadding】 : Spaziatura interna del contenuto 【EdgeInsetsGeometry】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json new file mode 100644 index 00000000..a75dac7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "シンプルダイアログ", + "info": "シンプルなダイアログ構造で、ヘッダーと中央のコンポーネントを指定できます。タイトルと内容のテキストスタイルとマージン、影の深さ、形状などの属性を持っています。SimpleDialogOptionと一緒に使用されることが多いです。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogの基本使用", + "desc": [ + "【title】 : トップコンポーネント 【Widget】", + "【children】 : 子コンポーネントリスト 【List】", + "【titlePadding】 : トップパディング 【EdgeInsetsGeometry】", + "【contentPadding】 : コンテンツパディング 【EdgeInsetsGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json new file mode 100644 index 00000000..ceef0b96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "간단한 대화 상자", + "info": "간단한 대화 상자 구조로, 상단과 중간의 컴포넌트를 지정할 수 있습니다. 제목, 내용의 텍스트 스타일과 여백, 그림자 깊이, 모양 등의 속성을 가지고 있습니다. 주로 SimpleDialogOption과 함께 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialog 기본 사용법", + "desc": [ + "【title】 : 상단 컴포넌트 【Widget】", + "【children】 : 하위 컴포넌트 리스트 【List】", + "【titlePadding】 : 상단 내부 여백 【EdgeInsetsGeometry】", + "【contentPadding】 : 내용 내부 여백 【EdgeInsetsGeometry】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json new file mode 100644 index 00000000..46bf6ca2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Diálogo Simples", + "info": "Uma estrutura de diálogo simples que permite especificar componentes no topo e no meio. Possui estilos de texto e margens para o título e conteúdo, além de propriedades como sombra, forma, etc. Geralmente usado em conjunto com SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SimpleDialog", + "desc": [ + "【title】 : Componente do topo 【Widget】", + "【children】 : Lista de componentes filhos 【List】", + "【titlePadding】 : Preenchimento interno do topo 【EdgeInsetsGeometry】", + "【contentPadding】 : Preenchimento interno do conteúdo 【EdgeInsetsGeometry】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade da sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json new file mode 100644 index 00000000..f2e1b7fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Простое диалоговое окно", + "info": "Простая структура диалогового окна, которая позволяет указать компоненты в верхней и средней частях. Имеет стили текста и отступы для заголовка и содержимого, а также свойства, такие как глубина тени и форма. Часто используется вместе с SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SimpleDialog", + "desc": [ + "【title】 : Верхний компонент 【Widget】", + "【children】 : Список дочерних компонентов 【List】", + "【titlePadding】 : Верхний отступ 【EdgeInsetsGeometry】", + "【contentPadding】 : Отступ содержимого 【EdgeInsetsGeometry】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json new file mode 100644 index 00000000..5f5bbc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "简单对话框", + "info": "一个简单的对话框结构,可指定头、中处的组件。拥有拥有标题、内容的文字样式和边距,影深、形状等属性。常与SimpleDialogOption联用。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialog基本使用", + "desc": [ + "【title】 : 顶部组件 【Widget】", + "【children】 : 子组件列表 【List】", + "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart new file mode 100644 index 00000000..262eec58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-24 +/// contact me by email 1981462002@qq.com + +class CustomSimpleDialog extends StatelessWidget { + const CustomSimpleDialog({Key? key}) : super(key: key); + + final List info = const [ + '性别: 男 未婚', + '微信: zdl1994328', + "掘金: 张风捷特烈", + "github: toly1994328", + "邮箱: 1981462008@qq.com", + ]; + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + _buildSimpleDialog(context), + Positioned( + top: 70, + right: 30, + child: _buildRaisedButton(context)), + + ], + ); + } + Widget _buildRaisedButton(BuildContext context) => ElevatedButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + onPressed: () { + showDialog(context: context, builder: (ctx) => _buildSimpleDialog(ctx)); + }, + child: const Text( + 'Just Show It', + style: TextStyle(color: Colors.white), + ), + ); + + SimpleDialog _buildSimpleDialog(BuildContext context) { + return SimpleDialog( + title: _buildTitle(), + titlePadding: const EdgeInsets.only( + top: 5, + left: 20, + ), + contentPadding: const EdgeInsets.symmetric(horizontal: 5), + children: _buildChild(context), + backgroundColor: Colors.white, + elevation: 4, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + ); + } + + List _buildChild(BuildContext context) { + return info + .map((str) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SimpleDialogOption( + onPressed: () => print(str), + child: SizedBox( + width: double.infinity, + child: Text( + str, + style: const TextStyle( + color: Color(0xff999999), fontSize: 16), + ), + ), + ), + Divider( + indent: 20, + height: 12, + color: info.indexOf(str) == info.length - 1 + ? Colors.transparent + : Theme.of(context).dividerColor, + ) + ], + )) + .toList(); + } + + Widget _buildTitle() { + return Row(//标题 + children: [ + Image.asset( + "assets/images/icon_head.webp", + width: 30, + height: 30, + ), + const SizedBox( + width: 10, + ), + const Expanded( + child: Text( + "张风捷特烈", + style: TextStyle(fontSize: 18), + )), + const CloseButton() + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json new file mode 100644 index 00000000..7af364aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Einfache Dialogoption", + "info": "Eine Schaltfläche, die selten verwendet wird und normalerweise in SimpleDialog verwendet wird, um Klickereignisse zu empfangen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SimpleDialogOption", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json new file mode 100644 index 00000000..b7c0cbbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Simple Dialog Option", + "info": "A button with limited use cases, typically used in SimpleDialog to receive click events.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SimpleDialogOption", + "desc": [ + "【child】 : Child widget 【Widget】", + "【onPressed】 : Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json new file mode 100644 index 00000000..b7330359 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opción de diálogo simple", + "info": "Un botón que se usa en pocas ocasiones, generalmente en SimpleDialog, que recibe eventos de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SimpleDialogOption", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json new file mode 100644 index 00000000..7c182ece --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Option de boîte de dialogue simple", + "info": "Un bouton, rarement utilisé, généralement utilisé dans SimpleDialog, reçoit les événements de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SimpleDialogOption", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json new file mode 100644 index 00000000..0bc86c9e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opzione del Dialogo Semplice", + "info": "Un pulsante, utilizzato raramente, solitamente all'interno di SimpleDialog, che riceve eventi di clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SimpleDialogOption", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json new file mode 100644 index 00000000..d8778257 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "シンプルダイアログオプション", + "info": "ボタンで、使用シナリオが少なく、通常はSimpleDialogで使用され、クリックイベントを受け取ります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOptionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json new file mode 100644 index 00000000..09b02aa2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "간단한 대화 상자 옵션", + "info": "버튼 하나, 사용 시나리오가 적으며 일반적으로 SimpleDialog에서 사용되며 클릭 이벤트를 수신합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOption 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json new file mode 100644 index 00000000..2c814d6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opção de Diálogo Simples", + "info": "Um botão, com poucos cenários de aplicação, geralmente usado em SimpleDialog, recebe eventos de clique.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de SimpleDialogOption", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json new file mode 100644 index 00000000..29af1777 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Простая опция диалога", + "info": "Кнопка, которая редко используется, обычно используется в SimpleDialog, принимает событие нажатия.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SimpleDialogOption", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json new file mode 100644 index 00000000..54061f58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "简单对话框选项", + "info": "一个按钮,应用场景很少,通常用于SimpleDialog中,接收点击事件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOption基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart new file mode 100644 index 00000000..62f76cf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomSimpleDialogOption extends StatelessWidget { + const CustomSimpleDialogOption({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + alignment: Alignment.center, + width: double.infinity, + height: 50, + margin: const EdgeInsets.all(5), + color: Colors.grey.withAlpha(33), + child: SimpleDialogOption( + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + child: const Text('张风捷特烈')), + ), + Container( + height: 50, + alignment: Alignment.center, + width: double.infinity, + color: Colors.grey.withAlpha(33), + margin: const EdgeInsets.all(5), + child: SimpleDialogOption( + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), + child: const Text('百里·巫缨')), + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json new file mode 100644 index 00000000..04b6d9d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Einzelkind-Scrollen", + "info": "Ermöglicht einem Widget einen Scroll-Effekt, kann die Scroll-Richtung, ob umgekehrt, Scroll-Controller und andere Eigenschaften angeben.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SingleChildScrollView", + "desc": [ + "【child】 : Untergeordnetes Widget 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scrollrichtung von SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json new file mode 100644 index 00000000..ba8db73e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Single Child Scroll", + "info": "Makes a component scrollable, allowing you to specify properties such as the scroll direction, whether to reverse the direction, the scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SingleChildScrollView", + "desc": [ + "【child】: Child widget 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scroll Direction of SingleChildScrollView", + "desc": [ + "【scrollDirection】: Scroll direction 【Axis】", + "【reverse】: Whether to reverse 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json new file mode 100644 index 00000000..3a31ff53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Desplazamiento de un solo hijo", + "info": "Hace que un componente tenga un efecto de desplazamiento, y se pueden especificar propiedades como la dirección del desplazamiento, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SingleChildScrollView", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de desplazamiento de SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si es inverso 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json new file mode 100644 index 00000000..f38f7894 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Défilement à un seul enfant", + "info": "Permet à un composant d'avoir un effet de défilement, avec des propriétés telles que la direction du défilement, l'inversion, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SingleChildScrollView", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inversion 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json new file mode 100644 index 00000000..63f3993c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Scorrimento singolo figlio", + "info": "Rende un componente scorrevole, è possibile specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SingleChildScrollView", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【padding】 : spaziatura interna 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di SingleChildScrollView", + "desc": [ + "【scrollDirection】 : direzione di scorrimento 【Axis】", + "【reverse】 : invertire 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json new file mode 100644 index 00000000..cd62f691 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "シングルチャイルドスクロール", + "info": "コンポーネントにスクロール効果を持たせ、スクロールの方向、反転、スクロールコントローラーなどのプロパティを指定できます。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollViewの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollViewのスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 反転するかどうか 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json new file mode 100644 index 00000000..a88236ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "단일 자식 스크롤", + "info": "컴포넌트에 스크롤 효과를 부여하며, 스크롤 방향, 반대 방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollView 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 여부 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json new file mode 100644 index 00000000..2a8b62ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Deslizamento de Filho Único", + "info": "Torna um componente com efeito de deslizamento, podendo especificar a direção do deslizamento, se é reverso, controlador de deslizamento, entre outras propriedades.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SingleChildScrollView", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslizamento do SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Direção de deslizamento 【Axis】", + "【reverse】 : Se é reverso 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json new file mode 100644 index 00000000..04e9dc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Одиночный скролл", + "info": "Делает компонент прокручиваемым, позволяет указать направление прокрутки, обратное направление, контроллер прокрутки и другие свойства.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SingleChildScrollView", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json new file mode 100644 index 00000000..8dea51b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "单子滑动", + "info": "使一个组件具有滑动的效果,可指定滑动的方向、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollView基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart new file mode 100644 index 00000000..5c3d85b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-28 +/// contact me by email 1981462002@qq.com + +class CustomSingleChildScrollView extends StatelessWidget { + const CustomSingleChildScrollView({super.key}); + + List get data => [ + Colors.blue[50]!, + Colors.blue[100]!, + Colors.blue[200]!, + Colors.blue[300]!, + Colors.blue[400]!, + Colors.blue[500]!, + Colors.blue[600]!, + Colors.blue[700]!, + Colors.blue[800]!, + Colors.blue[900]!, + ]; + + TextStyle get textStyle => const TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ], + ); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Column( + children: data + .map((color) => Container( + alignment: Alignment.center, + height: 50, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart new file mode 100644 index 00000000..96b9351a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class DirectionSingleChildScrollView extends StatelessWidget { + const DirectionSingleChildScrollView({super.key}); + + List get data => [ + Colors.blue[50]!, + Colors.blue[100]!, + Colors.blue[200]!, + Colors.blue[300]!, + Colors.blue[400]!, + Colors.blue[500]!, + Colors.blue[600]!, + Colors.blue[700]!, + Colors.blue[800]!, + Colors.blue[900]!, + ]; + + TextStyle get textStyle => const TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ) + ], + ); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + reverse: true, + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + children: data + .map((color) => Container( + alignment: Alignment.center, + width: 90, + color: color, + child: Text( + colorString(color), + style: textStyle, + ), + )) + .toList(), + ), + ), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json new file mode 100644 index 00000000..bf007e81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Informationsleiste", + "info": "Als Komponente handelt es sich um eine einfache Strukturkomponente, die Form, Schattentiefe, Hintergrundfarbe usw. angeben kann. Wird normalerweise über die showSnackBar-Methode von ScaffoldState von unten eingeblendet.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SnackBar", + "desc": [ + "【content】 : Mittleres Inhalts-Widget 【Widget】", + "【action】 : Rechte Schaltfläche 【SnackBarAction】", + "【duration】 : Dauer 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【onVisible】 : Callback bei Anzeige 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json new file mode 100644 index 00000000..5b195a35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "SnackBar", + "info": "As a component, it is a simple structural component that can specify shape, shadow depth, background color, etc. It usually pops up from the bottom through the showSnackBar method of ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SnackBar", + "desc": [ + "【content】: Middle content component 【Widget】", + "【action】: Right side button 【SnackBarAction】", + "【duration】: Duration 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【elevation】: Shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】", + "【onVisible】: Callback when shown 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json new file mode 100644 index 00000000..27dd24e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra de información", + "info": "Como componente, es una estructura simple que puede especificar forma, profundidad de sombra, color de fondo, etc. Generalmente aparece desde la parte inferior a través del método showSnackBar de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SnackBar", + "desc": [ + "【content】 : Componente de contenido central 【Widget】", + "【action】 : Botón derecho 【SnackBarAction】", + "【duration】 : Duración 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Devolución de llamada al mostrar 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json new file mode 100644 index 00000000..2c375ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barre d'information", + "info": "En tant que composant, il s'agit d'une structure simple qui peut spécifier la forme, l'ombre, la couleur de fond, etc. Généralement, il apparaît depuis le bas via la méthode showSnackBar de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SnackBar", + "desc": [ + "【content】 : Composant de contenu central 【Widget】", + "【action】 : Bouton de droite 【SnackBarAction】", + "【duration】 : Durée 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【onVisible】 : Rappel lors de l'affichage 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json new file mode 100644 index 00000000..9bb71deb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra di notifica", + "info": "Come componente, è una struttura semplice che può specificare forma, profondità dell'ombra, colore di sfondo, ecc. Generalmente viene visualizzato dal basso tramite il metodo showSnackBar di ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SnackBar", + "desc": [ + "【content】 : Componente del contenuto centrale 【Widget】", + "【action】 : Bottone a destra 【SnackBarAction】", + "【duration】 : Durata 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Callback quando viene visualizzato 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json new file mode 100644 index 00000000..8ec32e38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "情報提示バー", + "info": "コンポーネントとして簡単な構造コンポーネントで、形状、影の深さ、背景色などを指定できます。一般的にScaffoldStateのshowSnackBarメソッドを使用して下部から表示されます。", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarの基本使用", + "desc": [ + "【content】 : 中間内容コンポーネント 【Widget】", + "【action】 : 右側ボタン 【SnackBarAction】", + "【duration】 : 持続時間 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onVisible】 : 表示時のコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json new file mode 100644 index 00000000..9d084814 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "정보 알림 바", + "info": "컴포넌트로서는 간단한 구조 컴포넌트로, 모양, 그림자 깊이, 배경색 등을 지정할 수 있습니다. 일반적으로 ScaffoldState의 showSnackBar 메소드를 통해 하단에서 팝업됩니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBar 기본 사용", + "desc": [ + "【content】 : 중간 내용 컴포넌트 【Widget】", + "【action】 : 오른쪽 버튼 【SnackBarAction】", + "【duration】 : 지속 시간 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【onVisible】 : 표시 시 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json new file mode 100644 index 00000000..8a888dd7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra de Informação", + "info": "Como componente, é uma estrutura simples que pode especificar forma, profundidade de sombra, cor de fundo, etc. Geralmente é exibido a partir da parte inferior através do método showSnackBar do ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SnackBar", + "desc": [ + "【content】 : Componente de conteúdo central 【Widget】", + "【action】 : Botão do lado direito 【SnackBarAction】", + "【duration】 : Duração 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Callback ao exibir 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json new file mode 100644 index 00000000..cf0b478b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Информационная панель", + "info": "Как компонент, это простая структурная компонента, которая может указывать форму, глубину тени, цвет фона и т.д. Обычно вызывается методом showSnackBar из ScaffoldState, появляясь снизу.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SnackBar", + "desc": [ + "【content】 : Промежуточный компонент содержимого 【Widget】", + "【action】 : Правая кнопка 【SnackBarAction】", + "【duration】 : Продолжительность 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【onVisible】 : Обратный вызов при отображении 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json new file mode 100644 index 00000000..f199b3bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "信息提示条", + "info": "作为组件来说是一个简单的结构组件,可指定形状、影深、背景色等。一般通过ScaffoldState的showSnackBar方法从底部弹出。", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBar基本使用", + "desc": [ + "【content】 : 中间内容组件 【Widget】", + "【action】 : 右侧按钮 【SnackBarAction】", + "【duration】 : 持续时长 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onVisible】 : 显示时回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart new file mode 100644 index 00000000..36cac9c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomSnackBar extends StatefulWidget { + const CustomSnackBar({Key? key}) : super(key: key); + + @override + _CustomSnackBarState createState() => _CustomSnackBarState(); +} + +class _CustomSnackBarState extends State { + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: () => + ScaffoldMessenger.of(context).showSnackBar(_buildSnackBar()), + child: const Text( + '点我弹出SnackBar', + style: TextStyle(color: Colors.white), + )); + } + + SnackBar _buildSnackBar() { + return SnackBar( + elevation: 3, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), topRight: Radius.circular(10))), + content: const Text('Wellcome to for join Flutter Unit!'), + duration: const Duration(seconds: 3), + //持续时间 + backgroundColor: Colors.red, + onVisible: () => print('onVisible'), + action: SnackBarAction( + textColor: Colors.white, label: '确定', onPressed: () {}), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json new file mode 100644 index 00000000..0d67865b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "SnackBar-Schaltfläche", + "info": "Wird im Allgemeinen nur in SnackBar verwendet, akzeptiert Klick-Ereignisse. Nach einem Klick wird die Schaltfläche deaktiviert, es können Farbe und deaktivierte Farbe angegeben werden.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SnackBarAction", + "desc": [ + "【label】 : Beschriftung 【String】", + "【textColor】 : Textfarbe 【Color】", + "【disabledTextColor】 : Deaktivierte Textfarbe 【Color】", + "【onPressed】 : Klick-Rückruf 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json new file mode 100644 index 00000000..c5bb4f65 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Snack Bar Button", + "info": "Generally used only in SnackBar, accepts click events. The button will be disabled after one click, and the color and disabled color can be specified.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SnackBarAction", + "desc": [ + "【label】 : Label 【String】", + "【textColor】 : Text Color 【Color】", + "【disabledTextColor】 : Disabled Text Color 【Color】", + "【onPressed】 : Click Callback 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json new file mode 100644 index 00000000..41e2e6d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Botón de barra de información", + "info": "Generalmente se usa solo en SnackBar, acepta eventos de clic. Después de hacer clic una vez, el botón se deshabilitará, se puede especificar el color y el color cuando está deshabilitado.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SnackBarAction", + "desc": [ + "【label】 : Etiqueta 【String】", + "【textColor】 : Color del texto 【Color】", + "【disabledTextColor】 : Color del texto deshabilitado 【Color】", + "【onPressed】 : Callback de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json new file mode 100644 index 00000000..d87e8739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Bouton de barre de message", + "info": "Généralement utilisé uniquement dans SnackBar, accepte les événements de clic. Après un clic, le bouton est désactivé, et vous pouvez spécifier la couleur et la couleur désactivée.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SnackBarAction", + "desc": [ + "【label】 : Étiquette 【String】", + "【textColor】 : Couleur du texte 【Color】", + "【disabledTextColor】 : Couleur du texte désactivé 【Color】", + "【onPressed】 : Rappel de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json new file mode 100644 index 00000000..1137e347 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Pulsante della barra di notifica", + "info": "Generalmente utilizzato solo in SnackBar, accetta eventi di clic. Dopo un clic, il pulsante viene disabilitato. È possibile specificare il colore e il colore quando è disabilitato.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SnackBarAction", + "desc": [ + "【label】 : Etichetta 【String】", + "【textColor】 : Colore del testo 【Color】", + "【disabledTextColor】 : Colore del testo disabilitato 【Color】", + "【onPressed】 : Callback del clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json new file mode 100644 index 00000000..e36d851c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "スナックバーボタン", + "info": "一般的にSnackBarでのみ使用され、クリックイベントを受け取ります。一度クリックするとボタンは無効化され、色や無効時の色を指定できます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarActionの基本使用", + "desc": [ + "【label】 : ラベル 【String】", + "【textColor】 : 文字色 【Color】", + "【disabledTextColor】 : 無効時の文字色 【Color】", + "【onPressed】 : クリックコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json new file mode 100644 index 00000000..a20a1986 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "스낵바 버튼", + "info": "일반적으로 SnackBar에서만 사용되며, 클릭 이벤트를 수신합니다. 한 번 클릭하면 버튼이 비활성화되며, 색상과 비활성화 시 색상을 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarAction 기본 사용법", + "desc": [ + "【label】 : 라벨 【String】", + "【textColor】 : 텍스트 색상 【Color】", + "【disabledTextColor】 : 텍스트 비활성화 색상 【Color】", + "【onPressed】 : 클릭 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json new file mode 100644 index 00000000..1c34e086 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Botão da Barra de Informações", + "info": "Geralmente usado apenas em SnackBar, aceita eventos de clique. Após um clique, o botão será desativado, e é possível especificar a cor e a cor quando desativado.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SnackBarAction", + "desc": [ + "【label】 : Etiqueta 【String】", + "【textColor】 : Cor do texto 【Color】", + "【disabledTextColor】 : Cor do texto desativado 【Color】", + "【onPressed】 : Callback de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json new file mode 100644 index 00000000..74e932e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Кнопка информационной панели", + "info": "Обычно используется только в SnackBar, принимает события нажатия. После одного нажатия кнопка становится отключенной, можно указать цвет и цвет в отключенном состоянии.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SnackBarAction", + "desc": [ + "【label】 : Метка 【String】", + "【textColor】 : Цвет текста 【Color】", + "【disabledTextColor】 : Цвет текста в отключенном состоянии 【Color】", + "【onPressed】 : Обратный вызов при нажатии 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json new file mode 100644 index 00000000..a5e8dc22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "信息提示条按钮", + "info": "一般只用于SnackBar中,接受点击事件。点击一次后该按钮就会被禁用,可以指定颜色和禁用时颜色。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarAction基本使用", + "desc": [ + "【label】 : 标签 【String】", + "【textColor】 : 文字颜色 【Color】", + "【disabledTextColor】 : 文字失效色 【Color】", + "【onPressed】 : 点击回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart new file mode 100644 index 00000000..65cf6ac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomSnackBarAction extends StatelessWidget { + const CustomSnackBarAction({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SnackBarAction( + disabledTextColor: Colors.red, + textColor: Colors.blue, + label: '确定', + onPressed: () => print('onPressed'), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json new file mode 100644 index 00000000..0b33068d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Raumkomponente", + "info": "Kann nur in Row-, Column- und Flex-Layouts verwendet werden. Nutzt den verbleibenden Platz als Platzhalter. Mit der flex-Eigenschaft kann der Platz für mehrere Spacer proportional zugeteilt werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Spacer", + "desc": [ + "Ein Spacer nimmt den erweiterbaren Bereich ein" + ] + }, + { + "file": "node2_flex.dart", + "name": "Raumzuweisung für mehrere Spacer", + "desc": [ + "【flex】 : Anteil der verbleibenden Raumzuweisung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json new file mode 100644 index 00000000..7bee2cc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Space Component", + "info": "Can only be used in Row, Column, and Flex layouts. It can occupy the remaining space. The flex property can be used to allocate space proportionally among multiple Spacers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Spacer", + "desc": [ + "A Spacer will occupy the extendable area" + ] + }, + { + "file": "node2_flex.dart", + "name": "Space Allocation with Multiple Spacers", + "desc": [ + "【flex】 : Proportion of remaining space allocation 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json new file mode 100644 index 00000000..11078f41 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente de espacio", + "info": "Solo se puede usar en diseños de Row, Column y Flex. Puede ocupar el espacio restante. La propiedad flex permite distribuir el espacio entre múltiples Spacer en proporción.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Spacer", + "desc": [ + "Un Spacer ocupará el área extensible" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribución de espacio entre múltiples Spacer", + "desc": [ + "【flex】 : Proporción de distribución del espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json new file mode 100644 index 00000000..bc465c76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Composant d'espace", + "info": "Ne peut être utilisé que dans les dispositions Row, Column et Flex, il occupe l'espace restant. La propriété flex permet de distribuer l'espace entre plusieurs Spacer proportionnellement.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Spacer", + "desc": [ + "Un Spacer occupe une zone extensible" + ] + }, + { + "file": "node2_flex.dart", + "name": "Répartition de l'espace entre plusieurs Spacer", + "desc": [ + "【flex】 : Proportion de répartition de l'espace restant 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json new file mode 100644 index 00000000..a0e26430 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente Spaziatore", + "info": "Può essere utilizzato solo nei layout Row, Column e Flex, occupa lo spazio rimanente e può distribuire lo spazio a più Spacer in proporzione utilizzando la proprietà flex.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Spacer", + "desc": [ + "Un Spacer occuperà l'area estensibile" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribuzione dello spazio con più Spacer", + "desc": [ + "【flex】 : percentuale di distribuzione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json new file mode 100644 index 00000000..2fc247f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "スペーサー", + "info": "Row、Column、Flexレイアウトでのみ使用可能で、残りのスペースを占めるために使用されます。flexプロパティを使用して、複数のSpacerに比例してスペースを分配できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacerの基本使用", + "desc": [ + "1つのSpacerが拡張可能な領域を占めます" + ] + }, + { + "file": "node2_flex.dart", + "name": "複数のSpacerスペース分配", + "desc": [ + "【flex】 : 残りのスペースの分配比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json new file mode 100644 index 00000000..a5c2cf17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "공간 컴포넌트", + "info": "Row, Column, Flex 레이아웃에서만 사용할 수 있으며, 남은 공간을 차지하는 데 사용됩니다. flex 속성을 사용하여 여러 Spacer에 비례적으로 공간을 배분할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacer 기본 사용", + "desc": [ + "하나의 Spacer가 확장 가능한 영역을 차지합니다" + ] + }, + { + "file": "node2_flex.dart", + "name": "여러 Spacer 공간 배분", + "desc": [ + "【flex】 : 남은 공간 배분 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json new file mode 100644 index 00000000..e1bcb082 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente de Espaço", + "info": "Só pode ser usado em layouts Row, Column e Flex, pode ocupar espaço utilizando o espaço restante, e a propriedade flex pode distribuir espaço proporcionalmente para múltiplos Spacers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Spacer", + "desc": [ + "Um Spacer ocupará a área extensível" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribuição de Espaço para Múltiplos Spacers", + "desc": [ + "【flex】 : Proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json new file mode 100644 index 00000000..c75f90e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Пространственный компонент", + "info": "Может использоваться только в макетах Row, Column и Flex, занимает оставшееся пространство. Свойство flex позволяет распределять пространство между несколькими Spacer пропорционально.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Spacer", + "desc": [ + "Один Spacer занимает расширяемую область" + ] + }, + { + "file": "node2_flex.dart", + "name": "Распределение пространства между несколькими Spacer", + "desc": [ + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json new file mode 100644 index 00000000..3e50a823 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "空间组件", + "info": "只能用于Row、Column和Flex布局中,可利用剩余空间进行占位,使用flex属性可以给多个Spacer按比例分配空间。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacer基本使用", + "desc": [ + "一个Spacer会占据可延伸区域" + ] + }, + { + "file": "node2_flex.dart", + "name": "多个Spacer空间分配", + "desc": [ + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart new file mode 100644 index 00000000..2efb18a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com + +class OneSpacer extends StatelessWidget { + const OneSpacer({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return + Container( + color: Colors.grey.withAlpha(33), + child: Row(children: [ + Container( + alignment: Alignment.center, + width: 100, + height: 50, + color: Colors.red, + ), + const Spacer(), + Container( + alignment: Alignment.center, + width: 60, + height: 50, + color: Colors.blue, + ), + ],), + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Spacer/node2_flex.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart similarity index 88% rename from packages/widgets/lib/StatelessWidget/Spacer/node2_flex.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart index 8ebdcbfc..dfc17ae7 100644 --- a/packages/widgets/lib/StatelessWidget/Spacer/node2_flex.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 107, -// "name": '多个Spacer空间分配', -// "priority": 2, -// "subtitle": -// "【flex】 : 剩余空间分配占比 【int】", -// } class ManySpacer extends StatefulWidget { const ManySpacer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json new file mode 100644 index 00000000..568dbf54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Schalterkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, mit einer linken und mittleren Struktur und einem Schalter am Ende. Komponenten können an den entsprechenden Positionen eingefügt werden, um spezifische Einträge einfach zu handhaben.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung von SwitchListTile", + "desc": [ + "【secondary】: Linke Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【inactiveThumbColor】: Farbe des Kreises, wenn nicht ausgewählt 【Color】", + "【inactiveTrackColor】: Farbe der Schiene, wenn nicht ausgewählt 【Color】", + "【activeColor】: Farbe des Kreises, wenn ausgewählt 【Color】", + "【activeTrackColor】: Farbe der Schiene, wenn ausgewählt 【Color】", + "【onChanged】: Ereignis bei Auswahl 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahleffekt von SwitchListTile", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【inactiveThumbImage】: Bild des Kreises, wenn nicht ausgewählt 【ImageProvider】", + "【activeThumbImage】: Bild des Kreises, wenn ausgewählt 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft von SwitchListTile", + "desc": [ + "【dense】: Ob dicht 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json new file mode 100644 index 00000000..b0a879fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Switch Tile", + "info": "A common list item structure provided by Flutter, with a left-center structure and a Switch at the end. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic representation of SwitchListTile", + "desc": [ + "【secondary】: Left component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【inactiveThumbColor】: Circle color when not selected 【Color】", + "【inactiveTrackColor】: Track color when not selected 【Color】", + "【activeColor】: Circle color when selected 【Color】", + "【activeTrackColor】: Track color when selected 【Color】", + "【onChanged】: Selection event 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Selection effect of SwitchListTile", + "desc": [ + "【selected】: Whether selected 【bool】", + "【inactiveThumbImage】: Circle image when not selected 【ImageProvider】", + "【activeThumbImage】: Circle image when selected 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of SwitchListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json new file mode 100644 index 00000000..956f9c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Interruptor de Lista", + "info": "Estructura de elemento de lista genérica proporcionada por Flutter, con una estructura de izquierda a centro y un Switch en la cola. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento básico de SwitchListTile es el siguiente", + "desc": [ + "【secondary】: Componente izquierdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【inactiveThumbColor】: Color del círculo cuando no está seleccionado 【Color】", + "【inactiveTrackColor】: Color de la pista cuando no está seleccionado 【Color】", + "【activeColor】: Color del círculo cuando está seleccionado 【Color】", + "【activeTrackColor】: Color de la pista cuando está seleccionado 【Color】", + "【onChanged】: Evento de selección 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección de SwitchListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【inactiveThumbImage】: Imagen del círculo cuando no está seleccionado 【ImageProvider】", + "【activeThumbImage】: Imagen del círculo cuando está seleccionado 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de densidad de SwitchListTile", + "desc": [ + "【dense】: Si está en modo denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json new file mode 100644 index 00000000..161512fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Bouton de Commutation Tuile", + "info": "Une structure de liste générique fournie par Flutter, de structure gauche-centre, avec un Switch à la fin. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de SwitchListTile est la suivante", + "desc": [ + "【secondary】: Composant gauche 【Widget】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【inactiveThumbColor】: Couleur du cercle lorsqu'il n'est pas sélectionné 【Color】", + "【inactiveTrackColor】: Couleur de la piste lorsqu'elle n'est pas sélectionnée 【Color】", + "【activeColor】: Couleur du cercle lorsqu'il est sélectionné 【Color】", + "【activeTrackColor】: Couleur de la piste lorsqu'elle est sélectionnée 【Color】", + "【onChanged】: Événement de sélection 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection de SwitchListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【inactiveThumbImage】: Image du cercle lorsqu'il n'est pas sélectionné 【ImageProvider】", + "【activeThumbImage】: Image du cercle lorsqu'il est sélectionné 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de SwitchListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json new file mode 100644 index 00000000..20b56b70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Interruttore Piastrella", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura sinistra-centrale, e un interruttore alla fine. I componenti possono essere inseriti nelle posizioni appropriate, rendendo facile adattarsi a voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di SwitchListTile è la seguente", + "desc": [ + "【secondary】: Componente sinistro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【inactiveThumbColor】: Colore del cerchio quando non selezionato 【Color】", + "【inactiveTrackColor】: Colore della scanalatura quando non selezionato 【Color】", + "【activeColor】: Colore del cerchio quando selezionato 【Color】", + "【activeTrackColor】: Colore della scanalatura quando selezionato 【Color】", + "【onChanged】: Evento di selezione 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione di SwitchListTile", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【inactiveThumbImage】: Immagine del cerchio quando non selezionato 【ImageProvider】", + "【activeThumbImage】: Immagine del cerchio quando selezionato 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di densità di SwitchListTile", + "desc": [ + "【dense】: Se denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json new file mode 100644 index 00000000..b7026233 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "スイッチリストタイル", + "info": "Flutterが提供する汎用リスト項目構造で、左中構造で、末尾にSwitchがあります。対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTileの基本表現は以下の通りです", + "desc": [ + "【secondary】: 左側コンポーネント 【Widget】", + "【title】: 中央上コンポーネント 【Widget】", + "【subtitle】: 中央下コンポーネント 【Widget】", + "【inactiveThumbColor】: 未選択時の円の色 【Color】", + "【inactiveTrackColor】: 未選択時のスロットの色 【Color】", + "【activeColor】: 選択時の円の色 【Color】", + "【activeTrackColor】: 選択時のスロットの色 【Color】", + "【onChanged】: 選択イベント 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTileの選択効果", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【inactiveThumbImage】: 未選択時の円の画像 【ImageProvider】", + "【activeThumbImage】: 選択時の円の画像 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json new file mode 100644 index 00000000..743c7513 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "스위치 리스트 타일", + "info": "Flutter에서 제공하는 일반적인 리스트 항목 구조로, 왼쪽과 중앙 구조이며, 끝에는 스위치가 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTile의 기본 표현은 다음과 같습니다", + "desc": [ + "【secondary】: 왼쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【inactiveThumbColor】: 선택되지 않았을 때 원 색상 【Color】", + "【inactiveTrackColor】: 선택되지 않았을 때 트랙 색상 【Color】", + "【activeColor】: 선택되었을 때 원 색상 【Color】", + "【activeTrackColor】: 선택되었을 때 트랙 색상 【Color】", + "【onChanged】: 선택 이벤트 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTile의 선택 효과", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【inactiveThumbImage】: 선택되지 않았을 때 원 이미지 【ImageProvider】", + "【activeThumbImage】: 선택되었을 때 원 이미지 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json new file mode 100644 index 00000000..6e3af475 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Azulejo de Interruptor", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de esquerda para o meio, e um Switch no final. Componentes podem ser inseridos nas posições correspondentes, facilitando a adaptação a itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do SwitchListTile é a seguinte", + "desc": [ + "【secondary】: Componente esquerdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【inactiveThumbColor】: Cor do círculo quando não selecionado 【Color】", + "【inactiveTrackColor】: Cor do trilho quando não selecionado 【Color】", + "【activeColor】: Cor do círculo quando selecionado 【Color】", + "【activeTrackColor】: Cor do trilho quando selecionado 【Color】", + "【onChanged】: Evento de seleção 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção do SwitchListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【inactiveThumbImage】: Imagem do círculo quando não selecionado 【ImageProvider】", + "【activeThumbImage】: Imagem do círculo quando selecionado 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do SwitchListTile", + "desc": [ + "【dense】: Se é denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json new file mode 100644 index 00000000..e4e3d0ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Переключатель плитки", + "info": "Общая структура элемента списка, предоставляемая Flutter, имеет лево-центральную структуру, а в конце находится Switch. Компоненты могут быть вставлены в соответствующие позиции, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное поведение SwitchListTile", + "desc": [ + "【secondary】: Левый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【inactiveThumbColor】: Цвет кружка в невыбранном состоянии 【Color】", + "【inactiveTrackColor】: Цвет дорожки в невыбранном состоянии 【Color】", + "【activeColor】: Цвет кружка в выбранном состоянии 【Color】", + "【activeTrackColor】: Цвет дорожки в выбранном состоянии 【Color】", + "【onChanged】: Событие выбора 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора SwitchListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【inactiveThumbImage】: Изображение кружка в невыбранном состоянии 【ImageProvider】", + "【activeThumbImage】: Изображение кружка в выбранном состоянии 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения SwitchListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json new file mode 100644 index 00000000..1feece7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "切钮瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个Switch。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTile的基本表现如下", + "desc": [ + "【secondary】: 左侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【inactiveThumbColor】: 未选中时圆圈颜色 【Color】", + "【inactiveTrackColor】: 未选中滑槽颜色 【Color】", + "【activeColor】: 选中时圆圈颜色 【Color】", + "【activeTrackColor】: 选中滑槽颜色 【Color】", + "【onChanged】: 选中事件 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTile的选中效果", + "desc": [ + "【selected】: 是否选中 【bool】", + "【inactiveThumbImage】: 未选中时圆圈图片 【ImageProvider】", + "【activeThumbImage】: 选中时圆圈图片 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart new file mode 100644 index 00000000..51098829 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class CustomSwitchListTile extends StatefulWidget { + const CustomSwitchListTile({Key? key}) : super(key: key); + + @override + _CustomSwitchListTileState createState() => _CustomSwitchListTileState(); +} + +class _CustomSwitchListTileState extends State { + var _value=false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: SwitchListTile( + value: _value, + inactiveThumbColor:Colors.cyanAccent , + inactiveTrackColor: Colors.blue.withAlpha(88), + activeColor: Colors.orangeAccent, + activeTrackColor: Colors.orange, + secondary: Image.asset("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _value = !_value), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart new file mode 100644 index 00000000..bbdeaee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart @@ -0,0 +1,35 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class SelectSwitchListTile extends StatefulWidget { + const SelectSwitchListTile({Key? key}) : super(key: key); + + @override + _SelectSwitchListTileState createState() => _SelectSwitchListTileState(); +} + +class _SelectSwitchListTileState extends State { + bool _value=false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: SwitchListTile( + value: _value, + selected: _value, + activeColor: Colors.orangeAccent, + secondary: Image.asset("assets/images/icon_head.webp"), + inactiveThumbImage: const AssetImage("assets/images/head_icon/icon_5.webp"), + activeThumbImage: const AssetImage("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _value = !_value), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart new file mode 100644 index 00000000..06387d3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart @@ -0,0 +1,34 @@ + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + +class DenseSwitchListTile extends StatefulWidget { + const DenseSwitchListTile({Key? key}) : super(key: key); + + @override + _DenseSwitchListTileState createState() => _DenseSwitchListTileState(); +} + +class _DenseSwitchListTileState extends State { + bool _value = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: SwitchListTile( + value: _value, + dense: true, + selected: _value, + activeColor: Colors.orangeAccent, + secondary: Image.asset("assets/images/icon_head.webp"), + title: const Text("张风捷特烈"), + subtitle: const Text("@万花过尽知无物"), + onChanged: (v) => setState(() => _value = !_value), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json new file mode 100644 index 00000000..ee33c758 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Tab", + "info": "Wird normalerweise für Items in der TabBar verwendet, hat eine obere und untere Struktur und kann ein Symbol und eine Inhaltskomponente angeben.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Tab", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【text】 : Text 【String】", + "【icon】 : Untere Komponente 【Widgit】", + " text und child können nicht gleichzeitig existieren" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json new file mode 100644 index 00000000..f2574060 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Tab", + "info": "Generally used as an item in the TabBar, with a top-bottom structure, allowing the specification of an icon and a content component.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Tab", + "desc": [ + "【child】: Child component 【Widget】", + "【text】: Text 【String】", + "【icon】: Bottom component 【Widget】", + " text and child cannot exist simultaneously" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json new file mode 100644 index 00000000..926b3d31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Pestaña", + "info": "Generalmente se utiliza como un ítem en el TabBar, con una estructura de arriba hacia abajo, se puede especificar un ícono y un componente de contenido.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Tab", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【text】 : Texto 【String】", + "【icon】 : Componente inferior 【Widget】", + " text y child no pueden coexistir" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json new file mode 100644 index 00000000..0b4fde05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Onglet", + "info": "Généralement utilisé comme élément dans une TabBar, structure verticale, peut spécifier une icône et un composant de contenu.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Tab", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【text】 : Texte 【String】", + "【icon】 : Composant inférieur 【Widgit】", + " text et child ne peuvent pas coexister" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json new file mode 100644 index 00000000..964a9f73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Scheda", + "info": "Generalmente utilizzato per gli elementi in TabBar, struttura verticale, può specificare un'icona e un componente di contenuto.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Tab", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【text】 : Testo 【String】", + "【icon】 : Componente inferiore 【Widgit】", + " text e child non possono esistere contemporaneamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json new file mode 100644 index 00000000..0b432a21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "タブ", + "info": "一般的にTabBarのアイテムとして使用され、上下構造で、アイコンとコンテンツコンポーネントを指定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tabの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【text】 : テキスト 【String】", + "【icon】 : 下部コンポーネント 【Widgit】", + " textとchildは同時に存在できません" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json new file mode 100644 index 00000000..2a2307ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "탭", + "info": "일반적으로 TabBar의 항목으로 사용되며, 상하 구조로 아이콘과 내용 컴포넌트를 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "탭 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【text】 : 텍스트 【String】", + "【icon】 : 하단 컴포넌트 【Widget】", + " text와 child는 동시에 존재할 수 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json new file mode 100644 index 00000000..524a2d59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Separador", + "info": "Geralmente utilizado como item na TabBar, com uma estrutura de cima para baixo, pode especificar um ícone e um componente de conteúdo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Tab", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【text】 : Texto 【String】", + "【icon】 : Componente inferior 【Widgit】", + " text e child não podem coexistir" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json new file mode 100644 index 00000000..c5eedc1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Вкладка", + "info": "Обычно используется как элемент в TabBar, имеет верхнюю и нижнюю структуру, может содержать иконку и компонент содержимого.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Tab", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【text】 : Текст 【String】", + "【icon】 : Нижний компонент 【Widgit】", + " text и child не могут существовать одновременно" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json new file mode 100644 index 00000000..b3849f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "标签", + "info": "一般用于TabBar中的item,上下结构,可指定图标和一个内容组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tab基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【text】 : 文字 【String】", + "【icon】 : 下方组件 【Widgit】", + " text和child不能同时存在" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart new file mode 100644 index 00000000..932f2bc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com + + +class CustomTab extends StatelessWidget { + const CustomTab({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: const [ + Tab( + icon:Icon( Icons.add,color: Colors.blue,), + child: Text('添加'), + ), + Tab( + icon:Icon( Icons.close,color: Colors.red,), + text: '删除', + ), + Tab( + icon:Icon( Icons.refresh,color: Colors.green), + text: '更新', + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json new file mode 100644 index 00000000..b6b2c857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Tab-Leiste", + "info": "Eine schiebbare und klickbare Tab-Leiste, die normalerweise am unteren Rand der AppBar verwendet wird. Kann mit TabBarView kombiniert werden, um den Effekt des Seitenwechselns zu erzielen.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Indikatorfarbe 【Indikatorfarbe】", + "【indicatorWeight】 : Indikatorhöhe 【double】", + "【indicatorPadding】 : Indikatorrand 【EdgeInsetsGeometry】", + "【labelStyle】 : Textstil der Registerkarte 【TextStyle】", + "【unselectedLabelStyle】 : Textstil der nicht ausgewählten Registerkarte 【TextStyle】", + "【isScrollable】 : Ob scrollbar 【bool】", + "【onTap】 : Rückruf beim Klicken auf die Registerkarte 【Function(int)】", + "【tabs】 : Tab-Komponenten 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Durch das Setzen von Theme kann der Wasserwelleneffekt vermieden werden", + "desc": [ + "Setzen Sie die Farbe der Wasserwelle in Theme auf transparent." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json new file mode 100644 index 00000000..88bd3cce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Tab Bar", + "info": "A slidable and clickable tab bar, usually used at the bottom of the AppBar, can be used in conjunction with TabBarView to achieve a sliding page effect.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Indicator Color 【Indicator Color】", + "【indicatorWeight】 : Indicator Height 【double】", + "【indicatorPadding】 : Indicator Margin 【EdgeInsetsGeometry】", + "【labelStyle】 : Tab Text Style 【TextStyle】", + "【unselectedLabelStyle】 : Unselected Text Style 【TextStyle】", + "【isScrollable】 : Whether Scrollable 【bool】", + "【onTap】 : Tab Click Callback 【Function(int)】", + "【tabs】 : Tab Components 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Achieve No Ripple Effect by Setting Theme", + "desc": [ + "Set the ripple color in the Theme to transparent." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json new file mode 100644 index 00000000..1844c1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra de pestañas", + "info": "Barra de pestañas deslizante y clicable, generalmente utilizada en la parte inferior de AppBar, se puede usar junto con TabBarView para lograr un efecto de deslizamiento de página.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorColor】 : Color del indicador 【Color del indicador】", + "【indicatorWeight】 : Altura del indicador 【double】", + "【indicatorPadding】 : Márgenes del indicador 【EdgeInsetsGeometry】", + "【labelStyle】 : Estilo del texto de la pestaña 【TextStyle】", + "【unselectedLabelStyle】 : Estilo del texto no seleccionado 【TextStyle】", + "【isScrollable】 : Deslizable 【bool】", + "【onTap】 : Callback al hacer clic en la pestaña 【Function(int)】", + "【tabs】 : Componentes de la pestaña 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Se puede lograr sin efecto de onda configurando Theme", + "desc": [ + "Simplemente configure el color de la onda en Theme como transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json new file mode 100644 index 00000000..330c9071 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barre d'onglets", + "info": "Barre d'onglets glissable et cliquable, généralement utilisée en bas de l'AppBar, peut être utilisée avec TabBarView pour réaliser un effet de glissement de page.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabBar", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【indicatorColor】 : Couleur de l'indicateur 【Couleur de l'indicateur】", + "【indicatorWeight】 : Hauteur de l'indicateur 【double】", + "【indicatorPadding】 : Marge de l'indicateur 【EdgeInsetsGeometry】", + "【labelStyle】 : Style de texte de l'onglet 【TextStyle】", + "【unselectedLabelStyle】 : Style de texte non sélectionné 【TextStyle】", + "【isScrollable】 : Peut être glissé 【bool】", + "【onTap】 : Rappel de clic sur l'onglet 【Function(int)】", + "【tabs】 : Composant d'onglet 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Réaliser sans ondulation en définissant Theme", + "desc": [ + "Définissez simplement la couleur de l'ondulation dans Theme comme transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json new file mode 100644 index 00000000..4245686a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra delle schede", + "info": "Barra delle schede scorrevole e cliccabile, solitamente utilizzata nella parte inferiore dell'AppBar, può essere utilizzata insieme a TabBarView per ottenere l'effetto di scorrimento delle pagine.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Colore dell'indicatore 【Colore dell'indicatore】", + "【indicatorWeight】 : Altezza dell'indicatore 【double】", + "【indicatorPadding】 : Margine dell'indicatore 【EdgeInsetsGeometry】", + "【labelStyle】 : Stile del testo della scheda 【TextStyle】", + "【unselectedLabelStyle】 : Stile del testo non selezionato 【TextStyle】", + "【isScrollable】 : Scorrevole 【bool】", + "【onTap】 : Callback del clic sulla scheda 【Function(int)】", + "【tabs】 : Componenti delle schede 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Impostando il tema è possibile ottenere l'effetto senza ondulazione", + "desc": [ + "Basta impostare il colore dell'ondulazione nel tema su trasparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json new file mode 100644 index 00000000..47debc38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "タブバー", + "info": "スワイプやクリックが可能なタブバーで、通常はAppBarの下部に使用され、TabBarViewと連携してページをスワイプする効果を実現できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarの基本的な使用", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【indicatorColor】 : インジケーターの色 【インジケーターの色】", + "【indicatorWeight】 : インジケーターの高さ 【double】", + "【indicatorPadding】 : インジケーターの余白 【EdgeInsetsGeometry】", + "【labelStyle】 : タブのテキストスタイル 【TextStyle】", + "【unselectedLabelStyle】 : 未選択のテキストスタイル 【TextStyle】", + "【isScrollable】 : スワイプ可能かどうか 【bool】", + "【onTap】 : タブクリックのコールバック 【Function(int)】", + "【tabs】 : タブコンポーネント 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Themeを設定して水波紋を無効にする", + "desc": [ + "Themeの水波紋の色を透明に設定します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json new file mode 100644 index 00000000..40400db9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "탭 바", + "info": "탭 바를 스와이프하고 클릭할 수 있으며, 일반적으로 AppBar의 하단에 사용됩니다. TabBarView와 함께 사용하여 페이지 슬라이딩 효과를 구현할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBar 기본 사용", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【indicatorColor】 : 인디케이터 색상 【인디케이터 색상】", + "【indicatorWeight】 : 인디케이터 높이 【double】", + "【indicatorPadding】 : 인디케이터 여백 【EdgeInsetsGeometry】", + "【labelStyle】 : 탭 텍스트 스타일 【TextStyle】", + "【unselectedLabelStyle】 : 선택되지 않은 텍스트 스타일 【TextStyle】", + "【isScrollable】 : 스와이프 가능 여부 【bool】", + "【onTap】 : 탭 클릭 콜백 【Function(int)】", + "【tabs】 : 탭 위젯 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Theme 설정을 통해 물결 효과 없이 구현", + "desc": [ + "Theme에서 물결 효과 색상을 투명으로 설정하면 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json new file mode 100644 index 00000000..7105e793 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra de Etiquetas", + "info": "Barra de etiquetas deslizável e clicável, geralmente usada na parte inferior do AppBar, pode ser usada em conjunto com o TabBarView para alcançar o efeito de deslizar páginas.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorColor】 : Cor do Indicador 【Cor do Indicador】", + "【indicatorWeight】 : Altura do Indicador 【double】", + "【indicatorPadding】 : Margem do Indicador 【EdgeInsetsGeometry】", + "【labelStyle】 : Estilo do Texto da Etiqueta 【TextStyle】", + "【unselectedLabelStyle】 : Estilo do Texto Não Selecionado 【TextStyle】", + "【isScrollable】 : Se é Deslizável 【bool】", + "【onTap】 : Callback de Clique na Etiqueta 【Function(int)】", + "【tabs】 : Componentes das Etiquetas 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Configuração do Theme para Eliminar Ondulações", + "desc": [ + "Defina a cor das ondulações no Theme como transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json new file mode 100644 index 00000000..d0fad287 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Панель вкладок", + "info": "Скользящая и кликабельная панель вкладок, обычно используется в нижней части AppBar, может использоваться вместе с TabBarView для создания эффекта скользящих страниц.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabBar", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【indicatorColor】 : Цвет индикатора 【Цвет индикатора】", + "【indicatorWeight】 : Высота индикатора 【double】", + "【indicatorPadding】 : Отступы индикатора 【EdgeInsetsGeometry】", + "【labelStyle】 : Стиль текста вкладки 【TextStyle】", + "【unselectedLabelStyle】 : Стиль текста невыбранной вкладки 【TextStyle】", + "【isScrollable】 : Возможность прокрутки 【bool】", + "【onTap】 : Обратный вызов при нажатии на вкладку 【Function(int)】", + "【tabs】 : Компоненты вкладок 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Реализация без водяных волн через настройку Theme", + "desc": [ + "Просто установите цвет водяных волн в Theme на прозрачный." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json new file mode 100644 index 00000000..b49dbb29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "标签栏", + "info": "可滑动和点击标签栏,通常用于AppBar的底部,可与TabBarView联用,实现滑页的效果。", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBar基本使用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【indicatorColor】 : 指示器颜色 【指示器颜色】", + "【indicatorWeight】 : 指示器高 【double】", + "【indicatorPadding】 : 指示器边距 【EdgeInsetsGeometry】", + "【labelStyle】 : 页签文字样式 【TextStyle】", + "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】", + "【isScrollable】 : 是否可滑动 【bool】", + "【onTap】 : 页签点击回调 【Function(int)】", + "【tabs】 : 标签组件 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "通过设置Theme可实现无水波纹", + "desc": [ + "将Theme关于水波纹的颜色设置为透明即可。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart new file mode 100644 index 00000000..747d93ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com + +class CustomTabBar extends StatefulWidget { + const CustomTabBar({Key? key}) : super(key: key); + + @override + _CustomTabBarState createState() => _CustomTabBarState(); +} + +class _CustomTabBarState extends State + with SingleTickerProviderStateMixin { + final List tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(vsync: this, length: tabs.length); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return TabBar( + onTap: (tab) => print(tab), + labelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + unselectedLabelStyle: const TextStyle(fontSize: 16), + isScrollable: true, + controller: _tabController, + labelColor: Colors.blue, + indicatorWeight: 3, + indicatorPadding: const EdgeInsets.symmetric(horizontal: 10), + unselectedLabelColor: Colors.grey, + indicatorColor: Colors.orangeAccent, + tabs: tabs.map((e) => Tab(text: e)).toList(), + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart similarity index 87% rename from packages/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart rename to modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart index 69897529..46993393 100644 --- a/packages/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 58, -// "name": '通过设置Theme可实现无水波纹', -// "priority": 1, -// "subtitle": -// "将Theme关于水波纹的颜色设置为透明即可。", -// } class NoShadowTabBarDemo extends StatefulWidget { const NoShadowTabBarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json new file mode 100644 index 00000000..96f33fc0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Tab-Seitenwähler", + "info": "Wird normalerweise als Indikator in Verbindung mit TabBarView verwendet und teilt sich einen gemeinsamen TabController. Farbe, Größe und ausgewählte Farbe können angegeben werden.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Indikatorgröße 【double】", + "【selectedColor】: Ausgewählte Farbe 【Color】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json new file mode 100644 index 00000000..b56c2747 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Tab Sliding Selector", + "info": "Usually used as an indicator with TabBarView, sharing a common TabController. Can specify color, size, and selected color.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Indicator Size 【double】", + "【selectedColor】: Selected Color 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json new file mode 100644 index 00000000..734482d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Selector de pestañas deslizante", + "info": "Normalmente se utiliza como indicador junto con TabBarView, compartiendo un TabController. Se pueden especificar colores, tamaños y colores seleccionados.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabPageSelector", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorSize】: Tamaño del indicador 【double】", + "【selectedColor】: Color seleccionado 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json new file mode 100644 index 00000000..21bef59b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Sélecteur de page à onglets", + "info": "Utilisé généralement comme indicateur avec TabBarView, partageant un TabController commun. Peut spécifier la couleur, la taille, la couleur sélectionnée.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabPageSelector", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【indicatorSize】: Taille de l'indicateur 【double】", + "【selectedColor】: Couleur sélectionnée 【Color】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json new file mode 100644 index 00000000..ca2cb929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Selettore di scorrimento delle schede", + "info": "Utilizzato solitamente come indicatore insieme a TabBarView, condividendo un TabController. È possibile specificare colore, dimensione e colore selezionato.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Dimensione dell'indicatore 【double】", + "【selectedColor】: Colore selezionato 【Color】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json new file mode 100644 index 00000000..9457a660 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "タブページセレクター", + "info": "通常、インジケーターとしてTabBarViewと連携して使用され、同じTabControllerを共有します。色、サイズ、選択色を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorの基本的な使用", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【indicatorSize】: インジケーターサイズ 【double】", + "【selectedColor】: 選択色 【Color】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json new file mode 100644 index 00000000..0fe8b10b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "탭 페이지 선택기", + "info": "일반적으로 지시자로 사용되며 TabBarView와 함께 사용되며, 동일한 TabController를 공유합니다. 색상, 크기, 선택된 색상을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelector 기본 사용", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【indicatorSize】: 지시자 크기 【double】", + "【selectedColor】: 선택된 색상 【Color】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json new file mode 100644 index 00000000..bc5a77ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Seletor de Deslizamento de Abas", + "info": "Geralmente usado como um indicador em conjunto com o TabBarView, compartilhando um TabController. Pode especificar cor, tamanho e cor de seleção.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabPageSelector", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorSize】: Tamanho do Indicador 【double】", + "【selectedColor】: Cor de Seleção 【Color】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json new file mode 100644 index 00000000..41d15336 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Выбор вкладок с прокруткой", + "info": "Обычно используется как индикатор вместе с TabBarView, используя общий TabController. Можно указать цвет, размер, цвет выбранного элемента.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabPageSelector", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【indicatorSize】: Размер индикатора 【double】", + "【selectedColor】: Цвет выбранного элемента 【Color】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json new file mode 100644 index 00000000..65dd3fd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "页签滑动选择器", + "info": "通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelector基本使用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【indicatorSize】: 指示器大小 【double】", + "【selectedColor】: 选中色 【Color】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart new file mode 100644 index 00000000..e061bc8b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class TabPageSelectorDemo extends StatefulWidget { + const TabPageSelectorDemo({Key? key}) : super(key: key); + + @override + _TabPageSelectorDemoState createState() => _TabPageSelectorDemoState(); +} + +class _TabPageSelectorDemoState extends State + with SingleTickerProviderStateMixin { + final List tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(vsync: this, length: tabs.length); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Stack( + alignment: Alignment.center, + children: [ + Container(color: Colors.purple, child: _buildTableBarView()), + Positioned( + bottom: 10, + child: buildTabPageSelector(), + ), + ], + ), + ); + } + + Widget buildTabPageSelector() => TabPageSelector( + controller: _tabController, + color: Colors.white, + indicatorSize: 10, + selectedColor: Colors.orangeAccent, + ); + + Widget _buildTableBarView() => TabBarView( + controller: _tabController, + children: tabs + .map((e) => Center( + child: Text( + e, + style: const TextStyle(color: Colors.white, fontSize: 20), + ))) + .toList()); +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json new file mode 100644 index 00000000..4dcbc7e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Tab-Indikator", + "info": "Eine runde Komponente mit Randlinie, bei der Größe, Farbe und Randfarbe angegeben werden können. Es ist Teil des TabPageSelector und wird in der Regel nicht allein verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabPageSelectorIndicator", + "desc": [ + "【size】: Größe 【double】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【borderColor】: Randfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json new file mode 100644 index 00000000..5394fb21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Tab Indicator", + "info": "A circular component with a border, which can specify size, color, and border color. It is part of the TabPageSelector and is generally not used alone.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabPageSelectorIndicator", + "desc": [ + "【size】: size 【double】", + "【backgroundColor】: background color 【Color】", + "【borderColor】: border color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json new file mode 100644 index 00000000..66097176 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicador de selección de pestañas", + "info": "Un componente circular con bordes que puede especificar tamaño, color y color del borde. Es parte de TabPageSelector y generalmente no se usa por separado.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabPageSelectorIndicator", + "desc": [ + "【size】: Tamaño 【double】", + "【backgroundColor】: Color de fondo 【Color】", + "【borderColor】: Color del borde 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json new file mode 100644 index 00000000..cecf9563 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicateur d'onglet", + "info": "Un composant circulaire avec une bordure, pouvant spécifier la taille, la couleur et la couleur de la bordure. Fait partie du TabPageSelector, généralement non utilisé seul.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabPageSelectorIndicator", + "desc": [ + "【size】: Taille 【double】", + "【backgroundColor】: Couleur de fond 【Color】", + "【borderColor】: Couleur de la bordure 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json new file mode 100644 index 00000000..a5f7ce13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicatore del selettore di pagine", + "info": "Un componente circolare con bordi, che può essere specificato per dimensioni, colore e colore del bordo. Fa parte del TabPageSelector e generalmente non viene utilizzato da solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TabPageSelectorIndicator", + "desc": [ + "【size】: dimensione 【double】", + "【backgroundColor】: colore di sfondo 【Color】", + "【borderColor】: colore del bordo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json new file mode 100644 index 00000000..df8e573c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "タブインジケーター", + "info": "枠線付きの円形コンポーネントで、サイズ、色、枠線の色を指定できます。TabPageSelectorの一部であり、通常は単独で使用しません。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicatorの基本使用", + "desc": [ + "【size】: サイズ 【double】", + "【backgroundColor】: 背景色 【Color】", + "【borderColor】: 枠線の色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json new file mode 100644 index 00000000..482e0594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "탭 페이지 선택기 표시기", + "info": "테두리가 있는 원형 컴포넌트로, 크기, 색상, 테두리 색상을 지정할 수 있습니다. TabPageSelector의 일부이며 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicator 기본 사용법", + "desc": [ + "【size】: 크기 【double】", + "【backgroundColor】: 배경색 【Color】", + "【borderColor】: 테두리 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json new file mode 100644 index 00000000..f35b4ce9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicador de Seletor de Página", + "info": "Um componente circular com borda que pode especificar tamanho, cor e cor da borda. Faz parte do TabPageSelector e geralmente não é usado sozinho.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabPageSelectorIndicator", + "desc": [ + "【size】: Tamanho 【double】", + "【backgroundColor】: Cor de fundo 【Color】", + "【borderColor】: Cor da borda 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json new file mode 100644 index 00000000..c8ff63b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Индикатор вкладки", + "info": "Круглый компонент с границей, который можно настроить по размеру, цвету и цвету границы. Является частью TabPageSelector и обычно не используется отдельно.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabPageSelectorIndicator", + "desc": [ + "【size】: Размер 【double】", + "【backgroundColor】: Цвет фона 【Color】", + "【borderColor】: Цвет границы 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json new file mode 100644 index 00000000..e667b9a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "页签指示器", + "info": "一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicator基本使用", + "desc": [ + "【size】: 大小 【double】", + "【backgroundColor】: 背景色 【Color】", + "【borderColor】: 边线色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart new file mode 100644 index 00000000..089bb4ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + + + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + + +class TabPageSelectorIndicatorDemo extends StatelessWidget { + const TabPageSelectorIndicatorDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children:const [ + TabPageSelectorIndicator( + backgroundColor: Colors.greenAccent, + borderColor: Colors.deepPurpleAccent, + size: 15, + ), + TabPageSelectorIndicator( + backgroundColor: Colors.blue, + borderColor: Colors.grey, + size: 20, + ), + TabPageSelectorIndicator( + backgroundColor: Colors.green, + borderColor: Colors.red, + size: 25, + ), + TabPageSelectorIndicator( + backgroundColor: Colors.yellow, + borderColor: Colors.brown, + size: 30, + ), + TabPageSelectorIndicator( + backgroundColor: Colors.amber, + borderColor: Colors.purpleAccent, + size: 35, + ), + ], + ); + } + +} + diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json new file mode 100644 index 00000000..15ee33b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Textkomponente", + "info": "Eine Komponente zur Anzeige von Text. Verfügt über eine Vielzahl von Eigenschaften, die Ihren Anforderungen gerecht werden. Der Kernstil wird durch das style-Attribut gesteuert.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Textstile", + "desc": [ + "【Parameter】 : Text 【String】", + "【style】: Textstil 【TextStyle】", + "【color】: Textfarbe 【Color】", + "【fontSize】: Textgröße 【double】", + "【fontWeight】: Schriftstärke 【FontWeight】", + "【fontStyle】: Schriftstil 【fontStyle】", + "【letterSpacing】: Zeichenabstand 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Textschatten", + "desc": [ + "【shadows】 : Text 【List】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Textdekoration", + "desc": [ + "【fontFamily】 : Schriftart 【String】", + "【decoration】: Dekorationslinie 【TextDecoration】", + "【decorationColor】: Dekorationslinienfarbe 【Color】", + "【decorationThickness】: Dekorationsliniendicke 【double】", + "【decorationStyle】: Dekorationslinienstil 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Textausrichtung", + "desc": [ + "【textAlign】: Ausrichtung 【TextAlign】", + "Unten sind in der Reihenfolge: left, right, center, justify, start, end." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Textrichtung und maximale Zeilenanzahl", + "desc": [ + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【textDirection】 : Textrichtung 【TextDirection】", + "Unten sind in der Reihenfolge: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Zeilenumbruch und Überlaufverhalten", + "desc": [ + "【softWrap】 : Zeilenumbruch 【bool】", + "【overflow】 : Überlaufverhalten 【TextOverflow】", + "Unten softWrap=false; overflow in der Reihenfolge: clip, fade, ellipsis, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json new file mode 100644 index 00000000..cdfa6873 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Text Component", + "info": "A component used to display text. It has a wide range of properties to meet your usage needs, with core styles controlled by the style attribute.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Text Styles", + "desc": [ + "【Parameter】 : Text 【String】", + "【style】: Text Style 【TextStyle】", + "【color】: Text Color 【Color】", + "【fontSize】: Font Size 【double】", + "【fontWeight】: Font Weight 【FontWeight】", + "【fontStyle】: Font Style 【fontStyle】", + "【letterSpacing】: Letter Spacing 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Text Shadow", + "desc": [ + "【shadows】 : Text Shadows 【List】", + "【backgroundColor】: Background Color 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Text Decoration", + "desc": [ + "【fontFamily】 : Font Family 【String】", + "【decoration】: Decoration Line 【TextDecoration】", + "【decorationColor】: Decoration Line Color 【Color】", + "【decorationThickness】: Decoration Line Thickness 【double】", + "【decorationStyle】: Decoration Line Style 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Text Alignment", + "desc": [ + "【textAlign】: Alignment 【TextAlign】", + "The following are: left, right, center, justify, start, end." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Text Direction and Maximum Lines", + "desc": [ + "【maxLines】 : Maximum Lines 【int】", + "【textDirection】 : Text Direction 【TextDirection】", + "The following are: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Wrapping and Overflow Effects", + "desc": [ + "【softWrap】 : Whether to Wrap 【bool】", + "【overflow】 : Overflow Effect 【TextOverflow】", + "When softWrap=false; overflow options are: clip, fade, ellipsis, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json new file mode 100644 index 00000000..57bfe77b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente de texto", + "info": "Componente utilizado para mostrar texto. Tiene una gran cantidad de propiedades, suficientes para satisfacer tus necesidades de uso. El estilo principal está controlado por la propiedad style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Estilo básico del texto", + "desc": [ + "【Parámetro de entrada】 : Texto 【String】", + "【style】: Estilo del texto 【TextStyle】", + "【color】: Color del texto 【Color】", + "【fontSize】: Tamaño del texto 【double】", + "【fontWeight】: Peso de la fuente 【FontWeight】", + "【fontStyle】: Estilo de la fuente 【fontStyle】", + "【letterSpacing】: Espaciado entre letras 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Sombra del texto", + "desc": [ + "【shadows】 : Sombra del texto 【List】", + "【backgroundColor】: Color de fondo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Línea decorativa del texto", + "desc": [ + "【fontFamily】 : Fuente del texto 【String】", + "【decoration】: Línea decorativa 【TextDecoration】", + "【decorationColor】: Color de la línea decorativa 【Color】", + "【decorationThickness】: Grosor de la línea decorativa 【double】", + "【decorationStyle】: Estilo de la línea decorativa 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alineación del texto", + "desc": [ + "【textAlign】: Alineación del texto 【TextAlign】", + "A continuación se muestran en orden: izquierda, derecha, centro, justificado, inicio, final." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Dirección del texto y número máximo de líneas", + "desc": [ + "【maxLines】 : Número máximo de líneas 【int】", + "【textDirection】 : Dirección del texto 【TextDirection】", + "A continuación se muestran en orden: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Ajuste de línea y efecto de desbordamiento", + "desc": [ + "【softWrap】 : Ajuste de línea 【bool】", + "【overflow】 : Efecto de desbordamiento 【TextOverflow】", + "A continuación softWrap=false; overflow en orden: recortar, desvanecer, puntos suspensivos, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json new file mode 100644 index 00000000..650db5af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Composant de texte", + "info": "Un composant pour afficher du texte. Possède de nombreuses propriétés, suffisantes pour répondre à vos besoins d'utilisation. Les styles de base sont contrôlés par l'attribut style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Style de base du texte", + "desc": [ + "【Paramètre】 : Texte 【String】", + "【style】: Style du texte 【TextStyle】", + "【color】: Couleur du texte 【Color】", + "【fontSize】: Taille du texte 【double】", + "【fontWeight】: Poids de la police 【FontWeight】", + "【fontStyle】: Style de la police 【fontStyle】", + "【letterSpacing】: Espacement des lettres 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Ombre du texte", + "desc": [ + "【shadows】 : Texte 【List】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Ligne de décoration du texte", + "desc": [ + "【fontFamily】 : Police du texte 【String】", + "【decoration】: Ligne de décoration 【TextDecoration】", + "【decorationColor】: Couleur de la ligne de décoration 【Color】", + "【decorationThickness】: Épaisseur de la ligne de décoration 【double】", + "【decorationStyle】: Style de la ligne de décoration 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alignement du texte", + "desc": [ + "【textAlign】: Alignement 【TextAlign】", + "Les options suivantes sont : left, right, center, justify, start, end" + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direction du texte et nombre maximum de lignes", + "desc": [ + "【maxLines】 : Nombre maximum de lignes 【int】", + "【textDirection】 : Direction du texte 【TextDirection】", + "Les options suivantes sont : rtl, ltr" + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Retour à la ligne et effet de débordement", + "desc": [ + "【softWrap】 : Retour à la ligne 【bool】", + "【overflow】 : Effet de débordement 【TextOverflow】", + "Si softWrap=false; les options overflow sont : clip, fade, ellipsis, visible" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json new file mode 100644 index 00000000..18a546bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente di testo", + "info": "Componente per visualizzare il testo. Possiede molte proprietà, sufficienti per soddisfare le tue esigenze di utilizzo. Lo stile principale è controllato dalla proprietà style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Stile di base del testo", + "desc": [ + "【Parametro】 : Testo 【String】", + "【style】: Stile del testo 【TextStyle】", + "【color】: Colore del testo 【Color】", + "【fontSize】: Dimensione del testo 【double】", + "【fontWeight】: Peso del carattere 【FontWeight】", + "【fontStyle】: Stile del carattere 【fontStyle】", + "【letterSpacing】: Spaziatura tra i caratteri 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Ombreggiatura del testo", + "desc": [ + "【shadows】 : Ombre del testo 【List】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Linea decorativa del testo", + "desc": [ + "【fontFamily】 : Famiglia del carattere 【String】", + "【decoration】: Linea decorativa 【TextDecoration】", + "【decorationColor】: Colore della linea decorativa 【Color】", + "【decorationThickness】: Spessore della linea decorativa 【double】", + "【decorationStyle】: Stile della linea decorativa 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Allineamento del testo", + "desc": [ + "【textAlign】: Allineamento 【TextAlign】", + "Di seguito in ordine: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direzione del testo e numero massimo di righe", + "desc": [ + "【maxLines】 : Numero massimo di righe 【int】", + "【textDirection】 : Direzione del testo 【TextDirection】", + "Di seguito in ordine: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "A capo automatico ed effetto di overflow", + "desc": [ + "【softWrap】 : A capo automatico 【bool】", + "【overflow】 : Effetto di overflow 【TextOverflow】", + "Di seguito softWrap=false; overflow in ordine: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json new file mode 100644 index 00000000..80209a30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "テキストコンポーネント", + "info": "テキストを表示するためのコンポーネントです。多くの属性を持っており、あなたの使用ニーズを十分に満たすことができます。コアのスタイルはstyle属性によって制御されます。", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "テキストの基本スタイル", + "desc": [ + "【入参】 : テキスト 【String】", + "【style】: テキストスタイル 【TextStyle】", + "【color】: テキストカラー 【Color】", + "【fontSize】: テキストサイズ 【double】", + "【fontWeight】: フォントの太さ 【FontWeight】", + "【fontStyle】: フォントスタイル 【fontStyle】", + "【letterSpacing】: 文字間隔 【double】" + ] + }, + { + "file": "node2.dart", + "name": "テキストシャドウ", + "desc": [ + "【shadows】 : テキスト 【List】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "テキスト装飾線", + "desc": [ + "【fontFamily】 : テキストフォント 【String】", + "【decoration】: 装飾線 【TextDecoration】", + "【decorationColor】: 装飾線の色 【Color】", + "【decorationThickness】: 装飾線の太さ 【double】", + "【decorationStyle】: 装飾線のスタイル 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "テキストの配置", + "desc": [ + "【textAlign】: 配置 【TextAlign】", + "以下は順に:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "テキストの方向と最大行数", + "desc": [ + "【maxLines】 : 最大行数 【int】", + "【textDirection】 : テキストの方向 【TextDirection】", + "以下は順に:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "折り返しとオーバーフロー効果", + "desc": [ + "【softWrap】 : 折り返し 【bool】", + "【overflow】 : オーバーフロー効果 【TextOverflow】", + "以下softWrap=false; overflowは順に:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json new file mode 100644 index 00000000..875691c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "텍스트 컴포넌트", + "info": "텍스트를 표시하는 데 사용되는 컴포넌트. 매우 많은 속성을 가지고 있어 사용자의 요구를 충족시킬 수 있으며, 핵심 스타일은 style 속성에 의해 제어됩니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "텍스트의 기본 스타일", + "desc": [ + "【입력 매개변수】 : 텍스트 【String】", + "【style】: 텍스트 스타일 【TextStyle】", + "【color】: 텍스트 색상 【Color】", + "【fontSize】: 텍스트 크기 【double】", + "【fontWeight】: 글자 두께 【FontWeight】", + "【fontStyle】: 글자 스타일 【fontStyle】", + "【letterSpacing】: 글자 간격 【double】" + ] + }, + { + "file": "node2.dart", + "name": "텍스트 그림자", + "desc": [ + "【shadows】 : 텍스트 【List】", + "【backgroundColor】: 배경 색상 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "텍스트 장식선", + "desc": [ + "【fontFamily】 : 텍스트 글꼴 【String】", + "【decoration】: 장식선 【TextDecoration】", + "【decorationColor】: 장식선 색상 【Color】", + "【decorationThickness】: 장식선 두께 【double】", + "【decorationStyle】: 장식선 스타일 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "텍스트 정렬 방식", + "desc": [ + "【textAlign】: 정렬 방식 【TextAlign】", + "아래는 순서대로:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "텍스트 방향과 최대 줄 수", + "desc": [ + "【maxLines】 : 최대 줄 수 【int】", + "【textDirection】 : 텍스트 방향 【TextDirection】", + "아래는 순서대로:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "줄바꿈 여부와 넘침 효과", + "desc": [ + "【softWrap】 : 줄바꿈 여부 【bool】", + "【overflow】 : 넘침 효과 【TextOverflow】", + "아래 softWrap=false; overflow는 순서대로:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json new file mode 100644 index 00000000..4a9489c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente de Texto", + "info": "Componente utilizado para exibir texto. Possui uma grande quantidade de atributos, suficientes para atender às suas necessidades de uso. O estilo principal é controlado pelo atributo style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Estilo Básico do Texto", + "desc": [ + "【Parâmetro de Entrada】 : Texto 【String】", + "【style】: Estilo do Texto 【TextStyle】", + "【color】: Cor do Texto 【Color】", + "【fontSize】: Tamanho do Texto 【double】", + "【fontWeight】: Peso da Fonte 【FontWeight】", + "【fontStyle】: Estilo da Fonte 【fontStyle】", + "【letterSpacing】: Espaçamento entre Letras 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Sombra do Texto", + "desc": [ + "【shadows】 : Sombra do Texto 【List】", + "【backgroundColor】: Cor de Fundo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Linha de Decoração do Texto", + "desc": [ + "【fontFamily】 : Fonte do Texto 【String】", + "【decoration】: Linha de Decoração 【TextDecoration】", + "【decorationColor】: Cor da Linha de Decoração 【Color】", + "【decorationThickness】: Espessura da Linha de Decoração 【double】", + "【decorationStyle】: Estilo da Linha de Decoração 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alinhamento do Texto", + "desc": [ + "【textAlign】: Alinhamento 【TextAlign】", + "A seguir estão: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direção do Texto e Número Máximo de Linhas", + "desc": [ + "【maxLines】 : Número Máximo de Linhas 【int】", + "【textDirection】 : Direção do Texto 【TextDirection】", + "A seguir estão: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Quebra de Linha e Efeito de Transbordamento", + "desc": [ + "【softWrap】 : Quebra de Linha 【bool】", + "【overflow】 : Efeito de Transbordamento 【TextOverflow】", + "A seguir, softWrap=false; overflow são: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json new file mode 100644 index 00000000..49244210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Текстовый компонент", + "info": "Компонент для отображения текста. Имеет множество свойств, достаточных для удовлетворения ваших потребностей. Основные стили управляются свойством style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основные стили текста", + "desc": [ + "【Входные параметры】 : текст 【String】", + "【style】: стиль текста 【TextStyle】", + "【color】: цвет текста 【Color】", + "【fontSize】: размер текста 【double】", + "【fontWeight】: толщина шрифта 【FontWeight】", + "【fontStyle】: стиль шрифта 【fontStyle】", + "【letterSpacing】: межбуквенный интервал 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Тень текста", + "desc": [ + "【shadows】 : тень текста 【List】", + "【backgroundColor】: цвет фона 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Декоративные линии текста", + "desc": [ + "【fontFamily】 : шрифт текста 【String】", + "【decoration】: декоративная линия 【TextDecoration】", + "【decorationColor】: цвет декоративной линии 【Color】", + "【decorationThickness】: толщина декоративной линии 【double】", + "【decorationStyle】: стиль декоративной линии 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Выравнивание текста", + "desc": [ + "【textAlign】: выравнивание 【TextAlign】", + "Ниже приведены: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Направление текста и максимальное количество строк", + "desc": [ + "【maxLines】 : максимальное количество строк 【int】", + "【textDirection】 : направление текста 【TextDirection】", + "Ниже приведены: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Перенос строк и эффект переполнения", + "desc": [ + "【softWrap】 : перенос строк 【bool】", + "【overflow】 : эффект переполнения 【TextOverflow】", + "Ниже softWrap=false; overflow: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json new file mode 100644 index 00000000..cd97d60a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "文字组件", + "info": "用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "文字的基本样式", + "desc": [ + "【入参】 : 文字 【String】", + "【style】: 文字样式 【TextStyle】", + "【color】: 文字样式 【Color】", + "【fontSize】: 文字大小 【double】", + "【fontWeight】: 字重 【FontWeight】", + "【fontStyle】: 字体样式 【fontStyle】", + "【letterSpacing】: 字距 【double】" + ] + }, + { + "file": "node2.dart", + "name": "文字阴影", + "desc": [ + "【shadows】 : 文字 【List】", + "【backgroundColor】: 背景颜色 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "文字装饰线", + "desc": [ + "【fontFamily】 : 文字字体 【String】", + "【decoration】: 装饰线 【TextDecoration】", + "【decorationColor】: 装饰线颜色 【Color】", + "【decorationThickness】: 装饰线粗 【double】", + "【decorationStyle】: 装饰线样式 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "文字对齐方式", + "desc": [ + "【textAlign】: 对齐方式 【TextAlign】", + "下面依次是:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "文字方向与最大行数", + "desc": [ + "【maxLines】 : 最大行数 【int】", + "【textDirection】 : 文字方向 【TextDirection】", + "下面依次是:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "是否包裹与越界效果", + "desc": [ + "【softWrap】 : 是否换行 【bool】", + "【overflow】 : 越界效果 【TextOverflow】", + "下面softWrap=false; overflow依次是:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart new file mode 100644 index 00000000..b7a87196 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextDemo1 extends StatelessWidget { + const TextDemo1({super.key}); + + @override + Widget build(BuildContext context) { + const TextStyle style = TextStyle( + color: Colors.blue, + fontSize: 20, + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic, + letterSpacing: 10, + ); + return Container( + width: 200, + color: Colors.cyanAccent.withAlpha(33), + height: 76, + child: const Text("toly-张风捷特烈-1994`", style: style), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart new file mode 100644 index 00000000..9f3d949f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextDemo2 extends StatelessWidget { + const TextDemo2({super.key}); + + @override + Widget build(BuildContext context) { + const TextStyle style = TextStyle( + fontSize: 50, + color: Colors.white, + backgroundColor: Colors.black, + shadows: [ + Shadow(color: Colors.cyanAccent, offset: Offset(1, 1), blurRadius: 10), + Shadow(color: Colors.blue, offset: Offset(-0.1, 0.1), blurRadius: 10), + ]); + return const Text("张风捷特烈", style: style); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart new file mode 100644 index 00000000..7a3716e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class DecorationText extends StatelessWidget { + const DecorationText({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Text( + "19940328", + style: TextStyle( + fontSize: 50, + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + decorationThickness: 3, + decorationStyle: TextDecorationStyle.wavy, + decorationColor: Colors.blue, + fontStyle: FontStyle.italic, + fontFamily: "DancingScript", + letterSpacing: 10), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart new file mode 100644 index 00000000..de98a034 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextAlignText extends StatelessWidget { + const TextAlignText({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + runSpacing: 10, + children: TextAlign.values + .map((TextAlign textAlign) => Container( + width: 120, + color: Colors.cyanAccent.withAlpha(33), + height: 120 * 0.618, + child: Text( + " 张风捷特烈 toly " * 3, + textAlign: textAlign, + ), + )) + .toList(), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart new file mode 100644 index 00000000..89d286ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextDirectionText extends StatelessWidget { + const TextDirectionText({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 40, + runSpacing: 10, + children: TextDirection.values + .map((TextDirection direction) => Container( + width: 120, + color: Colors.cyanAccent.withAlpha(33), + height: 120 * 0.618, + child: Text( + " 张风捷特烈 toly " * 10, + textDirection: direction, + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + )) + .toList(), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart new file mode 100644 index 00000000..9c1aba9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class SoftWrapText extends StatelessWidget { + const SoftWrapText({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + runSpacing: 10, + children: TextOverflow.values + .map((TextOverflow textOverflow) => Container( + width: 150, + color: Colors.cyanAccent.withAlpha(33), + height: 150 * 0.618 * 0.618, + child: Text( + " 张风捷特烈 toly " * 5, + overflow: textOverflow, + softWrap: false, + ), + )) + .toList(), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json new file mode 100644 index 00000000..20ae58b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Thema", + "info": "Sie können das ThemeData-Objekt über Theme.of abrufen. Sie können auch ein Thema angeben, das auf die Nachkommenkomponenten von Theme angewendet wird.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Textstil-ThemeData#TextTheme", + "desc": [ + "Untergeordnete Komponenten können die Daten des Themas über ThemeData.of abrufen und verwenden." + ] + }, + { + "file": "node2_use.dart", + "name": "Verwendung von Theme", + "desc": [ + "Mit Theme können Sie sehr viele Attribute als Thema angeben, die auf alle Nachkommenkomponenten angewendet werden, wie z. B. Schriftarten, Schieberegler, Karten, Text, Trennlinien, Schaltflächen usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json new file mode 100644 index 00000000..f3fe2ebd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Theme", + "info": "You can obtain the ThemeData object through Theme.of. You can also specify a theme to be applied to the descendant components of Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Text Style-ThemeData#TextTheme", + "desc": [ + "Child components can use the theme data obtained through ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Usage of Theme", + "desc": [ + "Using Theme, you can specify a wide range of properties as themes, which will be applied to all descendant components, such as specifying properties for fonts, sliders, cards, text, dividers, buttons, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json new file mode 100644 index 00000000..98494e70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Puedes obtener el objeto ThemeData a través de Theme.of. También puedes especificar un tema para aplicarlo a los componentes descendientes de Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-ThemeData#TextTheme", + "desc": [ + "Los componentes secundarios pueden obtener y utilizar los datos del tema a través de ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de Theme", + "desc": [ + "Usando Theme, puedes especificar una gran cantidad de atributos como tema, que se aplicarán a todos los componentes descendientes, como la fuente, el control deslizante, la tarjeta, el texto, el divisor, el botón, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json new file mode 100644 index 00000000..251f1696 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Thème", + "info": "Vous pouvez obtenir l'objet ThemeData via Theme.of. Vous pouvez également spécifier un thème à appliquer aux composants descendants de Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Style de texte-ThemeData#TextTheme", + "desc": [ + "Les composants enfants peuvent obtenir les données du thème via ThemeData.of pour les utiliser." + ] + }, + { + "file": "node2_use.dart", + "name": "Utilisation de Theme", + "desc": [ + "En utilisant Theme, vous pouvez spécifier de nombreuses propriétés comme thème, ces propriétés seront appliquées à tous les composants descendants, comme la police, le curseur, la carte, le texte, la ligne de séparation, le bouton, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json new file mode 100644 index 00000000..6d2dc6e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Puoi ottenere l'oggetto ThemeData tramite Theme.of. Puoi anche specificare un tema da applicare ai componenti discendenti di Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stile del testo-ThemeData#TextTheme", + "desc": [ + "I componenti figli possono ottenere i dati del tema tramite ThemeData.of e utilizzarli." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso di Theme", + "desc": [ + "Utilizzando Theme, puoi specificare molte proprietà come tema, che verranno applicate a tutti i componenti discendenti, come font, slider, card, testo, linee divisorie, pulsanti, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json new file mode 100644 index 00000000..07b34e75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "テーマ", + "info": "Theme.ofを使用してThemeDataオブジェクトを取得できます。また、テーマをThemeの子孫コンポーネントに適用することもできます。", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テキストスタイル-ThemeData#TextTheme", + "desc": [ + "子コンポーネントはThemeData.ofを使用してテーマのデータを取得して使用できます。" + ] + }, + { + "file": "node2_use.dart", + "name": "Themeの使い方", + "desc": [ + "Themeを使用すると、フォント、スライダー、カード、テキスト、分割線、ボタンなどの属性をテーマとして指定でき、これらの属性はすべての子孫コンポーネントに適用されます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json new file mode 100644 index 00000000..37621065 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "테마", + "info": "Theme.of를 통해 ThemeData 객체를 얻을 수 있습니다. 또한 테마를 지정하여 Theme의 하위 구성 요소에 적용할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "텍스트 스타일-ThemeData#TextTheme", + "desc": [ + "하위 구성 요소는 ThemeData.of를 통해 테마 데이터를 얻어 사용할 수 있습니다." + ] + }, + { + "file": "node2_use.dart", + "name": "Theme 사용법", + "desc": [ + "Theme를 사용하면 매우 많은 속성을 테마로 지정할 수 있으며, 이러한 속성은 모든 하위 구성 요소에 적용됩니다. 예를 들어 글꼴, 슬라이더, 카드, 텍스트, 구분선, 버튼 등의 속성을 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json new file mode 100644 index 00000000..60fcfb4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Pode obter o objeto ThemeData através de Theme.of. Também pode especificar um tema para ser aplicado aos componentes descendentes do Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-ThemeData#TextTheme", + "desc": [ + "Os componentes filhos podem obter e usar os dados do tema através de ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso do Theme", + "desc": [ + "Ao usar Theme, pode especificar uma grande variedade de propriedades como tema, que serão aplicadas a todos os componentes descendentes, como fonte, slider, cartão, texto, divisor, botão, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json new file mode 100644 index 00000000..188d286f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Тема", + "info": "Можно получить объект ThemeData через Theme.of. Также можно указать тему для применения к дочерним компонентам Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Текстовые стили - ThemeData#TextTheme", + "desc": [ + "Дочерние компоненты могут использовать данные темы, полученные через ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Использование Theme", + "desc": [ + "Используя Theme, можно указать множество свойств в качестве темы, которые будут применены ко всем дочерним компонентам, таким как шрифты, ползунки, карточки, текст, разделители, кнопки и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json new file mode 100644 index 00000000..18c0dedb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "主题", + "info": "可通过Theme.of获取ThemeData对象。也可以指定主题应用于Theme的后代组件。", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "文字样式-ThemeData#TextTheme", + "desc": [ + "子组件可以通过ThemeData.of获取主题的数据进行使用。" + ] + }, + { + "file": "node2_use.dart", + "name": "Theme的用法", + "desc": [ + "使用Theme,可以指定非常多的属性作为主题,这些属性将应用于所有的后代组件,如指定字体、滑块、卡片、文字、分割线、按钮等属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart new file mode 100644 index 00000000..69e4d691 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextThemeDemo extends StatelessWidget { + const TextThemeDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + TextTheme queryData = Theme.of(context).textTheme; + Map styles = { + "headlineSmall: ": queryData.headlineSmall!, + "headlineMedium: ": queryData.headlineMedium!, + "headlineLarge: ": queryData.headlineLarge!, + "bodySmall: ": queryData.bodySmall!, + "bodyMedium: ": queryData.bodyMedium!, + "bodyLarge: ": queryData.bodyLarge!, + "titleSmall: ": queryData.titleSmall!, + "titleMedium: ": queryData.titleMedium!, + "titleLarge: ": queryData.titleLarge!, + "labelMedium: ": queryData.labelMedium!, + "labelSmall: ": queryData.labelSmall!, + "labelLarge: ": queryData.labelLarge!, + }; + + return Column( + children: styles.keys + .map((String styleInfo) => buildItem(styleInfo, styles[styleInfo]!)) + .toList(), + ); + } + + TextStyle get textStyle => const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ); + + Widget buildItem(String styleInfo, TextStyle style) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(styleInfo, style: textStyle), + Text("@toly", style: style) + ], + ), + ), + const Divider(height: 1) + ], + ); +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart new file mode 100644 index 00000000..d2599ca4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class CustomTheme extends StatelessWidget { + const CustomTheme({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Theme( + data: ThemeData( + cardTheme: const CardThemeData( + color: Colors.red, + elevation: 4, + ), + dividerTheme: const DividerThemeData( + color: Colors.blue, + thickness: 2, + ), + sliderTheme: const SliderThemeData( + thumbColor: Colors.red, + activeTrackColor: Colors.green, + inactiveTrackColor: Colors.grey, + )), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Card( + child: Container( + width: 50, + height: 50, + color: Colors.transparent, + ), + ), + const SizedBox( + width: 150, + child: Slider(value: 0.8, onChanged: null), + ), + const SizedBox(width: 150, child: Divider()) + ])); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json new file mode 100644 index 00000000..6f58c0b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Anwendungsname", + "info": "Diese Komponente wird verwendet, um den Namen der App im Betriebssystem zu beschreiben. Die Auswirkungen können in der Anwendungsleiste gesehen werden. Die Quelle des Effekts des title-Felds in MaterialApp ist diese Komponente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Title", + "desc": [ + "【title】 : Name 【int】", + "【color】: Farbe 【Color】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json new file mode 100644 index 00000000..4ffca745 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Application Title", + "info": "This component is used to describe the name of the app in the operating system, and the effect can be seen in the app bar list. The root of the title field effect in MaterialApp is this component.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Title", + "desc": [ + "【title】: Name 【int】", + "【color】: Color 【Color】", + "【child】: Child Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json new file mode 100644 index 00000000..4804913b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Título de la aplicación", + "info": "Este componente se utiliza para describir el nombre de la aplicación en el sistema operativo, y se puede ver el efecto en la lista de la barra de aplicaciones. El origen del efecto del campo title en MaterialApp es este componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Title", + "desc": [ + "【title】 : Nombre 【int】", + "【color】: Color 【Color】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json new file mode 100644 index 00000000..1507f62a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Titre de l'application", + "info": "Ce composant est utilisé pour décrire le nom de l'application dans le système d'exploitation, et son effet peut être vu dans la liste de la barre d'applications. La source de l'effet du champ title dans MaterialApp est ce composant.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Title", + "desc": [ + "【title】 : Nom 【int】", + "【color】: Couleur 【Color】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json new file mode 100644 index 00000000..a7c3efba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Titolo dell'applicazione", + "info": "Questo componente è utilizzato per descrivere il nome dell'app nel sistema operativo, e l'effetto può essere visto nella lista della barra delle applicazioni. L'origine dell'effetto del campo title in MaterialApp è questo componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Title", + "desc": [ + "【title】 : Nome 【int】", + "【color】: Colore 【Color】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json new file mode 100644 index 00000000..742a027d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "アプリタイトル", + "info": "このコンポーネントは、アプリのオペレーティングシステムでの名前を記述するために使用され、アプリケーションバーのリストで効果を確認できます。MaterialAppのtitleフィールドの効果の根源はこのコンポーネントです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title基本使用", + "desc": [ + "【title】 : 名称 【int】", + "【color】: 色 【Color】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json new file mode 100644 index 00000000..ce0edf1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "앱 제목", + "info": "이 컴포넌트는 앱이 운영 체제에서의 이름을 설명하는 데 사용되며, 앱 바 목록에서 효과를 볼 수 있습니다. MaterialApp의 title 필드 효과의 근원은 이 컴포넌트입니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title 기본 사용", + "desc": [ + "【title】 : 이름 【int】", + "【color】: 색상 【Color】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json new file mode 100644 index 00000000..de353c50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Título da Aplicação", + "info": "Este componente é usado para descrever o nome da aplicação no sistema operativo, e o efeito pode ser visto na lista da barra de aplicações. A origem do efeito do campo 'title' no MaterialApp é este componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Title", + "desc": [ + "【title】 : Nome 【int】", + "【color】: Cor 【Color】", + "【child】: Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json new file mode 100644 index 00000000..56b3fb15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Заголовок приложения", + "info": "Этот компонент используется для описания имени приложения в операционной системе, эффект можно увидеть в списке приложений. Источником эффекта поля title в MaterialApp является этот компонент.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Title", + "desc": [ + "【title】 : Название 【int】", + "【color】: Цвет 【Color】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json new file mode 100644 index 00000000..0df024db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "应用标题", + "info": "该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title基本使用", + "desc": [ + "【title】 : 名称 【int】", + "【color】: 颜色 【Color】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart new file mode 100644 index 00000000..19bb988c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com + +class TitleDemo extends StatelessWidget { + const TitleDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Title( + title: '张风捷特烈', + color: const Color(0xFF9C27B0), + child: const Center( + child: Text('应用菜单栏中该页的名称为: 张风捷特烈'), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json new file mode 100644 index 00000000..0e621b8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Schaltflächengruppe umschalten", + "info": "Empfängt eine Liste von Komponenten und kann Eigenschaften wie Randlinie, abgerundete Ecken, Farbe usw. angeben. Basierend auf der spezifischen Logik kann es die Anforderungen für die Einzel- oder Mehrfachauswahl mehrerer Schaltflächen erfüllen.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons Einzelauswahl umschalten", + "desc": [ + "【children】: Untergeordnete Komponentensammlung 【List】", + "【borderWidth】: Randlinienbreite 【double】", + "【borderRadius】: Abgerundete Ecken 【BorderRadius】", + "【isSelected】: Auswahlstatus 【List】", + "【onPressed】: Klickereignis 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons Farbeigenschaften", + "desc": [ + "【borderColor】: Randlinienfarbe 【Color】", + "【selectedBorderColor】: Ausgewählte Randlinienfarbe 【Color】", + "【selectedColor】: Farbe der ausgewählten Komponente 【Color】", + "【fillColor】: Füllfarbe bei Auswahl 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons Mehrfachauswahl umschalten", + "desc": [ + "Kann die Logik der Zustandsänderung steuern, um unterschiedliche Effekte zu erzielen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json new file mode 100644 index 00000000..75e2c4cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Toggle Buttons Group", + "info": "Receives a list of components, and can specify properties such as border, rounded corners, color, etc. According to specific logic, it can achieve the requirements of single or multiple selection of buttons.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons Single Selection", + "desc": [ + "【children】: Children components 【List】", + "【borderWidth】: Border width 【double】", + "【borderRadius】: Rounded corners 【BorderRadius】", + "【isSelected】: Selection status set 【List】", + "【onPressed】: Click event 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons Color Properties", + "desc": [ + "【borderColor】: Border color 【Color】", + "【selectedBorderColor】: Selected border color 【Color】", + "【selectedColor】: Component color when selected 【Color】", + "【fillColor】: Fill color when selected 【Color】", + "【splashColor】: Ripple color 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons Multiple Selection", + "desc": [ + "The logic of state transformation can be controlled to create different effects." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json new file mode 100644 index 00000000..17d5fb3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Grupo de botones de conmutación", + "info": "Recibe una lista de componentes y permite especificar propiedades como el borde, el radio de las esquinas, el color, etc. Según la lógica específica, se puede implementar la necesidad de selección única o múltiple de varios botones.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Conmutación única de ToggleButtons", + "desc": [ + "【children】: Conjunto de componentes hijos 【List】", + "【borderWidth】: Ancho del borde 【double】", + "【borderRadius】: Radio de las esquinas 【BorderRadius】", + "【isSelected】: Conjunto de selección 【List】", + "【onPressed】: Evento de clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Propiedades de color de ToggleButtons", + "desc": [ + "【borderColor】: Color del borde 【Color】", + "【selectedBorderColor】: Color del borde seleccionado 【Color】", + "【selectedColor】: Color del componente cuando está seleccionado 【Color】", + "【fillColor】: Color de relleno cuando está seleccionado 【Color】", + "【splashColor】: Color de la onda 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Conmutación múltiple de ToggleButtons", + "desc": [ + "Puede controlar la lógica de transformación de estado para crear diferentes efectos." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json new file mode 100644 index 00000000..1c28ef4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Groupe de boutons de bascule", + "info": "Reçoit une liste de composants, peut spécifier des propriétés telles que la bordure, le rayon, la couleur, etc. Selon la logique spécifique, il peut répondre à la demande de sélection unique ou multiple de plusieurs boutons.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Basculement unique de ToggleButtons", + "desc": [ + "【children】: Ensemble de composants enfants 【List】", + "【borderWidth】: Largeur de la bordure 【double】", + "【borderRadius】: Rayon 【BorderRadius】", + "【isSelected】: Ensemble de sélection 【List】", + "【onPressed】: Événement de clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Propriétés de couleur de ToggleButtons", + "desc": [ + "【borderColor】: Couleur de la bordure 【Color】", + "【selectedBorderColor】: Couleur de la bordure sélectionnée 【Color】", + "【selectedColor】: Couleur du composant sélectionné 【Color】", + "【fillColor】: Couleur de remplissage sélectionnée 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Basculement multiple de ToggleButtons", + "desc": [ + "Peut contrôler la logique de transformation d'état pour créer différents effets." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json new file mode 100644 index 00000000..8bed8122 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Gruppo di pulsanti di commutazione", + "info": "Riceve un elenco di componenti e può specificare proprietà come bordi, angoli arrotondati, colori, ecc. In base alla logica specifica, è possibile implementare la selezione singola o multipla di più pulsanti.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons selezione singola", + "desc": [ + "【children】: Insieme di componenti figli 【List】", + "【borderWidth】: Larghezza del bordo 【double】", + "【borderRadius】: Angoli arrotondati 【BorderRadius】", + "【isSelected】: Insieme di selezione 【List】", + "【onPressed】: Evento di clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Proprietà del colore di ToggleButtons", + "desc": [ + "【borderColor】: Colore del bordo 【Color】", + "【selectedBorderColor】: Colore del bordo selezionato 【Color】", + "【selectedColor】: Colore del componente selezionato 【Color】", + "【fillColor】: Colore di riempimento selezionato 【Color】", + "【splashColor】: Colore dell'effetto ondulazione 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons selezione multipla", + "desc": [ + "È possibile controllare la logica di trasformazione dello stato per creare effetti diversi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json new file mode 100644 index 00000000..084ac4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "トグルボタングループ", + "info": "コンポーネントリストを受け取り、境界線、角丸、色などの属性を指定できます。特定のロジックに基づいて、複数のボタンの単一選択または複数選択の要件を実現できます。", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons単一選択トグル", + "desc": [ + "【children】: 子コンポーネントセット 【List】", + "【borderWidth】: 境界線の幅 【double】", + "【borderRadius】: 角丸 【BorderRadius】", + "【isSelected】: 選択状態セット 【List】", + "【onPressed】: クリックイベント 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtonsカラープロパティ", + "desc": [ + "【borderColor】: 境界線の色 【Color】", + "【selectedBorderColor】: 選択時の境界線の色 【Color】", + "【selectedColor】: 選択時のコンポーネントの色 【Color】", + "【fillColor】: 選択時の塗りつぶし色 【Color】", + "【splashColor】: 波紋の色 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons複数選択トグル", + "desc": [ + "状態変換のロジックを制御して、異なる効果を生み出すことができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json new file mode 100644 index 00000000..c424bb2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "토글 버튼 그룹", + "info": "컴포넌트 리스트를 받아 테두리, 모서리 둥글기, 색상 등 속성을 지정할 수 있습니다. 특정 로직에 따라 여러 버튼의 단일 선택 또는 다중 선택 요구를 구현할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons 단일 선택 토글", + "desc": [ + "【children】: 자식 컴포넌트 집합 【List】", + "【borderWidth】: 테두리 두께 【double】", + "【borderRadius】: 모서리 둥글기 【BorderRadius】", + "【isSelected】: 선택 여부 집합 【List】", + "【onPressed】: 클릭 이벤트 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons 색상 속성", + "desc": [ + "【borderColor】: 테두리 색상 【Color】", + "【selectedBorderColor】: 선택된 테두리 색상 【Color】", + "【selectedColor】: 선택된 컴포넌트 색상 【Color】", + "【fillColor】: 선택된 채우기 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons 다중 선택 토글", + "desc": [ + "상태 변환 로직을 제어하여 다양한 효과를 만들 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json new file mode 100644 index 00000000..507252ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Grupo de Botões de Alternância", + "info": "Recebe uma lista de componentes, pode especificar atributos como borda, raio, cor, etc. De acordo com a lógica específica, pode atender à necessidade de seleção única ou múltipla de vários botões.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Alternância Única de ToggleButtons", + "desc": [ + "【children】: Conjunto de componentes filhos 【List】", + "【borderWidth】: Largura da borda 【double】", + "【borderRadius】: Raio da borda 【BorderRadius】", + "【isSelected】: Conjunto de seleção 【List】", + "【onPressed】: Evento de clique 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Atributos de Cor de ToggleButtons", + "desc": [ + "【borderColor】: Cor da borda 【Color】", + "【selectedBorderColor】: Cor da borda selecionada 【Color】", + "【selectedColor】: Cor do componente quando selecionado 【Color】", + "【fillColor】: Cor de preenchimento quando selecionado 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Alternância Múltipla de ToggleButtons", + "desc": [ + "Pode controlar a lógica de transformação de estado para criar diferentes efeitos." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json new file mode 100644 index 00000000..3534d10a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Группа переключателей", + "info": "Принимает список компонентов, можно указать свойства границы, радиуса, цвета и т.д. В зависимости от конкретной логики, можно реализовать требования для одного или нескольких кнопок.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Одиночный переключатель ToggleButtons", + "desc": [ + "【children】: Набор дочерних компонентов 【List】", + "【borderWidth】: Ширина границы 【double】", + "【borderRadius】: Радиус угла 【BorderRadius】", + "【isSelected】: Набор выбранных 【List】", + "【onPressed】: Событие нажатия 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Цветовые свойства ToggleButtons", + "desc": [ + "【borderColor】: Цвет границы 【Color】", + "【selectedBorderColor】: Цвет выбранной границы 【Color】", + "【selectedColor】: Цвет компонента при выборе 【Color】", + "【fillColor】: Цвет заполнения при выборе 【Color】", + "【splashColor】: Цвет водяного знака 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Множественный переключатель ToggleButtons", + "desc": [ + "Можно управлять логикой преобразования состояния для создания различных эффектов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json new file mode 100644 index 00000000..57099796 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "切换按钮组", + "info": "接收组件列表,可指定边线、圆角、颜色等属性。根据具体逻辑,可以实现多个按钮单选或多选的需求。", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons单选切换", + "desc": [ + "【children】: 子组件集 【List】", + "【borderWidth】: 边线宽 【double】", + "【borderRadius】: 圆角 【BorderRadius】", + "【isSelected】: 是否选中集 【List】", + "【onPressed】: 点击事件 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons颜色属性", + "desc": [ + "【borderColor】: 边线色 【Color】", + "【selectedBorderColor】: 选中边线色 【Color】", + "【selectedColor】: 选中时组件色 【Color】", + "【fillColor】: 选中时填充色 【Color】", + "【splashColor】: 水波纹色 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons多选切换", + "desc": [ + "可以控制状态转化的逻辑来形成不同的效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart new file mode 100644 index 00000000..7ec287cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class CustomToggleButtons extends StatefulWidget { + const CustomToggleButtons({Key? key}) : super(key: key); + + @override + _CustomToggleButtonsState createState() => _CustomToggleButtonsState(); +} + +class _CustomToggleButtonsState extends State { + List _isSelected = [true, false, false]; + + @override + Widget build(BuildContext context) { + return ToggleButtons( + children: const [ + Icon(Icons.skip_previous), + Icon(Icons.pause), + Icon(Icons.skip_next), + ], + borderWidth: 1, + borderRadius: BorderRadius.circular(10), + isSelected: _isSelected, + onPressed: (value) => setState(() { + _isSelected = _isSelected.map((e) => false).toList(); + _isSelected[value] = true; + }), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart new file mode 100644 index 00000000..db779159 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart @@ -0,0 +1,40 @@ + + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class ColorToggleButtons extends StatefulWidget { + const ColorToggleButtons({Key? key}) : super(key: key); + + @override + _ColorToggleButtonsState createState() => _ColorToggleButtonsState(); +} + +class _ColorToggleButtonsState extends State { + List _isSelected = [true, false, false]; + + @override + Widget build(BuildContext context) { + return ToggleButtons( + children: const [ + Icon(Icons.skip_previous), + Icon(Icons.pause), + Icon(Icons.skip_next), + ], + borderWidth: 1, + borderColor: Colors.orangeAccent, + selectedBorderColor: Colors.blue, + splashColor: Colors.purple.withAlpha(66), + borderRadius: BorderRadius.circular(10), + selectedColor: Colors.red, + fillColor: Colors.green.withAlpha(11), + isSelected: _isSelected, + onPressed: (value) => setState(() { + _isSelected = _isSelected.map((e) => false).toList(); + _isSelected[value] = true; + }), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart similarity index 83% rename from packages/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart index 8c52e113..edb205b5 100644 --- a/packages/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 33, -// "priority": 3, -// "name": "ToggleButtons多选切换", -// "subtitle": " 可以控制状态转化的逻辑来形成不同的效果。", -// } class ProToggleButtons extends StatefulWidget { const ProToggleButtons({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json new file mode 100644 index 00000000..42b7931b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Anzeigekopf", + "info": "Eine allgemeine Anzeigestruktur, die von Flutter bereitgestellt wird. Komponenten können an entsprechenden Positionen eingefügt werden, um spezifische Einträge einfach zu handhaben. Wird häufig in Drawern verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung dieser Komponente ist wie folgt", + "desc": [ + "【currentAccountPicture】: Obere Komponente 【Widget】", + "【accountName】: Mittlere Komponente 【Widget】", + "【accountEmail】: Untere Komponente 【Widget】", + "【decoration】: Dekoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Obere rechte Ecke und Unterseite", + "desc": [ + "【otherAccountsPictures】: Obere rechte Komponente 【List】", + "【onDetailsPressed】: Klickereignis in der unteren rechten Ecke 【Function()】", + "【arrowColor】: Farbe der Schaltfläche in der unteren rechten Ecke 【Color】", + "【margin】: Außenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json new file mode 100644 index 00000000..93b0d2be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Display Header", + "info": "A common display structure provided by Flutter, where components can be inserted in corresponding positions, making it easy to handle specific items, commonly used in Drawers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic performance of this component is as follows", + "desc": [ + "【currentAccountPicture】: Top component 【Widget】", + "【accountName】: Middle component 【Widget】", + "【accountEmail】: Bottom component 【Widget】", + "【decoration】: Decoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Top right corner and bottom", + "desc": [ + "【otherAccountsPictures】: Top right component 【List】", + "【onDetailsPressed】: Bottom right click event 【Function()】", + "【arrowColor】: Bottom right button color 【Color】", + "【margin】: Margin 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json new file mode 100644 index 00000000..5a180edc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Encabezado de exhibición", + "info": "Una estructura de exhibición genérica proporcionada por Flutter, donde se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar fácilmente elementos específicos, comúnmente utilizado en Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La presentación básica de este componente es la siguiente", + "desc": [ + "【currentAccountPicture】: componente superior 【Widget】", + "【accountName】: componente central 【Widget】", + "【accountEmail】: componente inferior 【Widget】", + "【decoration】: decoración 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Esquina superior derecha y parte inferior", + "desc": [ + "【otherAccountsPictures】: componente superior derecho 【List】", + "【onDetailsPressed】: evento de clic en la esquina inferior derecha 【Function()】", + "【arrowColor】: color del botón en la esquina inferior derecha 【Color】", + "【margin】: margen exterior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json new file mode 100644 index 00000000..3382b735 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "En-tête d'affichage", + "info": "Une structure d'affichage générique fournie par Flutter, où des composants peuvent être insérés à des positions spécifiques, permettant de répondre facilement à des éléments spécifiques, souvent utilisé dans les Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La présentation de base de ce composant est la suivante", + "desc": [ + "【currentAccountPicture】: Composant supérieur 【Widget】", + "【accountName】: Composant central 【Widget】", + "【accountEmail】: Composant inférieur 【Widget】", + "【decoration】: Décoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Coin supérieur droit et bas", + "desc": [ + "【otherAccountsPictures】: Composant supérieur droit 【List】", + "【onDetailsPressed】: Événement de clic en bas à droite 【Function()】", + "【arrowColor】: Couleur du bouton en bas à droite 【Color】", + "【margin】: Marge extérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json new file mode 100644 index 00000000..4f0b3b4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Intestazione del cassetto degli account utente", + "info": "Una struttura di visualizzazione generica fornita da Flutter, in cui è possibile inserire componenti nelle posizioni corrispondenti, utile per gestire voci specifiche, comunemente utilizzata nei cassetti.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di questo componente è la seguente", + "desc": [ + "【currentAccountPicture】: componente superiore 【Widget】", + "【accountName】: componente centrale 【Widget】", + "【accountEmail】: componente inferiore 【Widget】", + "【decoration】: decorazione 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Angolo superiore destro e parte inferiore", + "desc": [ + "【otherAccountsPictures】: componente superiore destro 【List】", + "【onDetailsPressed】: evento di clic nell'angolo inferiore destro 【Function()】", + "【arrowColor】: colore del pulsante nell'angolo inferiore destro 【Color】", + "【margin】: margine esterno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json new file mode 100644 index 00000000..fc71dfa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "ヘッダーを表示", + "info": "Flutterが提供する汎用的な表示構造で、対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。Drawerでよく使用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "このコンポーネントの基本的な表現は以下の通りです", + "desc": [ + "【currentAccountPicture】: 上部コンポーネント 【Widget】", + "【accountName】: 中部コンポーネント 【Widget】", + "【accountEmail】: 下部コンポーネント 【Widget】", + "【decoration】: 装飾 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "右上と下部", + "desc": [ + "【otherAccountsPictures】: 右上コンポーネント 【List】", + "【onDetailsPressed】: 右下クリックイベント 【Function()】", + "【arrowColor】: 右下ボタンの色 【Color】", + "【margin】: マージン 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json new file mode 100644 index 00000000..50fa9754 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "디스플레이 헤더", + "info": "Flutter에서 제공하는 일반적인 디스플레이 구조로, 해당 위치에 컴포넌트를 삽입할 수 있으며 특정 항목에 쉽게 대응할 수 있습니다. 주로 Drawer에서 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "이 컴포넌트의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【currentAccountPicture】: 상단 컴포넌트 【Widget】", + "【accountName】: 중간 컴포넌트 【Widget】", + "【accountEmail】: 하단 컴포넌트 【Widget】", + "【decoration】: 장식 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "오른쪽 상단과 하단", + "desc": [ + "【otherAccountsPictures】: 오른쪽 상단 컴포넌트 【List】", + "【onDetailsPressed】: 오른쪽 하단 클릭 이벤트 【Function()】", + "【arrowColor】: 오른쪽 하단 버튼 색상 【Color】", + "【margin】: 외부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json new file mode 100644 index 00000000..261f41ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Cabeçalho de Exibição", + "info": "Uma estrutura de exibição genérica fornecida pelo Flutter, onde componentes podem ser inseridos nas posições correspondentes, facilitando a adaptação a itens específicos, comumente usado em Drawers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A representação básica deste componente é a seguinte", + "desc": [ + "【currentAccountPicture】: Componente superior 【Widget】", + "【accountName】: Componente do meio 【Widget】", + "【accountEmail】: Componente inferior 【Widget】", + "【decoration】: Decoração 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Canto superior direito e inferior", + "desc": [ + "【otherAccountsPictures】: Componente superior direito 【List】", + "【onDetailsPressed】: Evento de clique no canto inferior direito 【Function()】", + "【arrowColor】: Cor do botão no canto inferior direito 【Color】", + "【margin】: Margem externa 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json new file mode 100644 index 00000000..f4512b44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Заголовок отображения", + "info": "Универсальная структура отображения, предоставляемая Flutter, в которую можно вставлять компоненты в соответствующие места, что позволяет легко адаптироваться к конкретным элементам, часто используется в Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление компонента", + "desc": [ + "【currentAccountPicture】: Верхний компонент 【Widget】", + "【accountName】: Средний компонент 【Widget】", + "【accountEmail】: Нижний компонент 【Widget】", + "【decoration】: Декорация 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Верхний правый угол и нижняя часть", + "desc": [ + "【otherAccountsPictures】: Верхний правый компонент 【List】", + "【onDetailsPressed】: Событие нажатия в нижнем правом углу 【Function()】", + "【arrowColor】: Цвет кнопки в нижнем правом углу 【Color】", + "【margin】: Внешний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json new file mode 100644 index 00000000..efda0517 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "展示头", + "info": "Flutter提供的一个通用展示结构,相应位置可插入组件,可以很方便地应对特定的条目,常用于Drawer中。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "该组件的基本表现如下", + "desc": [ + "【currentAccountPicture】: 上组件 【Widget】", + "【accountName】: 中组件 【Widget】", + "【accountEmail】: 下组件 【Widget】", + "【decoration】: 装饰 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "右上角和底部", + "desc": [ + "【otherAccountsPictures】: 右上组件 【List】", + "【onDetailsPressed】: 右下角点击事件 【Function()】", + "【arrowColor】: 右下角按钮颜色 【Color】", + "【margin】: 外边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart new file mode 100644 index 00000000..dc2eda1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + + +class CustomUAGHP extends StatelessWidget { + const CustomUAGHP({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery.of(context).size.width / 3 * 2, + child: UserAccountsDrawerHeader( + accountName: Container( + padding: const EdgeInsets.all(8.0), + child: const Text( + "张风捷特烈", + style: + TextStyle(color: Colors.orangeAccent, fontSize: 22, shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 2, + ), + ]), + ), + ), + accountEmail: const Padding( + padding: EdgeInsets.all(8.0), + child: Text("1981462002@qq.com", + style: TextStyle(color: Colors.white, fontSize: 14, shadows: [ + Shadow( + color: Colors.orangeAccent, + offset: Offset(.5, .5), + blurRadius: 2), + ])), + ), + currentAccountPicture: Container( + padding: const EdgeInsets.all(15.0), + child: const CircleAvatar( + backgroundImage: AssetImage("assets/images/icon_head.webp"), + ), + ), + decoration: const BoxDecoration( + image: DecorationImage(image: AssetImage("assets/images/caver.webp")), + ), + ), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart similarity index 81% rename from packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart rename to modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart index 834e33e3..3c8e7d54 100644 --- a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 22, -// "priority": 2, -// "name": "右上角和底部", -// "subtitle": "【otherAccountsPictures】: 右上组件 【List】\n" -// "【onDetailsPressed】: 右下角点击事件 【Function()】\n" -// "【arrowColor】: 右下角按钮颜色 【Color】\n" -// "【margin】: 外边距 【EdgeInsetsGeometry】", -// } class ProUAGHP extends StatelessWidget { const ProUAGHP({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json new file mode 100644 index 00000000..746f6a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Vertikale Trennlinie", + "info": "Vertikale Trennlinie, kann Farbe, Breite, Dicke und Abstände oben und unten angeben, wird häufig als Trennlinie für Listenelemente verwendet.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider Farbe und Dicke", + "desc": [ + "【color】: Farbe 【Color】", + "【thickness】: Linienstärke 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider Breite und Abstand", + "desc": [ + "【indent】: Abstand vorne 【double】", + "【endIndent】: Abstand hinten 【double】", + "【width】: Platzhalterbreite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json new file mode 100644 index 00000000..77b48689 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Vertical Divider", + "info": "Vertical divider, which can specify color, width, thickness, top and bottom margin information, commonly used as the divider between list items.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider Color and Thickness", + "desc": [ + "【color】: Color 【Color】", + "【thickness】: Line thickness 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider Width and Indent", + "desc": [ + "【indent】: Front indent length 【double】", + "【endIndent】: Back indent length 【double】", + "【width】: Placeholder width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json new file mode 100644 index 00000000..d8fe8485 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisor vertical", + "info": "Divisor vertical, se puede especificar el color, el ancho, el grosor, el margen superior e inferior, comúnmente utilizado como divisor de elementos en una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Color y grosor del VerticalDivider", + "desc": [ + "【color】: color 【Color】", + "【thickness】: grosor de la línea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Ancho y espacio del VerticalDivider", + "desc": [ + "【indent】: longitud del espacio frontal 【double】", + "【endIndent】: longitud del espacio posterior 【double】", + "【width】: ancho de ocupación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json new file mode 100644 index 00000000..9ce751ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Ligne de séparation verticale", + "info": "Ligne de séparation verticale, peut spécifier la couleur, la largeur, l'épaisseur, les marges supérieure et inférieure, couramment utilisée pour les lignes de séparation des éléments de liste.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Couleur et épaisseur de VerticalDivider", + "desc": [ + "【color】: Couleur 【Color】", + "【thickness】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Largeur et espacement de VerticalDivider", + "desc": [ + "【indent】: Longueur de l'espacement avant 【double】", + "【endIndent】: Longueur de l'espacement arrière 【double】", + "【width】: Largeur occupée 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json new file mode 100644 index 00000000..af0d6378 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisore Verticale", + "info": "Divisore verticale, può specificare colore, larghezza, spessore, margini superiore e inferiore, comunemente usato come divisore per gli elementi di una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Colore e Spessore del VerticalDivider", + "desc": [ + "【color】: Colore 【Color】", + "【thickness】: Spessore della linea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Larghezza e Spaziature del VerticalDivider", + "desc": [ + "【indent】: Lunghezza dello spazio anteriore 【double】", + "【endIndent】: Lunghezza dello spazio posteriore 【double】", + "【width】: Larghezza occupata 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json new file mode 100644 index 00000000..e1d4653e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "垂直分割線", + "info": "垂直分割線、色、幅、太さ、上下の余白情報を指定でき、リストのアイテム分割線としてよく使われます。", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDividerの色と太さ", + "desc": [ + "【color】: 色 【Color】", + "【thickness】: 線の太さ 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDividerの幅と空白", + "desc": [ + "【indent】: 前の空白の長さ 【double】", + "【endIndent】: 後の空白の長さ 【double】", + "【width】: 占める幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json new file mode 100644 index 00000000..ad155b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "수직 구분선", + "info": "수직 구분선, 색상, 너비, 두께, 상하 여백 정보를 지정할 수 있으며, 주로 리스트의 항목 구분선으로 사용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider 색상 및 두께", + "desc": [ + "【color】: 색상 【Color】", + "【thickness】: 선 두께 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider 너비 및 여백", + "desc": [ + "【indent】: 앞쪽 여백 길이 【double】", + "【endIndent】: 뒤쪽 여백 길이 【double】", + "【width】: 차지하는 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json new file mode 100644 index 00000000..dafc51e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisor Vertical", + "info": "Divisor vertical, pode especificar cor, largura, espessura, margens superior e inferior, comumente usado como divisor de itens de lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cor e Espessura do VerticalDivider", + "desc": [ + "【color】: cor 【Color】", + "【thickness】: espessura da linha 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Largura e Espaço do VerticalDivider", + "desc": [ + "【indent】: comprimento do espaço frontal 【double】", + "【endIndent】: comprimento do espaço traseiro 【double】", + "【width】: largura ocupada 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json new file mode 100644 index 00000000..39c05222 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Вертикальный разделитель", + "info": "Вертикальный разделитель, можно указать цвет, ширину, толщину, отступы сверху и снизу, часто используется для разделения элементов списка.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Цвет и толщина VerticalDivider", + "desc": [ + "【color】: цвет 【Color】", + "【thickness】: толщина линии 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Ширина и отступы VerticalDivider", + "desc": [ + "【indent】: длина отступа спереди 【double】", + "【endIndent】: длина отступа сзади 【double】", + "【width】: ширина занимаемого места 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json new file mode 100644 index 00000000..7fad0ce5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "竖直分割线", + "info": "竖直分割线,可指定颜色、宽度、粗细、上下边距信息,常用与列表的item分割线。", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider颜色和粗细", + "desc": [ + "【color】: 颜色 【Color】", + "【thickness】: 线粗细 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider宽度和空缺", + "desc": [ + "【indent】: 前面空缺长度 【double】", + "【endIndent】: 后面空缺长度 【double】", + "【width】: 占位宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart new file mode 100644 index 00000000..36473ef2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class CustomVerticalDivider extends StatelessWidget { + const CustomVerticalDivider({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List dataColor = [ + Colors.red, Colors.yellow, + Colors.blue, Colors.green]; + List dataThickness = [1.0, 2.0, 4.0, 6.0]; + Map data = Map.fromIterables(dataColor, dataThickness); + return SizedBox( + height: 150, + child: Row( + mainAxisSize: MainAxisSize.min, + children: dataColor + .map((e) => VerticalDivider( + color: e, + thickness: data[e], + )).toList(), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart new file mode 100644 index 00000000..86610bcc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart @@ -0,0 +1,34 @@ + + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class WidthVerticalDivider extends StatelessWidget { + const WidthVerticalDivider({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List dataColor = [ + Colors.red, Colors.yellow, + Colors.blue, Colors.green]; + List dataThickness = [10.0, 20.0, 30.0, 40.0]; + Map data = Map.fromIterables(dataColor, dataThickness); + return SizedBox( + height: 150, + child: Row( + mainAxisSize: MainAxisSize.min, + children: dataColor + .map((e) => VerticalDivider( + color: e, + indent:data[e], + endIndent: data[e]!*2, + width: data[e], + thickness: data[e]!/10, + )) + .toList(), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json new file mode 100644 index 00000000..d4836b21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Sichtbarkeitskomponente", + "info": "Steuert die Anzeige oder Ausblendung einer Komponente und ermöglicht die Festlegung eines Platzhalterkomponente nach dem Ausblenden. Eine ähnliche Funktion bietet die OffStage-Komponente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Steuert die Sichtbarkeit der internen Unterkomponenten basierend auf visible", + "desc": [ + "【visible】 : Gibt an, ob angezeigt wird 【bool】", + "【child】: Kind 【Widget】", + "Standardmäßig geht der ursprüngliche Bereich verloren, wenn das Kind ausgeblendet wird." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement kann beim Ausblenden als Platzhalter verwendet werden", + "desc": [ + "【replacement】 : Platzhalterkomponente beim Ausblenden 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json new file mode 100644 index 00000000..857330ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Visibility Component", + "info": "Controls the display or hiding of a component, and can set a placeholder component when hidden. A similar function is provided by the OffStage component.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Control the visibility of internal child components based on visible", + "desc": [ + "【visible】: Whether to display 【bool】", + "【child】: Child 【Widget】", + "By default, the child will lose its original area when hidden." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement can be used as a placeholder when hidden", + "desc": [ + "【replacement】: Placeholder component when hidden 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json new file mode 100644 index 00000000..ace7d1b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente de Visibilidad", + "info": "Controla si un componente se muestra o se oculta, y permite configurar un componente de marcador de posición cuando está oculto. Un componente similar en funcionalidad es el componente OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controla la visibilidad de los componentes hijos internos según visible", + "desc": [ + "【visible】 : Si se muestra o no 【bool】", + "【child】: Hijo 【Widget】", + "Por defecto, cuando el hijo está oculto, pierde el área original donde estaba." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement puede ocupar el lugar cuando está oculto", + "desc": [ + "【replacement】 : Componente de marcador de posición cuando está oculto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json new file mode 100644 index 00000000..c6f8bc0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Composant de visibilité", + "info": "Contrôle l'affichage ou la dissimulation d'un composant, peut définir un composant de remplacement lorsqu'il est caché. Le composant OffStage a une fonction similaire.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Contrôle l'affichage ou la dissimulation des composants enfants en fonction de visible", + "desc": [ + "【visible】 : Afficher ou non 【bool】", + "【child】: Enfant 【Widget】", + "Par défaut, l'enfant perd sa zone d'origine lorsqu'il est caché." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement peut être utilisé comme espace réservé lors de la dissimulation", + "desc": [ + "【replacement】 : Composant de remplacement lors de la dissimulation 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json new file mode 100644 index 00000000..5e05510a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente di Visibilità", + "info": "Controlla la visualizzazione o l'occultamento di un componente, con la possibilità di impostare un componente segnaposto quando è nascosto. Una funzionalità simile è offerta dal componente OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controlla la visibilità dei componenti figli interni in base a visible", + "desc": [ + "【visible】: Se visualizzare o meno 【bool】", + "【child】: Figlio 【Widget】", + "Per impostazione predefinita, quando il figlio è nascosto, perde l'area originale in cui si trovava." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement può essere utilizzato come segnaposto quando è nascosto", + "desc": [ + "【replacement】: Componente segnaposto quando è nascosto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json new file mode 100644 index 00000000..9a43e083 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "表示/非表示コンポーネント", + "info": "コンポーネントの表示または非表示を制御し、非表示時のプレースホルダーコンポーネントを設定できます。類似の機能を持つコンポーネントとしてOffStageコンポーネントがあります。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "visibleに基づいて内部の子コンポーネントの表示/非表示を制御", + "desc": [ + "【visible】 : 表示するかどうか 【bool】", + "【child】: 子コンポーネント 【Widget】", + "デフォルトでは、子コンポーネントが非表示になると元の領域を失います。" + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacementを使用して非表示時のプレースホルダーを設定", + "desc": [ + "【replacement】 : 非表示時のプレースホルダーコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json new file mode 100644 index 00000000..4cac94c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "표시/숨김 컴포넌트", + "info": "컴포넌트의 표시 또는 숨김을 제어하며, 숨김 후의 자리 표시 컴포넌트를 설정할 수 있습니다. 이와 유사한 기능을 가진 OffStage 컴포넌트가 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "visible에 따라 내부 자식 컴포넌트의 표시/숨김 상태를 제어", + "desc": [ + "【visible】 : 표시 여부 【bool】", + "【child】: 자식 【Widget】", + "기본적으로 자식이 숨겨지면 원래 영역을 잃습니다." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement는 숨김 시 자리 표시를 할 수 있습니다", + "desc": [ + "【replacement】 : 숨김 시의 자리 표시 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json new file mode 100644 index 00000000..18e4cbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente de Visibilidade", + "info": "Controla a exibição ou ocultação de um componente, podendo definir um componente de espaço reservado após a ocultação. Um componente com funcionalidade semelhante é o OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controla a visibilidade dos componentes internos com base no visível", + "desc": [ + "【visible】 : Se deve ser exibido 【bool】", + "【child】: Filho 【Widget】", + "Por padrão, o filho perde a área original quando oculto." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement pode ser usado como espaço reservado ao ocultar", + "desc": [ + "【replacement】 : Componente de espaço reservado ao ocultar 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json new file mode 100644 index 00000000..52e8b516 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Компонент видимости", + "info": "Управляет отображением или скрытием компонента, можно установить компонент-заполнитель при скрытии. Похожую функциональность имеет компонент OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Управление видимостью внутренних дочерних компонентов с помощью visible", + "desc": [ + "【visible】 : Отображать ли 【bool】", + "【child】: Дочерний элемент 【Widget】", + "По умолчанию при скрытии дочернего элемента он теряет свою исходную область." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement может использоваться для заполнения при скрытии", + "desc": [ + "【replacement】 : Компонент-заполнитель при скрытии 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json new file mode 100644 index 00000000..48f0b2d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "显隐组件", + "info": "控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "根据visible控制内部子组件的显隐情况", + "desc": [ + "【visible】 : 是否显示 【bool】", + "【child】: 孩子 【Widget】", + "默认孩子隐藏时会失去原来所在区域。" + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement可在隐藏时进行占位", + "desc": [ + "【replacement】 : 隐藏时的占位组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart new file mode 100644 index 00000000..e6c1de43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/27 +/// contact me by email 1981462002@qq.com + +class CustomVisibility extends StatelessWidget { + const CustomVisibility({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: [ + _buildVisibility(true), + _buildVisibility(false), + ], + ); + } + + Widget _buildVisibility(bool visible) { + Widget box = Container( + height: 30, + width: 30, + color: Colors.blue, + ); + return Container( + width: 150, + height: 150 * 0.618, + color: Colors.cyanAccent.withAlpha(33), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + box, + Visibility( + visible: visible, + child: Container( + alignment: Alignment.center, + height: 80 * 0.618, + width: 80, + color: Colors.red, + child: const Text( + "visible\ntrue", + style: TextStyle(fontSize: 20), + ), + )), + box, + ], + ), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart similarity index 86% rename from packages/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart index d9ed102b..9c96f49d 100644 --- a/packages/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 10, -// "priority": 2, -// "name": "replacement可在隐藏时进行占位", -// "subtitle": "【replacement】 : 隐藏时的占位组件 【Widget】", -// } class ReplacementVisibility extends StatelessWidget { const ReplacementVisibility({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart b/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart new file mode 100644 index 00000000..692ab395 --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart @@ -0,0 +1,28 @@ +library render_object_widget; + + +export '../MultiChildRenderObjectWidget/Flex/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_02.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_03.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_04.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_05.dart'; + +export '../MultiChildRenderObjectWidget/Flow/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flow/node_02.dart'; +export '../MultiChildRenderObjectWidget/RichText/node1_base.dart'; +export '../MultiChildRenderObjectWidget/RichText/node2_widget.dart'; +export '../MultiChildRenderObjectWidget/Stack/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Stack/node2_positioned.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node2_alignment.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart'; +export '../MultiChildRenderObjectWidget/Column/node_01.dart'; +export '../MultiChildRenderObjectWidget/IndexedStack/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Row/node1_base.dart'; +export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart'; +export '../MultiChildRenderObjectWidget/Viewport/node1_base.dart'; +export '../MultiChildRenderObjectWidget/ListBody/node1_base.dart'; +export '../MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart'; +export '../MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart'; diff --git a/packages/widgets/lib/exp/other_unit.dart b/modules/widget_system/widgets/lib/exp/Other.dart similarity index 100% rename from packages/widgets/lib/exp/other_unit.dart rename to modules/widget_system/widgets/lib/exp/Other.dart diff --git a/modules/widget_system/widgets/lib/exp/ProxyWidget.dart b/modules/widget_system/widgets/lib/exp/ProxyWidget.dart new file mode 100644 index 00000000..2b2e5cdd --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/ProxyWidget.dart @@ -0,0 +1,38 @@ +/// create by 张风捷特烈 on 2020/4/28 +/// contact me by email 1981462002@qq.com +/// 说明: + +library proxy_widget_unit.dart; + + +export '../ProxyWidget/DropdownButtonHideUnderline/node1_base.dart'; +export '../ProxyWidget/Flexible/node1_base.dart'; +export '../ProxyWidget/MediaQuery/node1_base.dart'; +export '../ProxyWidget/ButtonTheme/node1_base.dart'; +export '../ProxyWidget/DefaultTextStyle/node1_base.dart'; +export '../ProxyWidget/SliderTheme/node1_base.dart'; +export '../ProxyWidget/SliderTheme/node2_diy.dart'; +export '../ProxyWidget/DividerTheme/node1_base.dart'; +export '../ProxyWidget/IconTheme/node1_base.dart'; +export '../ProxyWidget/ScrollConfiguration/node1_base.dart'; +export '../ProxyWidget/Expanded/node1_base.dart'; +export '../ProxyWidget/Positioned/node1_base.dart'; +export '../ProxyWidget/LayoutId/node1_base.dart'; +export '../ProxyWidget/ChipTheme/node1_base.dart' hide CustomFilterChip; +export '../ProxyWidget/ListTileTheme/node1_base.dart'; +export '../ProxyWidget/MaterialBannerTheme/node1_base.dart'; +export '../ProxyWidget/PopupMenuTheme/node1_base.dart'; +export '../ProxyWidget/ToggleButtonsTheme/node1_base.dart'; +export '../ProxyWidget/ButtonBarTheme/node1_base.dart'; +export '../ProxyWidget/TooltipTheme/node1_base.dart'; +export '../ProxyWidget/Directionality/node1_base.dart'; +export '../ProxyWidget/TableCell/node1_base.dart'; +export '../ProxyWidget/KeepAlive/node1_base.dart'; +export '../ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart'; +export '../ProxyWidget/InheritedTheme/node1_base.dart'; +export '../ProxyWidget/DefaultAssetBundle/node1_base.dart'; +export '../ProxyWidget/InheritedWidget/node1_base.dart'; +export '../ProxyWidget/InheritedWidget/node2_use.dart'; +export '../ProxyWidget/ParentDataWidget/node1_base.dart'; +export '../ProxyWidget/InheritedModel/node1.dart'; +export '../ProxyWidget/PrimaryScrollController/node1_base.dart'; diff --git a/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart new file mode 100644 index 00000000..6b519dcb --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart @@ -0,0 +1,76 @@ +library render_object_widget; + +export '../SingleChildRenderObjectWidget/Align/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Align/node2_other.dart'; +export '../SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart'; +export '../SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart'; +export '../SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart'; +export '../SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart'; +export '../SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart'; +export '../SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart'; + +export '../SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart'; +export '../SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart'; +export '../SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ColoredBox/node1_base.dart'; + +export '../SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart'; +export '../SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Baseline/node1_base.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart'; +export '../SingleChildRenderObjectWidget/FadeTransition/node1_base.dart'; +export '../SingleChildRenderObjectWidget/FittedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/LimitedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/OffStage/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Opacity/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Padding/node1_all.dart'; +export '../SingleChildRenderObjectWidget/Padding/node2_only.dart'; +export '../SingleChildRenderObjectWidget/Padding/node3_symmetric.dart'; +export '../SingleChildRenderObjectWidget/RotatedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/SizedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Transform/node1_skew.dart'; +export '../SingleChildRenderObjectWidget/Transform/node2_translation.dart'; +export '../SingleChildRenderObjectWidget/Transform/node3_scale.dart'; +export '../SingleChildRenderObjectWidget/Transform/node4_rotate.dart'; +export '../SingleChildRenderObjectWidget/Transform/node5_perspective.dart'; +export '../SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart'; +export '../StatefulWidget/PositionedTransition/node1_base.dart'; +export '../StatefulWidget/RotationTransition/node1_base.dart'; +export '../StatefulWidget/ScaleTransition/node1_base.dart'; +export '../StatefulWidget/SizeTransition/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ClipOval/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ClipPath/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ClipRRect/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ClipRect/node1_base.dart'; +export '../SingleChildRenderObjectWidget/OverflowBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/AspectRatio/node1_base.dart'; +export '../SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Center/node1_base.dart'; +export '../SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart'; +export '../SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart'; +export '../SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart'; +export '../SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart'; +export '../SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart'; +export '../SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart'; +export '../SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart'; +export '../SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart'; +export '../SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart'; +export '../SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart'; +export '../SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart'; +export '../SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart'; +export '../SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart'; +export '../SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart'; +export '../SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart'; +export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; +export '../SingleChildRenderObjectWidget/TapRegion/node1.dart'; +export '../SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart'; +export '../SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart'; diff --git a/modules/widget_system/widgets/lib/exp/Sliver.dart b/modules/widget_system/widgets/lib/exp/Sliver.dart new file mode 100644 index 00000000..b7cbed9f --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/Sliver.dart @@ -0,0 +1,37 @@ +/// create by 张风捷特烈 on 2020/4/28 +/// contact me by email 1981462002@qq.com +/// 说明: + +library sliver_unit.dart; + +export '../Sliver/CustomScrollView/node1_base.dart'; +export '../Sliver/FlexibleSpaceBar/node1_base.dart'; +export '../Sliver/SliverAppBar/node1_base.dart'; +export '../Sliver/SliverFillViewport/node1_base.dart'; +export '../Sliver/SliverFixedExtentList/node1_base.dart'; +export '../Sliver/SliverGrid/node1_base.dart'; +export '../Sliver/SliverList/node1_base.dart'; +export '../Sliver/SliverOpacity/node1_base.dart'; +export '../Sliver/SliverPadding/node1_base.dart'; +export '../Sliver/SliverPersistentHeader/node1_base.dart'; +export '../Sliver/SliverToBoxAdapter/node1_base.dart'; +export '../Sliver/SliverOverlapAbsorber/node1_base.dart'; +export '../Sliver/SliverOverlapInjector/node1_base.dart'; +export '../Sliver/SliverPrototypeExtentList/node1_base.dart'; +export '../Sliver/CupertinoSliverNavigationBar/node1_base.dart'; +export '../Sliver/CupertinoSliverRefreshControl/node1_base.dart'; +export '../Sliver/SliverFillRemaining/node1_base.dart'; +export '../Sliver/SliverIgnorePointer/node1_base.dart'; +export '../Sliver/SliverAnimatedList/node1_base.dart'; +export '../Sliver/SliverLayoutBuilder/node1_base.dart'; +export '../Sliver/SliverWithKeepAliveWidget/node1_base.dart'; +export '../Sliver/DecoratedSliver/node1.dart'; +export '../Sliver/SliverConstrainedCrossAxis/node1.dart'; +export '../Sliver/SliverCrossAxisExpanded/node1.dart'; +export '../Sliver/SliverCrossAxisGroup/node1.dart'; +export '../Sliver/SliverMainAxisGroup/node1.dart'; +export '../Sliver/PinnedHeaderSliver/node_01.dart'; +export '../Sliver/PinnedHeaderSliver/node_02.dart'; +export '../Sliver/PinnedHeaderSliver/node_03.dart'; +// export '../Sliver/SliverResizingHeader/node_01.dart'; +// export '../Sliver/SliverResizingHeader/node_02.dart'; diff --git a/modules/widget_system/widgets/lib/exp/StatefulWidget.dart b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart new file mode 100644 index 00000000..f90b2fa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart @@ -0,0 +1,204 @@ +library stateful_unit; + +export '../StatefulWidget/CupertinoButton/node1_base.dart'; +export '../StatefulWidget/CupertinoContextMenu/node1_base.dart'; +export '../StatefulWidget/CupertinoContextMenuAction/node1_base.dart'; +export '../StatefulWidget/DateRangePickerDialog/node1_base.dart'; +export '../StatefulWidget/DateRangePickerDialog/node2_diy.dart'; + +export '../StatefulWidget/CupertinoDatePicker/node1_base.dart'; +export '../StatefulWidget/CupertinoPicker/node1_base.dart'; +export '../StatefulWidget/CupertinoTimerPicker/node1_base.dart'; +export '../StatefulWidget/SlideTransition/node1_base.dart'; +export '../StatefulWidget/MonthPicker/node1_base.dart'; +export '../StatefulWidget/YearPicker/node1_base.dart'; +export '../StatefulWidget/WillPopScope/node1_base.dart'; +export '../StatefulWidget/NestedScrollView/node1_base.dart'; +export '../StatefulWidget/AppBar/node1_base.dart'; +export '../StatefulWidget/AppBar/node2_tab.dart'; +export '../StatefulWidget/BottomAppBar/node1_base.dart'; +export '../StatefulWidget/BottomNavigationBar/node1_base.dart'; +export '../StatefulWidget/BottomNavigationBar/node2_page.dart'; +export '../StatefulWidget/Checkbox/node1_base.dart'; +export '../StatefulWidget/Checkbox/node2_tristate.dart'; +export '../StatefulWidget/ExpandIcon/node1_base.dart'; +export '../StatefulWidget/ExpansionTile/node1_base.dart'; +export '../StatefulWidget/Radio/node1_base.dart'; +export '../StatefulWidget/Tooltip/node1_base.dart'; +export '../StatefulWidget/Tooltip/node2_decoration.dart'; +export '../StatefulWidget/CircularProgressIndicator/node1_base.dart'; +export '../StatefulWidget/CupertinoActivityIndicator/node1_base.dart'; +export '../StatefulWidget/CupertinoSlider/node1_base.dart'; +export '../StatefulWidget/CupertinoSwitch/node1_base.dart'; +export '../StatefulWidget/CupertinoSegmentedControl/node1_base.dart'; +export '../StatefulWidget/CupertinoSegmentedControl/node2_color.dart'; +export '../StatefulWidget/Navigator/node1_base.dart'; +export '../StatefulWidget/InteractiveViewer/node1_base.dart'; +export '../StatefulWidget/InteractiveViewer/node2_constrained.dart'; +export '../StatefulWidget/InteractiveViewer/node3_controller.dart'; +export '../StatefulWidget/CarouselView/node1_base.dart'; +export '../StatefulWidget/CarouselView/node2.dart'; + +export '../StatefulWidget/Image/node1_base.dart'; +export '../StatefulWidget/Image/node2_fit.dart'; +export '../StatefulWidget/Image/node3_alignment.dart'; +export '../StatefulWidget/Image/node4_colorBlendMode.dart'; +export '../StatefulWidget/Image/node5_repeat.dart'; +export '../StatefulWidget/Image/node6_centerSlice.dart'; + +export '../StatefulWidget/RangeSlider/node1_base.dart'; +export '../StatefulWidget/Slider/node1_base.dart'; +export '../StatefulWidget/Slider/node2_lable.dart'; +export '../StatefulWidget/Switch/node1_base.dart'; +export '../StatefulWidget/Switch/node2_image.dart'; +export '../StatefulWidget/StatefulBuilder/node1_base.dart'; +export '../StatefulWidget/RefreshIndicator/node1_base.dart'; +export '../StatefulWidget/SelectableText/node1_base.dart'; +export '../StatefulWidget/SelectableText/node2_align.dart'; +export '../StatefulWidget/CupertinoNavigationBar/node1_base.dart'; +export '../StatefulWidget/CupertinoTabBar/node1_base.dart'; +export '../StatefulWidget/CupertinoTextField/node1_base.dart'; +export '../StatefulWidget/CupertinoTextField/node2_style.dart'; +export '../StatefulWidget/ValueListenableBuilder/node1_base.dart'; +export '../StatefulWidget/MouseRegion/node1_base.dart'; +export '../StatefulWidget/Scrollable/node1_base.dart'; + +export '../StatefulWidget/DropdownButton/node1_base.dart'; +export '../StatefulWidget/DropdownButton/node2_style.dart'; + +export '../StatefulWidget/AnimatedCrossFade/node1_base.dart'; +export '../StatefulWidget/AnimatedCrossFade/node2_curve.dart'; + +export '../StatefulWidget/AnimatedList/node1_base.dart'; +export '../StatefulWidget/AnimatedSwitcher/node1_base.dart'; +export '../StatefulWidget/AlignTransition/node1_base.dart'; +export '../StatefulWidget/DecoratedBoxTransition/node1_base.dart'; +export '../StatefulWidget/DefaultTextStyleTransition/node1_base.dart'; +export '../StatefulWidget/RelativePositionedTransition/node1_base.dart'; +export '../StatefulWidget/CupertinoScrollbar/node1_base.dart'; +export '../StatefulWidget/RawGestureDetector/node1_base.dart'; + +export '../StatefulWidget/Dismissible/node1_base.dart'; +export '../StatefulWidget/AutomaticKeepAlive/node1_base.dart'; +export '../StatefulWidget/AnimatedModalBarrier/node1_base.dart'; +export '../StatefulWidget/FormField/node1_base.dart'; +export '../StatefulWidget/AnimatedBuilder/node1_base.dart'; +export '../StatefulWidget/TweenAnimationBuilder/node1_base.dart'; +export '../StatefulWidget/PaginatedDataTable/node1_base.dart'; +export '../StatefulWidget/RawKeyboardListener/node1_base.dart'; +export '../StatefulWidget/Dismissible/node2_direction.dart'; + +export '../StatefulWidget/DragTarget/node1_base.dart'; +export '../StatefulWidget/Draggable/node1_base.dart'; +export '../StatefulWidget/Draggable/node2_data.dart'; +export '../StatefulWidget/Draggable/node3_use.dart'; + +export '../StatefulWidget/Form/node1_base.dart'; +export '../StatefulWidget/StatusTransitionWidget/node1_base.dart'; +export '../StatefulWidget/UniqueWidget/node1_base.dart'; +export '../StatefulWidget/FutureBuilder/node1_base.dart'; +export '../StatefulWidget/Hero/node1_base.dart'; +export '../StatefulWidget/AnimatedAlign/node1_base.dart'; +export '../StatefulWidget/AnimatedScale/node1.dart'; +export '../StatefulWidget/AnimatedSlide/node1.dart'; +export '../StatefulWidget/AnimatedRotation/node1.dart'; +export '../StatefulWidget/AnimatedFractionallySizedBox/node1.dart'; +export '../StatefulWidget/AnimatedContainer/node1_base.dart'; +export '../StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart'; +export '../StatefulWidget/AnimatedOpacity/node1_base.dart'; +export '../StatefulWidget/AnimatedPadding/node1_base.dart'; +export '../StatefulWidget/AnimatedPositioned/node1_base.dart'; +export '../StatefulWidget/AnimatedPositionedDirectional/node1_base.dart'; + +export '../StatefulWidget/ExpansionPanelList/node1_base.dart'; +export '../StatefulWidget/DropdownButtonFormField/node1_base.dart'; + +export '../StatefulWidget/Ink/node1_base.dart'; +export '../StatefulWidget/Ink/node2_image.dart'; + +export '../StatefulWidget/InkResponse/node1_base.dart'; + +export '../StatefulWidget/InkResponse/node2_color.dart'; +export '../StatefulWidget/DropdownMenu/node1.dart'; +export '../StatefulWidget/DropdownMenu/node2.dart'; +export '../StatefulWidget/DropdownMenu/node3.dart'; +export '../StatefulWidget/InkWell/node1_base.dart'; +export '../StatefulWidget/InkWell/node2_color.dart'; + +export '../StatefulWidget/LicensePage/node1_base.dart'; +export '../StatefulWidget/ListWheelScrollView/node1_base.dart'; +export '../StatefulWidget/LongPressDraggable/node1_base.dart'; +export '../StatefulWidget/Material/node1_base.dart'; +export '../StatefulWidget/Material/node2_shape.dart'; +export '../StatefulWidget/Overlay/node1_base.dart'; +export '../StatefulWidget/PageView/node1_base.dart'; +export '../StatefulWidget/PageView/node2_direction.dart'; +export '../StatefulWidget/PageView/node3_controller.dart'; +export '../StatefulWidget/PopupMenuButton/node1_base.dart'; +export '../StatefulWidget/PopupMenuDivider/node1_base.dart'; +export '../StatefulWidget/RawChip/node1_press.dart'; +export '../StatefulWidget/RawChip/node2_select.dart'; + +export '../StatefulWidget/RawMaterialButton/node1_base.dart'; +export '../StatefulWidget/RawMaterialButton/node2_shape.dart'; +export '../StatefulWidget/ReorderableListView/node1_base.dart'; +export '../StatefulWidget/ReorderableListView/node2_direction.dart'; +export '../StatefulWidget/Scrollbar/node1_base.dart'; +export '../StatefulWidget/Stepper/node1_base.dart'; +export '../StatefulWidget/Stepper/node2_type.dart'; +export '../StatefulWidget/StreamBuilder/node1_base.dart'; +export '../StatefulWidget/TableRowInkWell/node1_base.dart'; +export '../StatefulWidget/TextField/node1_base.dart'; +export '../StatefulWidget/TextField/node2_cursor.dart'; +export '../StatefulWidget/TextField/node3_decoration.dart'; + +export '../StatefulWidget/TextFormField/node1_base.dart'; +export '../StatefulWidget/LinearProgressIndicator/node1_base.dart'; +export '../StatefulWidget/CupertinoApp/node1_base.dart'; +export '../StatefulWidget/CupertinoPageScaffold/node1_base.dart'; +export '../StatefulWidget/CupertinoTabScaffold/node1_base.dart'; +export '../StatefulWidget/MaterialApp/node1_base.dart'; +export '../StatefulWidget/Scaffold/node1_base.dart'; +export '../StatefulWidget/TabBarView/node1_base.dart'; +export '../StatefulWidget/InputDecorator/node1_base.dart'; +export '../StatefulWidget/EditableText/node1_base.dart'; +export '../StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart'; +export '../StatefulWidget/WidgetsApp/node1_base.dart' hide HomePage; +export '../StatefulWidget/WidgetInspector/node1_base.dart' hide HomePage; +export '../StatefulWidget/AnimatedTheme/node1_base.dart'; +export '../StatefulWidget/AnimatedPhysicalModel/node1_base.dart'; +export '../StatefulWidget/DefaultTabController/node1_base.dart'; +export '../StatefulWidget/GlowingOverscrollIndicator/node1_base.dart'; +export '../StatefulWidget/DraggableScrollableSheet/node1_base.dart'; +export '../StatefulWidget/DrawerController/node1_base.dart'; +export '../StatefulWidget/MergeableMaterial/node1_base.dart'; +export '../StatefulWidget/CupertinoTabView/node1_base.dart'; + +export '../StatefulWidget/TextButton/node1_base.dart'; +export '../StatefulWidget/TextButton/node2_style.dart'; +export '../StatefulWidget/FilledButton/node1.dart'; +export '../StatefulWidget/FilledButton/node2.dart'; +export '../StatefulWidget/Localizations/node1.dart'; + +export '../StatefulWidget/ElevatedButton/node1_base.dart'; +export '../StatefulWidget/ElevatedButton/node2_style.dart'; + +export '../StatefulWidget/OutlinedButton//node1_base.dart'; +export '../StatefulWidget/OutlinedButton/node2_style.dart'; + +export '../StatefulWidget/NavigationRail/node1_base.dart'; +export '../StatefulWidget/NavigationRail/node2_extend.dart'; +export '../StatefulWidget/NavigationRail/node3_dark.dart'; +export '../StatefulWidget/CupertinoCheckbox/node1.dart'; +export '../StatefulWidget/CupertinoCheckbox/node2.dart'; +export '../StatefulWidget/CupertinoCheckbox/node3.dart'; + +export '../StatefulWidget/CupertinoRadio/node1.dart'; +export '../StatefulWidget/CupertinoRadio/node2.dart'; +export '../StatefulWidget/CupertinoRadio/node3.dart'; +export '../StatefulWidget/UndoHistory/node1.dart'; +export '../StatefulWidget/TickerMode/node1.dart'; +export '../StatefulWidget/KeyboardListener/node1.dart'; +export '../StatefulWidget/Focus/node1.dart'; +export '../StatefulWidget/Focus/node2.dart'; +export '../StatefulWidget/Focus/node3.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/exp/StatelessWidget.dart b/modules/widget_system/widgets/lib/exp/StatelessWidget.dart new file mode 100644 index 00000000..9833ccae --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/StatelessWidget.dart @@ -0,0 +1,213 @@ +library stateless_unit; + +export '../StatelessWidget/AboutDialog/node1_base.dart'; +export '../StatelessWidget/AboutListTile/node1_base.dart'; +export '../StatelessWidget/ActionChip/node1_base.dart'; +export '../StatelessWidget/AlertDialog/node1_base.dart'; +export '../StatelessWidget/AnimatedIcon/node1_base.dart'; +export '../StatelessWidget/CheckedModeBanner/node1_base.dart'; +export '../StatelessWidget/Card/node1_base.dart'; +export '../StatelessWidget/Card/node2_shape.dart'; +export '../StatelessWidget/PreferredSize/node1_base.dart'; +export '../StatelessWidget/PreferredSize/node2_adapter.dart'; +export '../StatelessWidget/Builder/node1_base.dart'; +export '../StatelessWidget/NavigationToolbar/node1_base.dart'; +export '../StatelessWidget/CupertinoDialogAction/node1_base.dart'; +export '../StatelessWidget/DraggableScrollableActuator/node1_base.dart'; + +export '../StatelessWidget/CheckboxListTile/node1_base.dart'; +export '../StatelessWidget/CheckboxListTile/node2_select.dart'; +export '../StatelessWidget/CheckboxListTile/node3_dense.dart'; + +export '../StatelessWidget/Chip/node1_base.dart'; +export '../StatelessWidget/Chip/node2_color.dart'; +export '../StatelessWidget/Chip/node3_delete.dart'; + +export '../StatelessWidget/Container/node1_base.dart'; +export '../StatelessWidget/Container/node2_child.dart'; +export '../StatelessWidget/Container/node3_alignment.dart'; +export '../StatelessWidget/Container/node4_decoration.dart'; +export '../StatelessWidget/Container/node5_transform.dart'; +export '../StatelessWidget/Container/node6_constraints.dart'; +export '../StatelessWidget/MaterialBanner/node1_one_btn.dart'; +export '../StatelessWidget/MaterialBanner/node2_two_btn.dart'; +export '../StatelessWidget/SafeArea/node1_base.dart'; + +export '../StatelessWidget/Badge/node_1.dart'; +export '../StatelessWidget/Badge/node_2.dart'; +export '../StatelessWidget/Badge/node_3.dart'; + +export '../StatelessWidget/BackButtonIcon/node1_base.dart'; +export '../StatelessWidget/DrawerButtonIcon/node1_base.dart'; +export '../StatelessWidget/CloseButtonIcon/node1_base.dart'; +export '../StatelessWidget/EndDrawerButtonIcon/node1_base.dart'; + +export '../StatelessWidget/EndDrawerButton/node1_base.dart'; +export '../StatelessWidget/DrawerButton/node1_base.dart'; +export '../StatelessWidget/CloseButton/node1_base.dart'; +export '../StatelessWidget/BackButton/node1_base.dart'; + + +export '../StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart'; +export '../StatelessWidget/CupertinoPageTransition/node1_base.dart'; +export '../StatelessWidget/HtmlElementView/node1_base.dart'; + +export '../StatelessWidget/DataTable/node1_base.dart'; +export '../StatelessWidget/DataTable/node2_operation.dart'; +export '../StatelessWidget/OrientationBuilder/node1_base.dart'; +export '../StatelessWidget/Title/node1_base.dart'; +export '../StatelessWidget/TabPageSelector/node1_base.dart'; +export '../StatelessWidget/TabPageSelectorIndicator/node1_base.dart'; +export '../StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart'; + +export '../StatelessWidget/CupertinoTheme/node1_base.dart'; +export '../StatelessWidget/CupertinoTheme/node2_use.dart'; + +export '../StatelessWidget/CupertinoPopupSurface/node1_base.dart'; +export '../StatelessWidget/Divider/node1_base.dart'; +export '../StatelessWidget/Divider/node2_height.dart'; + +export '../StatelessWidget/ScrollView/node1_base.dart'; +export '../StatelessWidget/ModalBarrier/node1_base.dart'; +export '../StatelessWidget/BoxScrollView/node1_base.dart'; +export '../StatelessWidget/FloatingActionButton/node1_base.dart'; +export '../StatelessWidget/FloatingActionButton/node2_mini.dart'; +export '../StatelessWidget/FloatingActionButton/node3_shape.dart'; +export '../StatelessWidget/GestureDetector/node1_base.dart'; +export '../StatelessWidget/GestureDetector/node2_tap.dart'; +export '../StatelessWidget/GestureDetector/node3_pan.dart'; + +export '../StatelessWidget/Banner/node1_base.dart'; +export '../StatelessWidget/ImageIcon/node1_base.dart'; +export '../StatelessWidget/FadeInImage/node1_base.dart'; +export '../StatelessWidget/CircleAvatar/node1_base.dart'; + + +export '../StatelessWidget/InputChip/node1_base.dart'; +export '../StatelessWidget/InputChip/node2_select.dart'; + + +export '../StatelessWidget/Visibility/node1_base.dart'; +export '../StatelessWidget/Visibility/node2_replacement.dart'; + +export '../StatelessWidget/ChoiceChip/node1_base.dart'; + +export '../StatelessWidget/FilterChip/node1_base.dart'; + + +export '../StatelessWidget/ListTile/node1_base.dart'; +export '../StatelessWidget/ListTile/node2_select.dart'; +export '../StatelessWidget/ListTile/node3_dense.dart'; + + +export '../StatelessWidget/ListView/node1_base.dart'; +export '../StatelessWidget/ListView/node2_direction.dart'; +export '../StatelessWidget/ListView/node3_builder.dart'; +export '../StatelessWidget/ListView/node4_separated.dart'; + +export '../StatelessWidget/MaterialButton/node1_base.dart'; +export '../StatelessWidget/MaterialButton/node2_onLongPress.dart'; +export '../StatelessWidget/MaterialButton/node3_shape.dart'; + +export '../StatelessWidget/GridTileBar/node1_base.dart'; +export '../StatelessWidget/GridTile/node1_base.dart'; + +export '../StatelessWidget/Icon/node1_base.dart'; +export '../StatelessWidget/Icon/node2_diy.dart'; + +export '../StatelessWidget/Placeholder/node1_base.dart'; +export '../StatelessWidget/Placeholder/node2_fallback.dart'; + +export '../StatelessWidget/RadioListTile/node1_base.dart'; +export '../StatelessWidget/RadioListTile/node2_dense.dart' show DenseRadioListTile; + +export '../StatelessWidget/SingleChildScrollView/node1_base.dart'; +export '../StatelessWidget/SingleChildScrollView/node2_direction.dart'; + +export '../StatelessWidget/TabBar/node1_base.dart'; +export '../StatelessWidget/TabBar/node2_noShadow.dart'; + + + +export '../StatelessWidget/ButtonBar/node1_base.dart'; +export '../StatelessWidget/ButtonBar/node2_padding.dart'; + + +export '../StatelessWidget/FlatButton/node1_base.dart'; + +export '../StatelessWidget/FlutterLogo/node1_base.dart'; +export '../StatelessWidget/FlutterLogo/node2_style.dart'; + +export '../StatelessWidget/IconButton/node1_base.dart'; +export '../StatelessWidget/OutlineButton/node1_base.dart'; +export '../StatelessWidget/RaisedButton/node1_base.dart'; + +export '../StatelessWidget/Drawer/node1_base.dart'; +export '../StatelessWidget/DrawerHeader/node1_base.dart'; + +export '../StatelessWidget/UserAccountsDrawerHeader/node1_base.dart'; +export '../StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart'; + + +export '../StatelessWidget/VerticalDivider/node1_base.dart'; +export '../StatelessWidget/VerticalDivider/node2_height.dart'; + + +export '../StatelessWidget/GridView/node1_base.dart'; +export '../StatelessWidget/GridView/node2_direction.dart'; +export '../StatelessWidget/GridView/node3_extend.dart'; +export '../StatelessWidget/GridView/node4_builder.dart'; + +export '../StatelessWidget/GridPaper/node1_base.dart'; +export '../StatelessWidget/GridPaper/node2_divisions.dart'; + +export '../StatelessWidget/Spacer/node1_base.dart'; +export '../StatelessWidget/Spacer/node2_flex.dart'; + +export '../StatelessWidget/SwitchListTile/node1_base.dart'; +export '../StatelessWidget/SwitchListTile/node2_select.dart'; +export '../StatelessWidget/SwitchListTile/node3_dense.dart'; + +export '../StatelessWidget/Listener/node1_base.dart'; +export '../StatelessWidget/PositionedDirectional/node1_base.dart'; + +export '../StatelessWidget/Tab/node1_base.dart'; +export '../StatelessWidget/Theme/node1_base.dart'; +export '../StatelessWidget/Theme/node2_use.dart'; + +export '../StatelessWidget/ToggleButtons/node1_single.dart'; +export '../StatelessWidget/ToggleButtons/node2_color.dart'; +export '../StatelessWidget/ToggleButtons/node3_multi.dart'; + + +export '../StatelessWidget/BottomSheet/node1_base.dart'; +export '../StatelessWidget/CupertinoActionSheet/node1_base.dart'; +export '../StatelessWidget/CupertinoActionSheetAction/node1_base.dart'; +export '../StatelessWidget/CupertinoAlertDialog/node1_base.dart'; + +export '../StatelessWidget/Text/node1.dart'; +export '../StatelessWidget/Text/node2.dart'; +export '../StatelessWidget/Text/node3_decoration.dart'; +export '../StatelessWidget/Text/node4_textAlign.dart'; +export '../StatelessWidget/Text/node5_textDirection.dart'; +export '../StatelessWidget/Text/node6_softWrap.dart'; + + +export '../StatelessWidget/DayPicker/node1_base.dart'; +export '../StatelessWidget/Dialog/node1_base.dart'; + +export '../StatelessWidget/SimpleDialog/node1_base.dart'; +export '../StatelessWidget/SimpleDialogOption/node1_base.dart'; +export '../StatelessWidget/SnackBar/node1_base.dart'; +export '../StatelessWidget/SnackBarAction/node1_base.dart'; + +export '../StatelessWidget/PageStorage/node1_base.dart'; +export '../StatelessWidget/NotificationListener/node1_base.dart'; +export '../StatelessWidget/NotificationListener/node2_update.dart'; + +export '../StatelessWidget/Autocomplete/node1_base.dart'; +export '../StatelessWidget/Autocomplete/node2_type.dart'; +export '../StatelessWidget/RawMagnifier/node1_base.dart'; +export '../StatelessWidget/RawMagnifier/node2_shape.dart'; + + diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart new file mode 100644 index 00000000..a6929b0b --- /dev/null +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -0,0 +1,516 @@ +import 'package:flutter/cupertino.dart'; +import 'exp/Other.dart'; +import 'exp/ProxyWidget.dart'; +import 'exp/MultiChildRenderObjectWidget.dart'; +import 'exp/SingleChildRenderObjectWidget.dart'; +import 'exp/Sliver.dart'; +import 'exp/StatefulWidget.dart'; +import 'exp/StatelessWidget.dart'; + + +Widget mapNodeDisplay(int widgetId, int nodePriority) { + String name = '$widgetId#$nodePriority'; + + return switch (name) { + '96#0' => const ColumnNode1(), + '341#0' => const CustomMultiChildLayoutNode1(), + '94#0' => const FlexNode1(), + '94#1' => const FlexNode2(), + '94#2' => const FlexNode3(), + '94#3' => const FlexNode4(), + '94#4' => const FlexNode5(), + '99#0' => const FlowNode1(), + '99#1' => const FlowNode02(), + '161#0' => const IndexedStackNode01(), + '342#0' => const ListBodyDemo(), + '344#0' => const NestedScrollViewViewportDemo(), + '101#0' => const CustomRichText(), + '101#1' => const RichTextWithWidget(), + '95#0' => const CustomRow(), + '343#0' => const ShrinkWrappingViewportDemo(), + '97#0' => const CustomStack(), + '97#1' => const PositionedStack(), + '340#0' => const ViewportDemo(), + '98#0' => const DirectionWrap(), + '98#1' => const WrapAlignmentWrap(), + '98#2' => const CrossAxisAlignmentWrap(), + '98#3' => const TextDirectionWrap(), + '98#4' => const VerticalDirectionWrap(), + '197#0' => const ErrorWidgetDemo(), + '291#0' => const ListWheelViewportDemo(), + '291#1' => const ListWheelViewportDemo2(), + '291#2' => const ListWheelViewportDemo3(), + '291#3' => const ListWheelViewportDemo4(), + '312#0' => const PerformanceOverlayDemo(), + '313#0' => const RawImageDemo(), + '289#0' => const RenderObjectToWidgetAdapterDemo(), + '110#0' => const CustomTable(), + '338#0' => const ButtonBarThemeDemo(), + '326#0' => const ButtonThemeDemo(), + '328#0' => const ChipThemeDemo(), + '337#0' => const CupertinoUserInterfaceLevelDemo(), + '320#0' => const DefaultAssetBundleDemo(), + '324#0' => const DefaultTextStyleDemo(), + '319#0' => const DirectionalityDemo(), + '329#0' => const DividerThemeDemo(), + '181#0' => const CustomDropDownButtonHideUnderline(), + '106#0' => const CustomExpended(), + '109#0' => const CustomFlexible(), + '325#0' => const IconThemeDemo(), + '336#0' => const InheritedModelDemo(), + '345#0' => const InheritedThemeDemo(), + '346#0' => const InheritedWidgetDemo(), + '346#1' => const InheritedWidgetDemo2(), + '316#0' => const KeepAliveDemo(), + '315#0' => const LayoutIdDemo(), + '334#0' => const ListTileThemeDemo(), + '327#0' => const MaterialBannerThemeDemo(), + '167#0' => const CustomMediaQuery(), + '347#0' => const ParentDataWidgetDemo(), + '330#0' => const PopupMenuThemeDemo(), + '108#0' => const CustomPositioned(), + '335#0' => const PrimaryScrollControllerDemo(), + '180#0' => const CustomScrollConfiguration(), + '331#0' => const SliderThemeDemo(), + '331#1' => const DIYSliderTheme(), + '317#0' => const TableCellDemo(), + '332#0' => const ToggleButtonsThemeDemo(), + '333#0' => const TooltipThemeDemo(), + '295#0' => const CustomAbsorbPointer(), + '85#0' => const CustomAlign(), + '85#1' => const Ball(), + '201#0' => const CustomAnimatedSize(), + '288#0' => const AnnotatedRegionDemo(), + '77#0' => const CustomAspectRatio(), + '278#0' => const CustomBackdropFilter(), + '75#0' => const CustomBaseline(), + '283#0' => const CallbackShortcutsDemo1(), + '86#0' => const CustomCenter(), + '66#0' => const CustomClipOval(), + '69#0' => const CustomClipPath(), + '67#0' => const CustomClipRect(), + '68#0' => const CustomClipRRect(), + '267#0' => const ColoredBoxDemo(), + '88#0' => const CustomColorFiltered(), + '265#0' => const CompositedTransformFollowerDemo(), + '266#0' => const CompositedTransformTargetDemo(), + '80#0' => const CustomConstrainedBox(), + '299#0' => const CupertinoTextSelectionToolbarDemo(), + '166#0' => const ClockPage(), + '166#1' => const PlayBezier3Page(), + '285#0' => const CustomSingleChildLayoutDemo(), + '285#1' => const OffSetWidgetDemo(), + '70#0' => const BoxDecorationDemo(), + '70#1' => const ShapeImageDemo(), + '70#2' => const BorderDemo(), + '70#3' => const ShapeDecorationDemo(), + '70#4' => const UnderlineTabIndicatorDemo(), + '70#5' => const FlutterLogoDecorationDemo(), + '89#0' => const CustomFadeTransition(), + '87#0' => const CustomFittedBox(), + '82#0' => const CustomFractionallySizedBox(), + '263#0' => const FractionalTranslationDemo(), + '292#0' => const CustomIgnorePointer(), + '357#0' => const ImageFilteredBlur(), + '357#1' => const ImageFilteredColor(), + '357#2' => const ImageFilteredMatrix(), + '298#0' => const IntrinsicHeightDemo(), + '297#0' => const IntrinsicWidthDemo(), + '287#0' => const CustomLayoutBuilder(), + '287#1' => const FitByLayoutBuilder(), + '287#2' => const SimpleExpandableText(), + '79#0' => const CustomLimitedBox(), + '71#0' => const CustomOffstage(), + '73#0' => const CustomOpacity(), + '83#0' => const CustomOverflowBox(), + '74#0' => const PaddingAll(), + '74#1' => const PaddingOnly(), + '74#2' => const PaddingSymmetric(), + '296#0' => const PhysicalModelDemo(), + '279#0' => const PhysicalShapeDemo(), + '264#0' => const RepaintBoundaryDemo(), + '264#1' => const RepaintBoundarySave(), + '72#0' => const CustomRotatedBox(), + '277#0' => const RadialShaderMask(), + '277#1' => const LinearShaderMask(), + '294#0' => const SizeChangedLayoutNotifierDemo(), + '76#0' => const CustomSizedBox(), + '84#0' => const CustomSizedOverflowBox(), + '280#0' => const TapRegionDemo1(), + '281#0' => const TextFieldTapRegionDemo1(), + '78#0' => const SkewTransform(), + '78#1' => const TranslationTransform(), + '78#2' => const ScaleTransform(), + '78#3' => const RotateTransform(), + '78#4' => const R3C2(), + '81#0' => const CustomUnConstrainedBox(), + '302#0' => const CupertinoSliverNavigationBarDemo(), + '303#0' => const CupertinoSliverRefreshControlDemo(), + '183#0' => const CustomScrollViewDemo(), + '209#0' => const DecorationSliverDemo(), + '196#0' => const FlexibleSpaceBarDemo(), + '309#0' => const PinnedHeaderSliverNode1(), + '309#1' => const PinnedHeaderSliverNode2(), + '309#2' => const PinnedHeaderSliverNode3(), + '301#0' => const SliverAnimatedListDemo(), + '184#0' => const SliverAppBarDemo(), + '270#0' => const SliverConstrainedCrossAxisDemo(), + '271#0' => const SliverCrossAxisExpandedDemo(), + '269#0' => const SliverCrossAxisGroupDemo(), + '306#0' => const SliverFillRemainingDemo(), + '187#0' => const SliverFillViewportDemo(), + '186#0' => const SliverFixedExtentListDemo(), + '188#0' => const SliverGirdDemo(), + '305#0' => const SliverIgnorePointerDemo(), + '304#0' => const SliverLayoutBuilderDemo(), + '185#0' => const SliverListDemo(), + '268#0' => const SliverMainAxisGroupDemo(), + '192#0' => const SliverOpacityDemo(), + '307#0' => const SliverOverlapAbsorberDemo(), + '308#0' => const SliverOverlapInjectorDemo(), + '191#0' => const SliverPaddingDemo(), + '190#0' => const SliverPersistentHeaderDemo(), + '314#0' => const SliverPrototypeExtentListDemo(), + '189#0' => const SliverToBoxAdapterDemo(), + '348#0' => const SliverWithKeepAliveWidgetDemo(), + '111#0' => const CustomAlignTransition(), + '120#0' => const CustomAnimatedAlign(), + '228#0' => const AnimatedBuilderDemo(), + '123#0' => const CustomAnimatedContainer(), + '100#0' => const CustomAnimatedCrossFade(), + '100#1' => const CurveAnimatedCrossFade(), + '124#0' => const CustomAnimatedDefaultTextStyle(), + '260#0' => const AnimatedFractionallySizedBoxDemo(), + '117#0' => const CustomAnimatedList(), + '227#0' => const AnimatedModalBarrierDemo(), + '118#0' => const CustomAnimatedOpacity(), + '119#0' => const CustomAnimatedPadding(), + '225#0' => const AnimatedPhysicalModelDemo(), + '121#0' => const CustomAnimatedPositioned(), + '122#0' => const CustomAnimatedPositionedDirectional(), + '259#0' => const AnimatedRotationDemo(), + '249#0' => const AnimatedScaleDemo(), + '247#0' => const AnimatedSlideDemo(), + '116#0' => const CustomAnimatedSwitcher(), + '224#0' => const AnimatedThemeDemo(), + '57#0' => const CustomAppBar(), + '57#1' => const TabAppBar(), + '239#0' => const AutomaticKeepAliveDemo(), + '61#0' => const CustomBottomAppBar(), + '60#0' => const CustomBottomNavigationBar(), + '60#1' => const BottomNavigationBarWithPageView(), + '237#0' => const CarouselNode1(), + '237#1' => const CarouselNode2(), + '39#0' => const CustomCheckbox(), + '39#1' => const TristateCheckBok(), + '46#0' => const CustomCircularProgressIndicator(), + '48#0' => const CustomCupertinoActivityIndicator(), + '156#0' => const CustomCupertinoApp(), + '24#0' => const CustomCupertinoButton(), + '238#0' => const CupertinoCheckboxDemo1(), + '238#1' => const CupertinoCheckboxDemo2(), + '238#2' => const CupertinoCheckboxDemo3(), + '143#0' => const CustomCupertinoContextMenu(), + '144#0' => const CustomCupertinoContextMenuAction(), + '137#0' => const CustomCupertinoDatePicker(), + '62#0' => const CustomCupertinoNavigationBar(), + '157#0' => const CustomCupertinoPageScaffold(), + '139#0' => const CustomCupertinoPicker(), + '240#0' => const CupertinoRadioDemo1(), + '240#1' => const CupertinoRadioDemo2(), + '240#2' => const CupertinoRadioDemo3(), + '195#0' => const CustomCupertinoScrollbar(), + '262#0' => const CupertinoSegmentedControlDemo(), + '262#1' => const CupertinoSegmentedControlColor(), + '43#0' => const CustomCupertinoSlider(), + '256#0' => const CupertinoSlidingSegmentedControlDemo(), + '41#0' => const CustomCupertinoSwitch(), + '63#0' => const CustomCupertinoTabBar(), + '158#0' => const CustomCupertinoTabScaffold(), + '229#0' => const CupertinoTabViewDemo(), + '245#0' => const CupertinoTextFieldDemo(), + '245#1' => const CupertinoTextFieldStyle(), + '138#0' => const CustomCupertinoTimerPicker(), + '339#0' => const DateRangePickerDialogDemo(), + '339#1' => const DiyDateRangePickerDialogDemo(), + '113#0' => const CustomDecoratedBoxTransition(), + '230#0' => const DefaultTabControllerDemo(), + '114#0' => const CustomDefaultTextStyleTransition(), + '176#0' => const CustomDismissible(), + '176#1' => const DirectionDismissible(), + '103#0' => const CustomDraggable(), + '103#1' => const DraggablePage(), + '103#2' => const DeleteDraggable(), + '252#0' => const DraggableScrollableSheetDemo(), + '104#0' => const CustomDragTarget(), + '257#0' => const DrawerControllerDemo(), + '55#0' => const CustomDropDownButton(), + '55#1' => const StyleDropDownButton(), + '223#0' => const DropdownButtonFormFieldDemo(), + '370#0' => const DropdownMenuNode1(), + '370#1' => const DropdownMenuNode2(), + '370#2' => const DropdownMenuNode3(), + '244#0' => const EditableTextDemo(), + '354#0' => const ElevatedButtonDemo(), + '354#1' => const ElevatedButtonStyleDemo(), + '51#0' => const CustomExpandIcon(), + '178#0' => const CustomExpansionPanelList(), + '52#0' => const CustomExpansionTile(), + '359#0' => const FilledButtonDemo1(), + '359#1' => const FilledButtonDemo2(), + '282#0' => const FocusDemo1(), + '282#1' => const FocusDemo2(), + '282#2' => const FocusDemo3(), + '198#0' => const CustomForm(), + '222#0' => const FormFieldDemo(), + '172#0' => const CustomFutureBuilder(), + '250#0' => const GlowingOverscrollIndicatorDemo(), + '171#0' => const CustomHero(), + '38#0' => const LoadImage(), + '38#1' => const FitImage(), + '38#2' => const AlignmentImage(), + '38#3' => const BlendModeImage(), + '38#4' => const RepeatImage(), + '38#5' => const CenterSliceImage(), + '152#0' => const CustomInk(), + '152#1' => const InkImage(), + '149#0' => const CustomInkResponse(), + '149#1' => const ColorInkResponse(), + '150#0' => const CustomInkWell(), + '150#1' => const ColorInkWell(), + '231#0' => const InputDecoratorDemo(), + '351#0' => const InteractiveViewerDemo(), + '351#1' => const InteractiveViewerDemo2(), + '351#2' => const InteractiveViewerDemo3(), + '284#0' => const KeyboardListenerDemo1(), + '145#0' => const CustomLicensePage(), + '47#0' => const CustomLinearProgressIndicator(), + '179#0' => const CustomListWheelScrollView(), + '290#0' => const LocalizationsDemo1(), + '105#0' => const CustomLongPressDraggable(), + '160#0' => const CustomMaterial(), + '160#1' => const ShapeMaterial(), + '65#0' => const MaterialAppDemo(), + '261#0' => const MergeableMaterialDemo(), + '135#0' => const CustomMonthPicker(), + '293#0' => const MouseRegionDemo(), + '358#0' => const CustomNavigationRail(), + '358#1' => const ExtendableNavigationRail(), + '358#2' => const DarkNavigationRail(), + '232#0' => const NavigatorDemo(), + '251#0' => const NestedScrollViewDemo(), + '355#0' => const OutlinedButtonDemo(), + '355#1' => const OutlinedButtonStyleDemo(), + '182#0' => const CustomOverlay(), + '165#0' => const CustomPageView(), + '165#1' => const DirectionPageView(), + '165#2' => const CtrlPageView(), + '235#0' => const PaginatedDataTableDemo(), + '56#0' => const CustomPopupMenuButton(), + '174#0' => const CustomPopupMenuDivider(), + '93#0' => const CustomPositionedTransition(), + '45#0' => const CustomRadio(), + '44#0' => const CustomRangeSlider(), + '153#0' => const PressRawChip(), + '153#1' => const SelectRawChip(), + '248#0' => const RawGestureDetectorDemo(), + '254#0' => const RawKeyboardListenerDemo(), + '175#0' => const CustomRawMaterialButton(), + '175#1' => const ShapeRawMaterialButton(), + '49#0' => const CustomRefreshIndicator(), + '115#0' => const CustomRelativePositionedTransition(), + '177#0' => const CustomReorderableListView(), + '177#1' => const DirectionReorderableListView(), + '90#0' => const CustomRotationTransition(), + '64#0' => const CustomScaffold(), + '91#0' => const CustomScaleTransition(), + '253#0' => const ScrollableDemo(), + '194#0' => const CustomScrollbar(), + '53#0' => const CustomSelectableText(), + '53#1' => const AlignSelectableText(), + '92#0' => const CustomSizeTransition(), + '42#0' => const CustomSlider(), + '42#1' => const DivisionsSlider(), + '112#0' => const CustomSlideTransition(), + '242#0' => const StatefulBuilderDemo(), + '233#0' => const StatusTransitionWidgetDemo(), + '200#0' => const StepperDemo(), + '200#1' => const VerticalStepper(), + '173#0' => const CustomStreamBuilder(), + '40#0' => const CustomSwitch(), + '40#1' => const ImageSwitch(), + '59#0' => const CustomTabBarView(), + '151#0' => const CustomTableRowInkWell(), + '353#0' => const TextButtonDemo(), + '353#1' => const TextButtonStyleDemo(), + '54#0' => const CustomTextField(), + '54#1' => const CursorTextField(), + '54#2' => const ComplexTextField(), + '199#0' => const CustomTextFormField(), + '246#0' => const TickerModeDemo1(), + '50#0' => const CustomTooltip(), + '50#1' => const DecorationTooltip(), + '226#0' => const TweenAnimationBuilderDemo(), + '241#0' => const UndoHistoryDemo1(), + '243#0' => const UniqueWidgetDemo(), + '255#0' => const ValueListenableBuilderDemo(), + '234#0' => const WidgetInspectorDemo(), + '236#0' => const WidgetsAppDemo(), + '170#0' => const CustomWillPopScope(), + '136#0' => const CustomYearPicker(), + '130#0' => const CustomAboutDialog(), + '193#0' => const AboutListTileDemo(), + '13#0' => const CustomActionChip(), + '127#0' => const CustomAlertDialog(), + '125#0' => const CustomAnimatedIcon(), + '356#0' => const AutocompleteDemo(), + '356#1' => const AutocompleteType(), + '31#0' => const CustomBackButton(), + '272#0' => const BackButtonIconDemo(), + '258#0' => const BadgeDemo(), + '258#1' => const BadgeLabelDemo(), + '258#2' => const BadgeAlignOffsetDemo(), + '5#0' => const CustomBanner(), + '142#0' => const CustomBottomSheet(), + '350#0' => const BoxScrollViewDemo(), + '202#0' => const BuilderDemo(), + '29#0' => const CustomButtonBar(), + '29#1' => const PaddingButtonBar(), + '3#0' => const CustomCard(), + '3#1' => const ShapeCard(), + '17#0' => const CustomCheckBoxListTile(), + '17#1' => const SelectCheckBoxListTile(), + '17#2' => const DenseCheckBoxListTile(), + '215#0' => const CheckedModeBannerDemo(), + '11#0' => const CustomChip(), + '11#1' => const ColorOfChip(), + '11#2' => const DeleteOfChip(), + '12#0' => const CustomChoiceChip(), + '9#0' => const CustomCircleAvatar(), + '32#0' => const CustomCloseButton(), + '274#0' => const CloseButtonIconDemo(), + '1#0' => const CustomContainer(), + '1#1' => const ContainerWithChild(), + '1#2' => const ContainerAlignment(), + '1#3' => const ContainerDecoration(), + '1#4' => const ContainerTransform(), + '1#5' => const ContainerConstraints(), + '131#0' => const CustomCupertinoActionSheet(), + '132#0' => const CustomCupertinoActionSheetAction(), + '129#0' => const CustomCupertinoAlertDialog(), + '352#0' => const CupertinoDialogActionDemo(), + '219#0' => const CupertinoFullscreenDialogTransitionDemo(), + '218#0' => const CupertinoNavigationBarBackButtonDemo(), + '216#0' => const CupertinoPageTransitionDemo(), + '217#0' => const CupertinoPopupSurfaceDemo(), + '169#0' => const TextCupertinoTheme(), + '169#1' => const CustomCupertinoTheme(), + '102#0' => const CustomDataTable(), + '102#1' => const SortDataTable(), + '134#0' => const CustomDayPicker(), + '126#0' => const CustomDialog(), + '34#0' => const CustomDivider(), + '34#1' => const HeightDivider(), + '221#0' => const DraggableScrollableActuatorDemo(), + '154#0' => const CustomDrawer(), + '276#0' => const DrawerButtonDemo(), + '273#0' => const DrawerButtonIconDemo(), + '155#0' => const CustomDrawerHeader(), + '361#0' => const EndDrawerButtonDemo(), + '275#0' => const EndDrawerButtonIconDemo(), + '8#0' => const CustomFadeInImage(), + '15#0' => const CustomFilterChip(), + '25#0' => const CustomFlatButton(), + '28#0' => const CustomFAB(), + '28#1' => const MiniFAB(), + '28#2' => const ShapeFAB(), + '4#0' => const CustomFlutterLogo(), + '4#1' => const FlutterLogoWithText(), + '146#0' => const CustomGestureDetector(), + '146#1' => const TapGestureDetector(), + '146#2' => const PanGestureDetector(), + '37#0' => const CustomGridPaper(), + '37#1' => const DivisionsGridPaper(), + '21#0' => const CustomGridTile(), + '20#0' => const CustomGridTileBar(), + '163#0' => const CustomGridView(), + '163#1' => const HorizontalGridView(), + '163#2' => const ExtentGridView(), + '163#3' => const BuilderGridView(), + '213#0' => const HtmlElementViewDemo(), + '6#0' => const CustomIcon(), + '6#1' => const MyIcon(), + '30#0' => const CustomIconButton(), + '7#0' => const CustomImageIcon(), + '14#0' => const PressInputChip(), + '14#1' => const SelectInputChip(), + '147#0' => const CustomListener(), + '16#0' => const CustomListTile(), + '16#1' => const SelectListTile(), + '16#2' => const DenseListTile(), + '162#0' => const CustomListView(), + '162#1' => const HorizontalListView(), + '162#2' => const BuilderListView(), + '162#3' => const SeparatedListView(), + '211#0' => const MaterialBannerDemo(), + '211#1' => const MaterialBannerDemoTwo(), + '23#0' => const CustomMaterialButton(), + '23#1' => const LongPressMaterialButton(), + '23#2' => const ShapeMaterialButton(), + '212#0' => const ModalBarrierDemo(), + '214#0' => const NavigationToolbarDemo(), + '220#0' => const NotificationListenerDemo(), + '220#1' => const NotificationListenerUpdate(), + '203#0' => const OrientationBuilderDemo(), + '27#0' => const CustomOutlineButton(), + '210#0' => const PageStorageDemo(), + '36#0' => const CustomPlaceholder(), + '36#1' => const FallbackPlaceholder(), + '159#0' => const CustomPositionedDirectional(), + '204#0' => const CustomPreferredSize(), + '204#1' => const AdapterPreferredSize(), + '19#0' => const CustomRadioListTile(), + '19#1' => const DenseRadioListTile(), + '26#0' => const CustomRaisedButton(), + '360#0' => const MagnifierCircleShape(), + '360#1' => const MagnifierStarShape(), + '207#0' => const SafeAreaDemo(), + '349#0' => const ScrollViewDemo(), + '128#0' => const CustomSimpleDialog(), + '133#0' => const CustomSimpleDialogOption(), + '164#0' => const CustomSingleChildScrollView(), + '164#1' => const DirectionSingleChildScrollView(), + '140#0' => const CustomSnackBar(), + '141#0' => const CustomSnackBarAction(), + '107#0' => const OneSpacer(), + '107#1' => const ManySpacer(), + '18#0' => const CustomSwitchListTile(), + '18#1' => const SelectSwitchListTile(), + '18#2' => const DenseSwitchListTile(), + '148#0' => const CustomTab(), + '58#0' => const CustomTabBar(), + '58#1' => const NoShadowTabBarDemo(), + '205#0' => const TabPageSelectorDemo(), + '206#0' => const TabPageSelectorIndicatorDemo(), + '2#0' => const TextDemo1(), + '2#1' => const TextDemo2(), + '2#2' => const DecorationText(), + '2#3' => const TextAlignText(), + '2#4' => const TextDirectionText(), + '2#5' => const SoftWrapText(), + '168#0' => const TextThemeDemo(), + '168#1' => const CustomTheme(), + '208#0' => const TitleDemo(), + '33#0' => const CustomToggleButtons(), + '33#1' => const ColorToggleButtons(), + '33#2' => const ProToggleButtons(), + '22#0' => const CustomUAGHP(), + '22#1' => const ProUAGHP(), + '35#0' => const CustomVerticalDivider(), + '35#1' => const WidthVerticalDivider(), + '10#0' => const CustomVisibility(), + '10#1' => const ReplacementVisibility(), + + _ => const SizedBox(), + }; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/utils/color_utils.dart b/modules/widget_system/widgets/lib/utils/color_utils.dart new file mode 100644 index 00000000..e1a2b49e --- /dev/null +++ b/modules/widget_system/widgets/lib/utils/color_utils.dart @@ -0,0 +1,75 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class RandomProvider{ + RandomProvider._();//私有化构造 + static final _random= Random(); + static Random get random =>_random; +} + +class ColorUtils { + static Color randomColor({ + int limitA = 120, + int limitR = 0, + int limitG = 0, + int limitB = 0, + }) { + Random random = RandomProvider.random; + int a = limitA + random.nextInt(256 - limitA); //透明度值 + int r = limitR + random.nextInt(256 - limitR); //红值 + int g = limitG + random.nextInt(256 - limitG); //绿值 + int b = limitB + random.nextInt(256 - limitB); //蓝值 + return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 + } + + + /// 使用方法: + /// var color1=ColorUtils.parse("#33428A43"); + /// var color2=ColorUtils.parse("33428A43"); + /// var color3=ColorUtils.parse("#428A43"); + ///var color4=ColorUtils.parse("428A43"); + /// + static Color parse(String code) { + Color result =Colors.red; + int value = 0 ; + if (code.contains("#")) { + try { + value = int.parse(code.substring(1), radix: 16); + } catch (e) { + print(e); + } + switch (code.length) { + case 7://6位 + result = Color(value + 0xFF000000); + break; + case 9://8位 + result = Color(value); + break; + default: + result =Colors.red; + } + }else { + try { + value = int.parse(code, radix: 16); + } catch (e) { + print(e); + } + switch (code.length) { + case 6: + result = Color(value + 0xFF000000); + break; + case 8: + result = Color(value); + break; + default: + result =Colors.red; + } + } + return result; + } + + static String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} + diff --git a/packages/widgets/lib/utils/dialog_about.dart b/modules/widget_system/widgets/lib/utils/dialog_about.dart similarity index 76% rename from packages/widgets/lib/utils/dialog_about.dart rename to modules/widget_system/widgets/lib/utils/dialog_about.dart index 3cd5bd5e..81b3023e 100644 --- a/packages/widgets/lib/utils/dialog_about.dart +++ b/modules/widget_system/widgets/lib/utils/dialog_about.dart @@ -1,8 +1,8 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; class DialogAbout extends StatelessWidget { - const DialogAbout({Key? key}) : super(key: key); + const DialogAbout({super.key}); static show(BuildContext context){ showDialog(//内置方法,创建对话弹框 @@ -29,14 +29,10 @@ class DialogAbout extends StatelessWidget { ) ], ); - Widget content = Column( + Widget content = const Column( //内容 mainAxisSize: MainAxisSize.min, - children: const [ -// Image.asset( -// "assets/images/icon_flutter.png", -// width: 50, -// ), + children: [ FlutterLogo(size: 50,), SizedBox( height: 20, @@ -45,12 +41,11 @@ class DialogAbout extends StatelessWidget { "Flutter Unit ${StrUnit.version}", ), ]); - return AlertDialog(title: title, content: content, actions: [ - //左下角 + return AlertDialog(title: title, content: content, actions: const [ Padding( - padding: const EdgeInsets.only(right:15.0,bottom: 10,top: 10), + padding: EdgeInsets.only(right:15.0,bottom: 10,top: 10), child: Column( - children: const[ + children: [ Text( "Power By GF·J·Toly\n张风捷特烈", textAlign: TextAlign.center, diff --git a/lib/app/utils/pather.dart b/modules/widget_system/widgets/lib/utils/pather.dart similarity index 100% rename from lib/app/utils/pather.dart rename to modules/widget_system/widgets/lib/utils/pather.dart diff --git a/modules/widget_system/widgets/lib/widgets.dart b/modules/widget_system/widgets/lib/widgets.dart new file mode 100644 index 00000000..6454bac6 --- /dev/null +++ b/modules/widget_system/widgets/lib/widgets.dart @@ -0,0 +1,3 @@ +library widgets; + +export 'node_display_map.dart'; diff --git a/modules/widget_system/widgets/pubspec.yaml b/modules/widget_system/widgets/pubspec.yaml new file mode 100644 index 00000000..d1999a16 --- /dev/null +++ b/modules/widget_system/widgets/pubspec.yaml @@ -0,0 +1,50 @@ +name: widgets +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=1.17.0" +resolution: workspace +dependencies: + flutter: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/widgets/test/widgets_test.dart b/modules/widget_system/widgets/test/widgets_test.dart similarity index 100% rename from packages/widgets/test/widgets_test.dart rename to modules/widget_system/widgets/test/widgets_test.dart diff --git a/packages/app_config/lib/app/cons/cons.dart b/packages/app_config/lib/app/cons/cons.dart deleted file mode 100644 index f4d19b89..00000000 --- a/packages/app_config/lib/app/cons/cons.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../../model/app_style.dart'; -import '../res/toly_icon.dart'; - - -class Cons { - - static const menuInfo = ["关于", "帮助", "问题反馈"]; //菜单栏 - - 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 iconMap = { - //底栏图标 - "组件集录": TolyIcon.icon_layout, "收藏集录": TolyIcon.icon_star, - "绘制集录": Icons.palette, "布局集录": Icons.widgets, - "要点集录": TolyIcon.icon_bug, - }; - - static const List kFontFamilySupport = [ - 'local', - 'ComicNeue', - 'IndieFlower', - 'BalooBhai2', - 'Inconsolata', - 'Neucha' - ]; - - static const Map kWidgetFamilyLabelMap = { - WidgetFamily.statelessWidget: "Stateless", - WidgetFamily.statefulWidget: "Stateful", - WidgetFamily.singleChildRenderObjectWidget: "SingleChild", - WidgetFamily.multiChildRenderObjectWidget: "MultiChild", - WidgetFamily.sliver: "Sliver", - WidgetFamily.proxyWidget: "Proxy", - WidgetFamily.other: "Other", - }; - - 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 const Map kAppStyleStringMap = { - AppStyle.standard: "标准样式", - AppStyle.fancy: "华丽样式", - }; - - static final kThemeColorSupport = { - Colors.red: "毁灭之红", - Colors.orange: "愤怒之橙", - Colors.yellow: "警告之黄", - Colors.green: "伪装之绿", - Colors.blue: "冷漠之蓝", - Colors.indigo: "无限之靛", - Colors.purple: "神秘之紫", - - const 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/packages/app_config/lib/app/cons/path_unit.dart b/packages/app_config/lib/app/cons/path_unit.dart deleted file mode 100644 index 72237c13..00000000 --- a/packages/app_config/lib/app/cons/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'; - - static const login = '/login'; - -} \ No newline at end of file diff --git a/packages/app_config/lib/app/cons/str_unit.dart b/packages/app_config/lib/app/cons/str_unit.dart deleted file mode 100644 index 25686e49..00000000 --- a/packages/app_config/lib/app/cons/str_unit.dart +++ /dev/null @@ -1,42 +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/packages/app_config/lib/app/res/toly_icon.dart b/packages/app_config/lib/app/res/toly_icon.dart deleted file mode 100644 index 2edca70a..00000000 --- a/packages/app_config/lib/app/res/toly_icon.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/widgets.dart'; -// Power By 张风捷特烈--- Generated file. Do not edit. -// 欢迎支持: https://github.com/toly1994328/FlutterUnit -class TolyIcon { - TolyIcon._(); - static const IconData icon_fast = IconData( 0xe607, fontFamily: "TolyIcon"); -static const IconData icon_layout = IconData( 0xe85e, fontFamily: "TolyIcon"); -static const IconData upload_success = IconData( 0xe60b, fontFamily: "TolyIcon"); -static const IconData download = IconData( 0xea51, fontFamily: "TolyIcon"); -static const IconData upload = IconData( 0xea52, fontFamily: "TolyIcon"); -static const IconData error = IconData( 0xe614, fontFamily: "TolyIcon"); -static const IconData dingzhi1 = IconData( 0xe60e, fontFamily: "TolyIcon"); -static const IconData icon_collect = IconData( 0xe672, fontFamily: "TolyIcon"); -static const IconData yonghu = IconData( 0xe619, fontFamily: "TolyIcon"); -static const IconData icon_common = IconData( 0xe634, fontFamily: "TolyIcon"); -static const IconData icon_see = IconData( 0xe608, fontFamily: "TolyIcon"); -static const IconData icon_issues = IconData( 0xe7a7, fontFamily: "TolyIcon"); -static const IconData icon_fork = IconData( 0xe623, fontFamily: "TolyIcon"); -static const IconData icon_github_star = IconData( 0xe7df, fontFamily: "TolyIcon"); -static const IconData icon_show = IconData( 0xe648, fontFamily: "TolyIcon"); -static const IconData icon_hide = IconData( 0xe649, fontFamily: "TolyIcon"); -static const IconData icon_email = IconData( 0xe694, fontFamily: "TolyIcon"); -static const IconData icon_github = IconData( 0xe689, fontFamily: "TolyIcon"); -static const IconData icon_juejin = IconData( 0xe601, fontFamily: "TolyIcon"); -static const IconData icon_share = IconData( 0xe613, fontFamily: "TolyIcon"); -static const IconData icon_background = IconData( 0xe60a, fontFamily: "TolyIcon"); -static const IconData icon_code = IconData( 0xe70b, fontFamily: "TolyIcon"); -static const IconData icon_item = IconData( 0xe66f, fontFamily: "TolyIcon"); -static const IconData icon_kafei = IconData( 0xe6aa, fontFamily: "TolyIcon"); -static const IconData icon_tag = IconData( 0xe6e7, fontFamily: "TolyIcon"); -static const IconData icon_them = IconData( 0xe6c2, fontFamily: "TolyIcon"); -static const IconData icon_bug = IconData( 0xe7af, fontFamily: "TolyIcon"); -static const IconData icon_sound = IconData( 0xe606, fontFamily: "TolyIcon"); -static const IconData icon_search = IconData( 0xe604, fontFamily: "TolyIcon"); -static const IconData icon_star_ok = IconData( 0xe6ae, fontFamily: "TolyIcon"); -static const IconData icon_star = IconData( 0xe609, fontFamily: "TolyIcon"); -static const IconData icon_star_add = IconData( 0xe68e, fontFamily: "TolyIcon"); - -} diff --git a/packages/app_config/lib/app/router/router_utils.dart b/packages/app_config/lib/app/router/router_utils.dart deleted file mode 100644 index 7e842b68..00000000 --- a/packages/app_config/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: const Offset(1.0, 0.0), end: const 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: const Offset(-1.0, 0.0), end: const 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: const Offset(0.0,-1.0), end: const 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: const Offset(0.0, 1.0), end: const 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: const Duration(milliseconds: 0), - transitionsBuilder: - (context, animation, secondaryAnimation, child) => child); -} diff --git a/packages/app_config/lib/app/router/unit_router.dart b/packages/app_config/lib/app/router/unit_router.dart deleted file mode 100644 index 651ecd3b..00000000 --- a/packages/app_config/lib/app/router/unit_router.dart +++ /dev/null @@ -1,33 +0,0 @@ -// ignore_for_file: constant_identifier_names -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 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'; - -} diff --git a/packages/app_config/lib/app/style/behavior/no_scroll_behavior.dart b/packages/app_config/lib/app/style/behavior/no_scroll_behavior.dart deleted file mode 100644 index 84c41938..00000000 --- a/packages/app_config/lib/app/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/packages/app_config/lib/app/theme/app_theme.dart b/packages/app_config/lib/app/theme/app_theme.dart deleted file mode 100644 index d354ac39..00000000 --- a/packages/app_config/lib/app/theme/app_theme.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'dart:io'; - -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class AppTheme { - static ThemeData darkTheme(AppState state) => ThemeData( - fontFamily: state.fontFamily, - brightness: Brightness.dark, - primaryColor: const Color(0xff4699FB), - appBarTheme: const AppBarTheme(backgroundColor: Color(0xff222222)), - floatingActionButtonTheme: const FloatingActionButtonThemeData( - foregroundColor: Colors.white, - backgroundColor: Color(0xff4699FB) - ), - dividerColor: Colors.white, - // switchTheme: SwitchThemeData( - // // trackColor: '', - // ), - bottomNavigationBarTheme: const BottomNavigationBarThemeData( - backgroundColor: Color(0xff181818), - selectedItemColor: Color(0xff4699FB)), - scaffoldBackgroundColor: const Color(0xff010201)); - - static ThemeData lightTheme(AppState state) { - SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark - ); - - return ThemeData( - fontFamily: state.fontFamily, - primarySwatch: state.themeColor, - useMaterial3: Platform.isAndroid, // Android 使用 Material3 - chipTheme: ChipThemeData( - padding: EdgeInsets.symmetric(horizontal: 10) - // labelPadding: EdgeInsets.symmetric(horizontal: 6,vertical: 5) - ), - appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, - - ), - ); - } -} diff --git a/packages/app_config/lib/app_config.dart b/packages/app_config/lib/app_config.dart deleted file mode 100644 index 7afe3ef7..00000000 --- a/packages/app_config/lib/app_config.dart +++ /dev/null @@ -1,21 +0,0 @@ -library app_config; - -export 'bloc/global_bloc.dart'; -export 'model/global_state.dart'; -export 'model/app_style.dart'; -export 'repository/app_state_repository.dart'; -export 'app/cons/cons.dart'; -export 'app/cons/path_unit.dart'; -export 'app/cons/sp.dart'; -export 'app/cons/str_unit.dart'; -export 'app/router/router_utils.dart'; -export 'app/router/unit_router.dart'; -export 'app/res/toly_icon.dart'; -export 'app/theme/size_unit.dart'; -export 'app/theme/app_theme.dart'; -export 'app/style/unit_text_style.dart'; -export 'app/style/unit_color.dart'; -export 'app/style/gap.dart'; -export 'app/style/shape/coupon_shape_border.dart'; -export 'app/style/shape/techno_shape.dart'; -export 'app/style/behavior/no_scroll_behavior.dart'; \ No newline at end of file diff --git a/packages/app_config/lib/bloc/global_bloc.dart b/packages/app_config/lib/bloc/global_bloc.dart deleted file mode 100644 index d72ad307..00000000 --- a/packages/app_config/lib/bloc/global_bloc.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../model/app_style.dart'; -import '../repository/app_state_repository.dart'; -import '../model/global_state.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: 全局信息的bloc - -class AppBloc extends Cubit< AppState> { - - final AppStateRepository storage; - - AppBloc(this.storage) : super(const AppState()); - - // 程序初始化事件处理: 使用 AppStorage 进行初始化 - void initApp() async { - emit(await storage.initApp()); - } - - // 切换字体事件处理 : 固化索引 + 产出新状态 - void switchFontFamily(String family) async { - storage.saveFontFamily(family); - emit(state.copyWith(fontFamily: family)); - } - - // 切换主题色事件处理 : 固化索引 + 产出新状态 - void switchThemeColor(MaterialColor color) async { - storage.saveThemeColor(color); - emit(state.copyWith(themeColor: color)); - } - - // 切换背景显示事件处理 : 固化数据 + 产出新状态 - void switchShowBg(bool show) async { - storage.saveShowBg(show); - emit(state.copyWith(showBackGround: show)); - } - - // 切换背景显示事件处理 : 产出新状态 - void switchShowOver(bool show) async { - emit(state.copyWith(showPerformanceOverlay: show)); - } - - // 切换code样式事件处理 : 固化索引 + 产出新状态 - void switchCoderTheme(int codeStyleIndex) async { - storage.saveCoderTheme(codeStyleIndex); - emit(state.copyWith(codeStyleIndex: codeStyleIndex)); - } - - // 切换item样式事件处理 : 固化索引 + 产出新状态 - void changeItemStyle(int index) async { - storage.saveItemStyle(index); - emit(state.copyWith(itemStyleIndex: index)); - } - - void changeAppStyle(AppStyle style) async{ - storage.saveChangeAppStyle(style); - emit(state.copyWith(appStyle:style)); - - } - - void switchShowTool(bool show) async{ - storage.saveShowTool(show); - emit(state.copyWith(showOverlayTool: show)); - } -} diff --git a/packages/app_config/lib/bloc/update/bloc.dart b/packages/app_config/lib/bloc/update/bloc.dart deleted file mode 100644 index 5ee8657a..00000000 --- a/packages/app_config/lib/bloc/update/bloc.dart +++ /dev/null @@ -1,71 +0,0 @@ -// import 'dart:async'; -// -// import 'package:flutter_bloc/flutter_bloc.dart'; -// import 'package:flutter_unit/app/utils/http_utils/task_result.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// import 'package:package_info_plus/package_info_plus.dart'; -// import 'package:r_upgrade/r_upgrade.dart'; -// -// import 'event.dart'; -// import 'state.dart'; -// -// class UpdateBloc extends Bloc { -// UpdateBloc() : super(const NoUpdateState()) { -// on(_onCheckUpdate); -// on(_onResetNoUpdate); -// on(_onDownloadEvent); -// on(_onDownloadingEvent); -// } -// -// void _onCheckUpdate(CheckUpdate event, Emitter emit) async { -// emit(const CheckLoadingState()); -// // await Future.delayed(Duration(seconds: 1)); -// // 检测更新逻辑 -// ResultBean result = await AppInfoApi.getAppVersion(appName: event.appName); -// PackageInfo packageInfo = await PackageInfo.fromPlatform(); -// -// if (result.status && result.data != null) { -// if (packageInfo.version == result.data!.appVersion) { -// emit(NoUpdateState( -// isChecked: true, -// checkTime: DateTime.now().millisecondsSinceEpoch, -// )); -// } else { -// if (result.data != null) { -// emit(ShouldUpdateState( -// oldVersion: packageInfo.version, info: result.data!)); -// } -// } -// } else { -// emit(CheckErrorState(error: result.msg)); -// } -// } -// -// void _onResetNoUpdate(ResetNoUpdate event, Emitter emit) { -// emit(const NoUpdateState()); -// } -// -// late int? id; -// late StreamSubscription? subscription; -// -// void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ -// id = await RUpgrade.upgrade(event.appInfo.appUrl, -// fileName: '${event.appInfo.appName}.apk', isAutoRequestInstall: true); -// subscription = RUpgrade.stream.listen((DownloadInfo info) { -// double progress = (info.percent ?? 0) / 100; -// if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { -// progress = 1; -// subscription?.cancel(); -// add(const ResetNoUpdate()); -// } -// add(DownloadingEvent(state: DownloadingState( -// appSize: event.appInfo.appSize, -// progress: progress -// ))); -// }); -// } -// -// void _onDownloadingEvent(DownloadingEvent event, Emitter emit) { -// emit(event.state); -// } -// } diff --git a/packages/app_config/lib/bloc/update/event.dart b/packages/app_config/lib/bloc/update/event.dart deleted file mode 100644 index 0c75303c..00000000 --- a/packages/app_config/lib/bloc/update/event.dart +++ /dev/null @@ -1,44 +0,0 @@ -// import 'package:equatable/equatable.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// -// import 'state.dart'; -// -// abstract class UpdateEvent extends Equatable { -// const UpdateEvent(); -// } -// -// // 检查更新 ---> 校验,转换状态 -// class CheckUpdate extends UpdateEvent { -// final String appName; -// -// const CheckUpdate({required this.appName}); -// -// @override -// List get props => [appName]; -// } -// -// class DownloadEvent extends UpdateEvent { -// final AppInfo appInfo; -// -// const DownloadEvent({required this.appInfo}); -// -// @override -// List get props => [appInfo]; -// } -// -// class DownloadingEvent extends UpdateEvent { -// final DownloadingState state; -// -// const DownloadingEvent({required this.state}); -// -// @override -// List get props => [state]; -// } -// -// // 将状态重置为 NoUpdateState -// class ResetNoUpdate extends UpdateEvent { -// const ResetNoUpdate(); -// -// @override -// List get props => []; -// } diff --git a/packages/app_config/lib/bloc/update/state.dart b/packages/app_config/lib/bloc/update/state.dart deleted file mode 100644 index b4804d69..00000000 --- a/packages/app_config/lib/bloc/update/state.dart +++ /dev/null @@ -1,61 +0,0 @@ -// import 'package:equatable/equatable.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// -// abstract class UpdateState extends Equatable { -// const UpdateState(); -// } -// -// class NoUpdateState extends UpdateState { -// final bool isChecked; -// final int checkTime; -// -// const NoUpdateState({this.isChecked = false, this.checkTime = 0}); -// -// @override -// List get props => [isChecked, checkTime]; -// } -// -// class CheckLoadingState extends UpdateState { -// const CheckLoadingState(); -// @override -// List get props => []; -// } -// -// class DownloadingState extends UpdateState { -// final double progress; -// final int appSize; -// -// const DownloadingState({required this.progress, required this.appSize}); -// -// @override -// List get props => [progress, appSize]; -// } -// -// class CheckErrorState extends UpdateState { -// final String error; -// -// const CheckErrorState({required this.error}); -// -// @override -// List get props => [error]; -// -// @override -// String toString() { -// return 'CheckErrorState{error: $error}'; -// } -// } -// -// class ShouldUpdateState extends UpdateState { -// final String oldVersion; -// final AppInfo info; -// -// const ShouldUpdateState({required this.oldVersion, required this.info}); -// -// @override -// List get props => [oldVersion, info]; -// -// @override -// String toString() { -// return 'ShouldUpdateState{oldVersion: $oldVersion, info: $info}'; -// } -// } diff --git a/packages/app_config/lib/model/app_style.dart b/packages/app_config/lib/model/app_style.dart deleted file mode 100644 index 07ed452b..00000000 --- a/packages/app_config/lib/model/app_style.dart +++ /dev/null @@ -1,5 +0,0 @@ -enum AppStyle{ - standard, // 标准样式 - fancy, // 华丽样式 -} - diff --git a/packages/app_config/lib/model/global_state.dart b/packages/app_config/lib/model/global_state.dart deleted file mode 100644 index 47bb21ef..00000000 --- a/packages/app_config/lib/model/global_state.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -import 'app_style.dart'; - -/// create by 张风捷特烈 on 2020-04-11 -/// contact me by email 1981462002@qq.com -/// 说明: 全局状态类 -/// -class AppState 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; - - /// [showOverlayTool] 是否显示浮动工具 - final bool showOverlayTool; - - /// [appStyle] app 样式; - final AppStyle appStyle; - - const AppState({ - this.fontFamily = 'ComicNeue', - this.themeColor = Colors.blue, - this.appStyle = AppStyle.standard, - this.showBackGround = true, - this.codeStyleIndex = 0, - this.itemStyleIndex = 0, - this.showPerformanceOverlay = false, - this.showOverlayTool = true, - }); - - @override - List get props => - [ - fontFamily, - themeColor, - showBackGround, - codeStyleIndex, - itemStyleIndex, - appStyle, - showOverlayTool, - showPerformanceOverlay - ]; - - AppState copyWith({ - double? height, - String? fontFamily, - MaterialColor? themeColor, - bool? showBackGround, - int? codeStyleIndex, - int? itemStyleIndex, - bool? showPerformanceOverlay, - bool? initialized, - bool? showOverlayTool, - AppStyle? appStyle, - }) => - AppState( - fontFamily: fontFamily ?? this.fontFamily, - themeColor: themeColor ?? this.themeColor, - showBackGround: showBackGround ?? this.showBackGround, - codeStyleIndex: codeStyleIndex ?? this.codeStyleIndex, - showOverlayTool: showOverlayTool ?? this.showOverlayTool, - itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex, - appStyle: appStyle ?? this.appStyle, - showPerformanceOverlay: - showPerformanceOverlay ?? this.showPerformanceOverlay, - ); - - @override - String toString() { - return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; - } -} diff --git a/packages/app_config/lib/repository/app_state_repository.dart b/packages/app_config/lib/repository/app_state_repository.dart deleted file mode 100644 index 666be853..00000000 --- a/packages/app_config/lib/repository/app_state_repository.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:app_config/model/global_state.dart'; -import 'package:app_config/model/app_style.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:path/path.dart' as path; - -import '../app/cons/cons.dart'; -import '../app/cons/sp.dart'; - -class AppStateRepository{ - late SharedPreferences prefs; - - Future initApp() async{ - prefs = await SharedPreferences.getInstance(); - DbOpenHelper.setupDatabase(); - //数据库不存在,执行拷贝 - String databasesPath = await DbOpenHelper.getDbDirPath(); - String dbPath = path.join(databasesPath, "flutter.db"); - - bool shouldCopy = await _checkShouldCopy(dbPath,prefs); - - if (shouldCopy) { - await _doCopyAssetsDb(dbPath); - } else { - print("=====flutter.db 已存在===="); - } - - await LocalDb.instance.initDb(); - - bool showBg = prefs.getBool(SpKey.showBackground) ?? true; - bool showTool = prefs.getBool(SpKey.showTool) ?? true; - int themeIndex = prefs.getInt(SpKey.themeColorIndex) ?? 4; - int fontIndex = prefs.getInt(SpKey.fontFamily) ?? 1; - int codeIndex = prefs.getInt(SpKey.codeStyleIndex) ?? 0; - int itemStyleIndex = prefs.getInt(SpKey.itemStyleIndex) ?? 0; - int appStyleIndex = prefs.getInt(SpKey.appStyleIndex) ?? 0; - - return AppState( - showBackGround: showBg, - themeColor: Cons.kThemeColorSupport.keys.toList()[themeIndex], - fontFamily: Cons.kFontFamilySupport[fontIndex], - itemStyleIndex: itemStyleIndex, - appStyle: Cons.kAppStyleStringMap.keys.toList()[appStyleIndex], - showOverlayTool: showTool, - codeStyleIndex: codeIndex); - } - - Future _doCopyAssetsDb(String dbPath) async { - Directory dir = Directory(path.dirname(dbPath)); - if (!dir.existsSync()) { - await dir.create(recursive: true); - } - ByteData data = await rootBundle.load("assets/flutter.db"); - List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - await File(dbPath).writeAsBytes(bytes, flush: true); - - print("=====flutter.db==== assets ======拷贝完成===="); - } - - Future _checkShouldCopy(String dbPath,SharedPreferences prefs) async { - bool shouldCopy = false; - String versionStr = await rootBundle.loadString('assets/version.json'); - int dbVersion = await json.decode(versionStr)['dbVersion']; - int versionInSP = prefs.getInt(SpKey.dbVersionKey) ?? -1; - - // 版本升级,执行拷贝 - if (dbVersion > versionInSP) { - shouldCopy = true; - await prefs.setInt(SpKey.dbVersionKey,dbVersion); - } - - //非 release模式,执行拷贝 - const isPro = bool.fromEnvironment('dart.vm.product'); - if (!isPro) { - shouldCopy = true; - } - - //数据库不存在,执行拷贝 - if (!File(dbPath).existsSync()) { - shouldCopy = true; - } - - return shouldCopy; - } - - - Future saveFontFamily(String family) async { - int familyIndex = Cons.kFontFamilySupport.indexOf(family); - await prefs.setInt(SpKey.fontFamily, familyIndex); - } - - Future saveThemeColor(MaterialColor color) async { - int themeIndex = Cons.kThemeColorSupport.keys.toList().indexOf(color); - await prefs.setInt(SpKey.themeColorIndex, themeIndex); - } - - Future saveShowBg(bool show) async { - await prefs.setBool(SpKey.showBackground, show); - } - - Future saveCoderTheme(int index) async { - await prefs.setInt(SpKey.codeStyleIndex, index); - } - - Future saveItemStyle(int index) async { - await prefs.setInt(SpKey.itemStyleIndex, index); - } - - Future saveChangeAppStyle(AppStyle style) async { - await prefs.setInt(SpKey.appStyleIndex, style.index); - } - - Future saveShowTool(bool show) async { - await prefs.setBool(SpKey.showTool, show); - } -} \ No newline at end of file diff --git a/packages/app_config/pubspec.yaml b/packages/app_config/pubspec.yaml deleted file mode 100644 index f97920f4..00000000 --- a/packages/app_config/pubspec.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: app_config -description: A new Flutter package project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - equatable: ^2.0.3 # 相等辅助 - shared_preferences: ^2.0.13 # xml 固化 - widget_repository: - path: ../widget_repository - components: - path: ../components -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/app_update/lib/app_update.dart b/packages/app_update/lib/app_update.dart deleted file mode 100644 index 129f3ec6..00000000 --- a/packages/app_update/lib/app_update.dart +++ /dev/null @@ -1,8 +0,0 @@ -library app_update; - -export 'bloc/bloc.dart'; -export 'bloc/state.dart'; -export 'bloc/event.dart'; -export 'model/app_info.dart'; -export 'views/app_update_panel.dart'; -export 'views/update_red_point.dart'; \ No newline at end of file diff --git a/packages/app_update/lib/bloc/bloc.dart b/packages/app_update/lib/bloc/bloc.dart deleted file mode 100644 index a87deb22..00000000 --- a/packages/app_update/lib/bloc/bloc.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:r_upgrade/r_upgrade.dart'; -import 'package:utils/utils.dart'; - -import '../model/app_info.dart'; -import 'event.dart'; -import 'state.dart'; - -class UpdateBloc extends Bloc { - UpdateBloc() : super(const NoUpdateState()) { - on(_onCheckUpdate); - on(_onResetNoUpdate); - on(_onDownloadEvent); - on(_onDownloadingEvent); - } - - void _onCheckUpdate(CheckUpdate event, Emitter emit) async { - emit(const CheckLoadingState()); - // await Future.delayed(Duration(seconds: 1)); - // 检测更新逻辑 - TaskResult result = - await AppInfoApi.getAppVersion(appName: event.appName); - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - - if (result.success && result.data != null) { - if (packageInfo.version == result.data!.appVersion) { - emit(NoUpdateState( - isChecked: true, - checkTime: DateTime.now().millisecondsSinceEpoch, - )); - } else { - if (result.data != null) { - emit(ShouldUpdateState( - oldVersion: packageInfo.version, info: result.data!)); - } - } - } else { - emit(CheckErrorState(error: result.msg)); - } - } - - void _onResetNoUpdate(ResetNoUpdate event, Emitter emit) { - emit(const NoUpdateState()); - } - - late int? id; - late StreamSubscription? subscription; - - void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ - id = await RUpgrade.upgrade(event.appInfo.appUrl, - fileName: '${event.appInfo.appName}.apk', isAutoRequestInstall: true); - subscription = RUpgrade.stream.listen((DownloadInfo info) { - double progress = (info.percent ?? 0) / 100; - if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { - progress = 1; - subscription?.cancel(); - add(const ResetNoUpdate()); - } - add(DownloadingEvent(state: DownloadingState( - appSize: event.appInfo.appSize, - progress: progress - ))); - }); - } - - void _onDownloadingEvent(DownloadingEvent event, Emitter emit) { - emit(event.state); - } -} diff --git a/packages/app_update/lib/bloc/event.dart b/packages/app_update/lib/bloc/event.dart deleted file mode 100644 index 11154945..00000000 --- a/packages/app_update/lib/bloc/event.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:equatable/equatable.dart'; - - -import '../model/app_info.dart'; -import 'state.dart'; - -abstract class UpdateEvent extends Equatable { - const UpdateEvent(); -} - -// 检查更新 ---> 校验,转换状态 -class CheckUpdate extends UpdateEvent { - final String appName; - - const CheckUpdate({required this.appName}); - - @override - List get props => [appName]; -} - -class DownloadEvent extends UpdateEvent { - final AppInfo appInfo; - - const DownloadEvent({required this.appInfo}); - - @override - List get props => [appInfo]; -} - -class DownloadingEvent extends UpdateEvent { - final DownloadingState state; - - const DownloadingEvent({required this.state}); - - @override - List get props => [state]; -} - -// 将状态重置为 NoUpdateState -class ResetNoUpdate extends UpdateEvent { - const ResetNoUpdate(); - - @override - List get props => []; -} diff --git a/packages/app_update/lib/bloc/state.dart b/packages/app_update/lib/bloc/state.dart deleted file mode 100644 index eb3c78bb..00000000 --- a/packages/app_update/lib/bloc/state.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../model/app_info.dart'; - - -abstract class UpdateState extends Equatable { - const UpdateState(); -} - -class NoUpdateState extends UpdateState { - final bool isChecked; - final int checkTime; - - const NoUpdateState({this.isChecked = false, this.checkTime = 0}); - - @override - List get props => [isChecked, checkTime]; -} - -class CheckLoadingState extends UpdateState { - const CheckLoadingState(); - @override - List get props => []; -} - -class DownloadingState extends UpdateState { - final double progress; - final int appSize; - - const DownloadingState({required this.progress, required this.appSize}); - - @override - List get props => [progress, appSize]; -} - -class CheckErrorState extends UpdateState { - final String error; - - const CheckErrorState({required this.error}); - - @override - List get props => [error]; - - @override - String toString() { - return 'CheckErrorState{error: $error}'; - } -} - -class ShouldUpdateState extends UpdateState { - final String oldVersion; - final AppInfo info; - - const ShouldUpdateState({required this.oldVersion, required this.info}); - - @override - List get props => [oldVersion, info]; - - @override - String toString() { - return 'ShouldUpdateState{oldVersion: $oldVersion, info: $info}'; - } -} diff --git a/packages/app_update/lib/model/app_info.dart b/packages/app_update/lib/model/app_info.dart deleted file mode 100644 index 6856a271..00000000 --- a/packages/app_update/lib/model/app_info.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:equatable/equatable.dart'; -import 'package:utils/utils.dart'; - -class AppInfoApi { - static Future> getAppVersion( - {required String appName}) async { - String errorMsg = ""; - var result; - try { - result = - await HttpUtil.instance.client.get(PathUnit.appInfo + "/$appName"); - } catch (err) { - errorMsg = err.toString(); - } - - // 获取的数据非空且 status = true - if (result.data != null && result.data['status']) { - // 说明有数据 - if (result.data['data'] != null) { - return TaskResult.success( - data: AppInfo( - appName: result.data['data']['appName'], - appVersion: result.data['data']['appVersion'], - appUrl: result.data['data']['appUrl'], - appSize: result.data['data']['appSize'], - )); - } else { - return const TaskResult.success(data: null); - } - } - return TaskResult.error(msg: '请求错误: $errorMsg'); - } -} - -class AppInfo extends Equatable { - final String appName; - final String appVersion; - final String appUrl; - final int appSize; - - const AppInfo({ - required this.appName, - required this.appVersion, - required this.appUrl, - required this.appSize, - }); - - @override - List get props => [appName, appVersion, appUrl, appSize]; - - @override - String toString() { - return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; - } -} diff --git a/packages/app_update/lib/views/app_update_panel.dart b/packages/app_update/lib/views/app_update_panel.dart deleted file mode 100644 index ad9597f7..00000000 --- a/packages/app_update/lib/views/app_update_panel.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; - -import '../bloc/bloc.dart'; -import '../bloc/event.dart'; -import '../bloc/state.dart'; - -class AppUpdatePanel extends StatelessWidget { - const AppUpdatePanel({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocConsumer( - builder: _buildByUpdateState, - listener: _listenerByUpdateState, - ); - } - - Widget _buildProgress(BuildContext context, double progress, int appSize) { - return Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Column( - children: [ - Text( - '${(progress * 100).toStringAsFixed(2)} %', - style: const TextStyle(height: 1, fontSize: 12, color: Colors.grey), - ), - const SizedBox( - height: 5, - ), - Text( - '${convertFileSize((appSize * progress).floor())}/${convertFileSize(appSize)}', - style: const 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: progress, - ), - ) - ]); - } - - Widget _buildByUpdateState(BuildContext context, UpdateState state) { - String info = '检查新版本'; - Widget trail = const SizedBox.shrink(); - if (state is ShouldUpdateState) { - info = "下载新版本"; - trail = Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text( - '${state.oldVersion} --> ${state.info.appVersion} ', - style: const TextStyle(height: 1, fontSize: 12, color: Colors.grey), - ), - const SizedBox(width: 5), - const Icon(Icons.update, color: Colors.green) - ]); - } - if (state is CheckLoadingState) { - trail = const CupertinoActivityIndicator(); - } - if (state is DownloadingState) { - info = "新版本下载中..."; - trail = _buildProgress(context, state.progress, state.appSize); - } - - return ListTile( - title: Text( - info, - style: const TextStyle(fontSize: 13), - ), - trailing: trail, - onTap: () => _tapByState(state, context), - ); - } - - void _tapByState(UpdateState state, BuildContext context) { - if (state is NoUpdateState) { - BlocProvider.of(context) - .add(const CheckUpdate(appName: 'FlutterUnit')); - } - if (state is ShouldUpdateState) { - // 处理下载的事件 - BlocProvider.of(context) - .add(DownloadEvent(appInfo: state.info)); - } - } - - void _listenerByUpdateState(BuildContext context, UpdateState state) { - if (state is NoUpdateState) { - if (state.isChecked) { - Toast.success(context, '当前应用已是最新版本!'); - } - } - } - - String convertFileSize(int size){ - 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/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml deleted file mode 100644 index bb0f35ea..00000000 --- a/packages/app_update/pubspec.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: app_update -description: A new Flutter package project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.6 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - equatable: ^2.0.3 # 相等辅助 - flutter_bloc: ^8.0.1 # 状态管理 - shared_preferences: ^2.0.13 # xml 固化 - r_upgrade: ^0.3.8+2 # 应用升级 - package_info_plus: ^1.3.0 # 应用包信息 - utils: - path: ../utils - app_config: - path: ../app_config -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/app_update/test/app_update_test.dart b/packages/app_update/test/app_update_test.dart deleted file mode 100644 index e68d1c97..00000000 --- a/packages/app_update/test/app_update_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -// import 'package:flutter_test/flutter_test.dart'; -// -// import 'package:app_update/app_update.dart'; -// -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } diff --git a/packages/authentication/lib/blocs/authentic/bloc.dart b/packages/authentication/lib/blocs/authentic/bloc.dart deleted file mode 100644 index bee1f551..00000000 --- a/packages/authentication/lib/blocs/authentic/bloc.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:app_config/app_config.dart'; -import 'package:authentication/authentication.dart'; -import 'package:authentication/models/user.dart'; -import 'package:bloc/bloc.dart'; - -import 'package:jwt_decoder/jwt_decoder.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:utils/utils.dart'; - -import 'event.dart'; -import 'state.dart'; - -class AuthBloc extends Bloc { - - final AuthRepository repository; - - AuthBloc({required this.repository}) : super(AuthInitial()){ - on(_onAppStarted); - on(_onAuthByPassword); - } - - void _onAppStarted(AuthEvent event, Emitter emit) async{ - SharedPreferences sp = await SharedPreferences.getInstance(); - - if (event is AppStarted) { - String? token = sp.getString(SpKey.tokenKey); - String? userJson = sp.getString(SpKey.userKey); - if (token != null && userJson != null) { - bool disable = JwtDecoder.isExpired(token); - if (!disable) { - HttpUtil.instance.setToken(token); - emit(AuthSuccess(User.fromJson(json.decode(userJson)))); - }else{ - // 说明 token 过期 - await _removeToken(sp); - await _removeUser(sp); - } - } - } - - if (event is LoggedOut) { - - } - } - - // 持久化 token - Future _persistToken(String token,SharedPreferences sp) async { - await sp.setString(SpKey.tokenKey, token); - } - - - // 持久化 token - Future _removeToken(SharedPreferences sp) async { - await sp.remove(SpKey.tokenKey); - } - - // 持久化 token - Future _removeUser(SharedPreferences sp) async { - await sp.remove(SpKey.userKey); - } - - // 持久化 user - Future _persistUser(User user,SharedPreferences sp) async { - await sp.setString(SpKey.userKey, json.encode(user)); - } - - - - FutureOr _onAuthByPassword(AuthByPassword event, Emitter emit) async{ - emit (AuthLoading()); - await Future.delayed(const Duration(milliseconds: 500)); - TaskResult result = await repository.login(username: event.username, password: event.password); - - if (result.success&& result.data!=null) { - // 登录成功 - SharedPreferences sp = await SharedPreferences.getInstance(); - HttpUtil.instance.setToken(result.msg); - await _persistToken(result.msg,sp); - await _persistUser(result.data!,sp); - emit (AuthSuccess(result.data!)); - } else { - emit (const AuthFailure('用户名和密码不匹配')); - } - } -} diff --git a/packages/authentication/lib/blocs/authentic/event.dart b/packages/authentication/lib/blocs/authentic/event.dart deleted file mode 100644 index 496b0897..00000000 --- a/packages/authentication/lib/blocs/authentic/event.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:equatable/equatable.dart'; - - - -///********************************验证行为******************************** - -abstract class AuthEvent extends Equatable { - const AuthEvent(); - - @override - List get props => []; -} - -class AppStarted extends AuthEvent { - const AppStarted(); -} - -// 发送 邮箱验证 -class AuthByPassword extends AuthEvent { - final String username; - final String password; - - const AuthByPassword({required this.username,required this.password}); - - @override - List get props => [username,password]; -} - - -class LoggedOut extends AuthEvent { - - final bool clearUser; - final bool tokenDisable; - - const LoggedOut({this.clearUser=true,this.tokenDisable=false}); -} - -class TokenDisabled extends AuthEvent { - - const TokenDisabled(); -} \ No newline at end of file diff --git a/packages/authentication/lib/blocs/authentic/state.dart b/packages/authentication/lib/blocs/authentic/state.dart deleted file mode 100644 index 44d18ba1..00000000 --- a/packages/authentication/lib/blocs/authentic/state.dart +++ /dev/null @@ -1,46 +0,0 @@ - -import 'package:authentication/models/user.dart'; -import 'package:equatable/equatable.dart'; - -///********************************校验状态******************************** -// -abstract class AuthState extends Equatable { - const AuthState(); - @override - List get props => []; -} - -class AuthInitial extends AuthState { - -} - - -class AuthFailure extends AuthState { - final String error; - - const AuthFailure(this.error); - - @override - List get props => [error]; - - @override - String toString() { - return 'AuthFailure{message: $error}'; - } -} - - -class LogOuted extends AuthState {} - -class AuthSuccess extends AuthState { - final User user; - - const AuthSuccess(this.user); - - @override - String toString() { - return 'AuthSuccess{loginResult: $user}'; - } -} - -class AuthLoading extends AuthState {} \ No newline at end of file diff --git a/packages/authentication/lib/blocs/register/bloc.dart b/packages/authentication/lib/blocs/register/bloc.dart deleted file mode 100644 index 46f2b4fa..00000000 --- a/packages/authentication/lib/blocs/register/bloc.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:authentication/authentication.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; - -import 'event.dart'; -import 'state.dart'; - -/// create by 张风捷特烈 on 2021/1/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -class RegisterBloc extends Bloc { - final AuthRepository repository; - - RegisterBloc({required this.repository}) : super(RegisterNone()){ - on(_onRegisterEvent); - } - - void _onRegisterEvent(RegisterEvent event,Emitter emit) async { - if (event is DoRegister) { - emit( RegisterLoading()); - TaskResult result = - await repository.register(email: event.email, code: event.code); - - if(result.data == null){ - emit(const RegisterError('注册失败')); - }else{ - if (result.data!=null&&result.data!) { - // 注册成功 - emit( RegisterSuccess(event.email)); - }else{ - emit( RegisterError(result.msg)); - } - } - } - } -} diff --git a/packages/authentication/lib/blocs/register/event.dart b/packages/authentication/lib/blocs/register/event.dart deleted file mode 100644 index 00ce8826..00000000 --- a/packages/authentication/lib/blocs/register/event.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class RegisterEvent extends Equatable { - const RegisterEvent(); - - @override - List get props => []; -} - -// 发送 邮箱验证 -class DoRegister extends RegisterEvent { - final String email; - final String code; - - const DoRegister(this.email, this.code); -} diff --git a/packages/authentication/lib/blocs/register/state.dart b/packages/authentication/lib/blocs/register/state.dart deleted file mode 100644 index bd1342c4..00000000 --- a/packages/authentication/lib/blocs/register/state.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 主页 Widget 列表 状态类 - -abstract class RegisterState extends Equatable { - const RegisterState(); - - @override - List get props => []; -} - -class RegisterLoading extends RegisterState { - @override - List get props => []; -} - -class RegisterNone extends RegisterState { - @override - List get props => []; -} - - -class RegisterError extends RegisterState { - final String message; - - const RegisterError(this.message); - - @override - List get props => [message]; - - @override - String toString() { - return 'RegisterError{message: $message}'; - } -} - -class RegisterSuccess extends RegisterState { - final String username; - - const RegisterSuccess(this.username); - - @override - List get props => [username]; -} diff --git a/packages/authentication/lib/repository/impl/http_auth_repository.dart b/packages/authentication/lib/repository/impl/http_auth_repository.dart deleted file mode 100644 index af86eae9..00000000 --- a/packages/authentication/lib/repository/impl/http_auth_repository.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:authentication/models/user.dart'; - -import 'package:utils/src/http_utils/task_result.dart'; -import 'package:utils/utils.dart'; - -import '../auth_repository.dart'; - -const String kSendEmail = '/sendEmail/'; -const String kLogin = '/login'; -const String kRegister = '/register'; - -class HttpAuthRepository implements AuthRepository { - @override - Future> login({ - required String username, - required String password, - }) async { - String errorMsg = ""; - - var result = await HttpUtil.instance.client.post( - kLogin, - data: { - "username": username, - "password": password, - }, - ).catchError((err) { - errorMsg = err.toString(); - }); - - if (result.data != null) { - if (result.data['status']) { - return TaskResult( - msg: result.data['msg'], - data: User.fromJson(result.data['data']), - success: result.data['status'], - ); - } else { - return TaskResult( - msg: result.data['msg'], - data: null, - success: false, - ); - } - } - - return TaskResult.error(msg: '请求错误: $errorMsg'); - } - - @override - Future> register({ - required String email, - required String code, - }) async { - String errorMsg = ""; - - var result = await HttpUtil.instance.client.post(kRegister, - data: {"email": email, "activeCode": code}).catchError((err) { - errorMsg = err.toString(); - }); - - if (result.data != null) { - return TaskResult.success(data: result.data); - } - - return TaskResult.error(msg: '请求错误: $errorMsg'); - } - - @override - Future> sendEmail({required String email}) async { - var result = await HttpUtil.instance.client.post(kSendEmail + email); - if (result.data != null) { - return TaskResult.success(data: result.data); - } - return const TaskResult.error(msg: '请求错误'); - } -} diff --git a/packages/authentication/lib/views/mobile/login/login_page.dart b/packages/authentication/lib/views/mobile/login/login_page.dart deleted file mode 100644 index 39bc3c40..00000000 --- a/packages/authentication/lib/views/mobile/login/login_page.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../register/arc_clipper.dart'; -import 'login_form.dart'; - -/// create by 张风捷特烈 on 2020/4/24 -/// contact me by email 1981462002@qq.com -/// 说明: - -class AuthenticScope extends StatelessWidget { - const AuthenticScope({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final AuthRepository repository = context.read().repository; - return MultiBlocProvider(providers: [ - BlocProvider(create: (_) => RegisterBloc(repository: repository)), - ], child: const LoginPage()); - } -} - -class LoginPage extends StatelessWidget { - const LoginPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Size winSize = MediaQuery.of(context).size; - - return Scaffold( - body: SingleChildScrollView( - child: Wrap(children: [ - Stack(children: [ - UnitArcBackground(height: winSize.height * 0.32), - const Positioned(top: 20, child: BackButton(color: Colors.white)), - ]), - Container( - // color: Colors.green, - height: winSize.height * 0.68, - width: MediaQuery.of(context).size.width, - padding: const EdgeInsets.only(left: 20.0, right: 20, top: 20), - child: Stack( - alignment: Alignment.center, - children: const [ - LoginFrom(), - ], - )) - ]), - )); - } -} diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart deleted file mode 100644 index 5c269e9b..00000000 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:app_update/views/update_red_point.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -class MePageItem extends StatelessWidget { - final Color color; - - const MePageItem({Key? key, this.color = Colors.white}) : super(key: key); - - @override - Widget build(BuildContext context) { - return _buildChild(context); - } - - Widget _buildChild(BuildContext context) { - return ScrollConfiguration( - behavior: NoScrollBehavior(), - child: ListView( - padding: EdgeInsets.zero, - children: [ - const SizedBox( - height: 10, - ), - Gap.sfl10, - _buildItem(context, TolyIcon.icon_them, '应用设置', UnitRouter.setting), - _buildItem( - context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), - _buildItem( - context, TolyIcon.icon_collect, '我的收藏', UnitRouter.collect), - Gap.sfl10, - const Divider(height: 1), - Stack( - children: [ - _buildItem( - context, - Icons.update, - '版本信息', - UnitRouter.version_info, - ), - const Positioned(left: 40, top: 10, child: UpdateRedPoint()) - ], - ), - _buildItem(context, Icons.info, '关于应用', UnitRouter.about_app), - const Divider( - height: 1, - ), - Gap.sfl10, - _buildItem(context, TolyIcon.icon_kafei, '联系本王', UnitRouter.about_me), - ], - ), - ); - } - - Widget _buildItem( - BuildContext context, IconData icon, String title, String linkTo, - {VoidCallback? onTap}) => - ListTile( - leading: Icon( - icon, - color: Theme.of(context).primaryColor, - ), - title: Text(title, style: const TextStyle(fontSize: 16)), - trailing: - Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), - onTap: () { - if (linkTo.isNotEmpty) { - Navigator.of(context).pushNamed(linkTo); - if (onTap != null) onTap(); - } - }, - ); -} diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml deleted file mode 100644 index 22d2ed09..00000000 --- a/packages/authentication/pubspec.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: authentication -description: A new Flutter package project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - equatable: ^2.0.3 # 相等辅助 - flutter_bloc: ^8.0.1 # 状态管理 - shared_preferences: ^2.0.13 # xml 固化 - utils: - path: ../utils - app_update: - path: ../app_update - app_config: - path: ../app_config -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/components/lib/components.dart b/packages/components/lib/components.dart deleted file mode 100644 index 5fba8b54..00000000 --- a/packages/components/lib/components.dart +++ /dev/null @@ -1,5 +0,0 @@ -library components; - -export 'flutter_ui/flutter_ui.dart'; -export 'project_ui/project_ui.dart'; -export 'toly_ui/toly_ui.dart'; \ No newline at end of file diff --git a/packages/components/lib/flutter_ui/toly_date_picker.dart b/packages/components/lib/flutter_ui/toly_date_picker.dart deleted file mode 100644 index fd3dfd2d..00000000 --- a/packages/components/lib/flutter_ui/toly_date_picker.dart +++ /dev/null @@ -1,2910 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:math' as math; - -import 'package:flutter/gestures.dart' show DragStartBehavior; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; - -const Size _calendarPortraitDialogSize = Size(330.0, 518.0); -const Size _calendarLandscapeDialogSize = Size(496.0, 346.0); -const Size _inputPortraitDialogSize = Size(330.0, 270.0); -const Size _inputLandscapeDialogSize = Size(496, 160.0); -const Size _inputRangeLandscapeDialogSize = Size(496, 164.0); -const Duration _dialogSizeAnimationDuration = Duration(milliseconds: 200); -const double _inputFormPortraitHeight = 98.0; -const double _inputFormLandscapeHeight = 108.0; - -/// Shows a dialog containing a Material Design date picker. -/// -/// The returned [Future] resolves to the date selected by the user when the -/// user confirms the dialog. If the user cancels the dialog, null is returned. -/// -/// When the date picker is first displayed, it will show the month of -/// [initialDate], with [initialDate] selected. -/// -/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest -/// allowable date. [initialDate] must either fall between these dates, -/// or be equal to one of them. For each of these [DateTime] parameters, only -/// their dates are considered. Their time fields are ignored. They must all -/// be non-null. -/// -/// The [currentDate] represents the current day (i.e. today). This -/// date will be highlighted in the day grid. If null, the date of -/// `DateTime.now()` will be used. -/// -/// An optional [initialEntryMode] argument can be used to display the date -/// picker in the [DatePickerEntryMode.calendar] (a calendar month grid) -/// or [DatePickerEntryMode.input] (a text input field) mode. -/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. -/// -/// An optional [selectableDayPredicate] function can be passed in to only allow -/// certain days for selection. If provided, only the days that -/// [selectableDayPredicate] returns true for will be selectable. For example, -/// this can be used to only allow weekdays for selection. If provided, it must -/// return true for [initialDate]. -/// -/// The following optional string parameters allow you to override the default -/// text used for various parts of the dialog: -/// -/// * [helpText], label displayed at the top of the dialog. -/// * [cancelText], label on the cancel button. -/// * [confirmText], label on the ok button. -/// * [errorFormatText], message used when the input text isn't in a proper date format. -/// * [errorInvalidText], message used when the input text isn't a selectable date. -/// * [fieldHintText], text used to prompt the user when no text has been entered in the field. -/// * [fieldLabelText], label for the date text input field. -/// -/// An optional [locale] argument can be used to set the locale for the date -/// picker. It defaults to the ambient locale provided by [Localizations]. -/// -/// An optional [textDirection] argument can be used to set the text direction -/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It -/// defaults to the ambient text direction provided by [Directionality]. If both -/// [locale] and [textDirection] are non-null, [textDirection] overrides the -/// direction chosen for the [locale]. -/// -/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to -/// [showDialog], the documentation for which discusses how it is used. [context] -/// and [useRootNavigator] must be non-null. -/// -/// The [builder] parameter can be used to wrap the dialog widget -/// to add inherited widgets like [Theme]. -/// -/// An optional [initialDatePickerMode] argument can be used to have the -/// calendar date picker initially appear in the [DatePickerMode.year] or -/// [DatePickerMode.day] mode. It defaults to [DatePickerMode.day], and -/// must be non-null. -/// -/// {@macro flutter.widgets.RawDialogRoute} -/// -/// ### State Restoration -/// -/// Using this method will not enable state restoration for the date picker. -/// In order to enable state restoration for a date picker, use -/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with -/// [DatePickerDialog]. -/// -/// For more information about state restoration, see [RestorationManager]. -/// -/// {@macro flutter.widgets.RestorationManager} -/// -/// {@tool dartpad} -/// This sample demonstrates how to create a restorable Material date picker. -/// This is accomplished by enabling state restoration by specifying -/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to -/// push [DatePickerDialog] when the button is tapped. -/// -/// ** See code in examples/api/lib/material/date_picker/show_date_picker.0.dart ** -/// {@end-tool} -/// -/// See also: -/// -/// * [showDateRangePicker], which shows a Material Design date range picker -/// used to select a range of dates. -/// * [CalendarDatePicker], which provides the calendar grid used by the date picker dialog. -/// * [InputDatePickerFormField], which provides a text input field for entering dates. -/// * [DisplayFeatureSubScreen], which documents the specifics of how -/// [DisplayFeature]s can split the screen into sub-screens. -/// * [showTimePicker], which shows a dialog that contains a Material Design time picker. -/// -Future showDatePicker({ - required BuildContext context, - required DateTime initialDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, - SelectableDayPredicate? selectableDayPredicate, - String? helpText, - String? cancelText, - String? confirmText, - Locale? locale, - bool useRootNavigator = true, - RouteSettings? routeSettings, - TextDirection? textDirection, - TransitionBuilder? builder, - DatePickerMode initialDatePickerMode = DatePickerMode.day, - String? errorFormatText, - String? errorInvalidText, - String? fieldHintText, - String? fieldLabelText, - TextInputType? keyboardType, - Offset? anchorPoint, -}) async { - assert(context != null); - assert(initialDate != null); - assert(firstDate != null); - assert(lastDate != null); - initialDate = DateUtils.dateOnly(initialDate); - firstDate = DateUtils.dateOnly(firstDate); - lastDate = DateUtils.dateOnly(lastDate); - assert( - !lastDate.isBefore(firstDate), - 'lastDate $lastDate must be on or after firstDate $firstDate.', - ); - assert( - !initialDate.isBefore(firstDate), - 'initialDate $initialDate must be on or after firstDate $firstDate.', - ); - assert( - !initialDate.isAfter(lastDate), - 'initialDate $initialDate must be on or before lastDate $lastDate.', - ); - assert( - selectableDayPredicate == null || selectableDayPredicate(initialDate), - 'Provided initialDate $initialDate must satisfy provided selectableDayPredicate.', - ); - assert(initialEntryMode != null); - assert(useRootNavigator != null); - assert(initialDatePickerMode != null); - assert(debugCheckHasMaterialLocalizations(context)); - - Widget dialog = DatePickerDialog( - initialDate: initialDate, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - initialEntryMode: initialEntryMode, - selectableDayPredicate: selectableDayPredicate, - helpText: helpText, - cancelText: cancelText, - confirmText: confirmText, - initialCalendarMode: initialDatePickerMode, - errorFormatText: errorFormatText, - errorInvalidText: errorInvalidText, - fieldHintText: fieldHintText, - fieldLabelText: fieldLabelText, - keyboardType: keyboardType, - ); - - if (textDirection != null) { - dialog = Directionality( - textDirection: textDirection, - child: dialog, - ); - } - - if (locale != null) { - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); - } - - return showDialog( - context: context, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - builder: (BuildContext context) { - return builder == null ? dialog : builder(context, dialog); - }, - anchorPoint: anchorPoint, - ); -} - -/// A Material-style date picker dialog. -/// -/// It is used internally by [showDatePicker] or can be directly pushed -/// onto the [Navigator] stack to enable state restoration. See -/// [showDatePicker] for a state restoration app example. -/// -/// See also: -/// -/// * [showDatePicker], which is a way to display the date picker. -class DatePickerDialog extends StatefulWidget { - /// A Material-style date picker dialog. - DatePickerDialog({ - super.key, - required DateTime initialDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - this.initialEntryMode = DatePickerEntryMode.calendar, - this.selectableDayPredicate, - this.cancelText, - this.confirmText, - this.helpText, - this.initialCalendarMode = DatePickerMode.day, - this.errorFormatText, - this.errorInvalidText, - this.fieldHintText, - this.fieldLabelText, - this.keyboardType, - this.restorationId, - }) : assert(initialDate != null), - assert(firstDate != null), - assert(lastDate != null), - initialDate = DateUtils.dateOnly(initialDate), - firstDate = DateUtils.dateOnly(firstDate), - lastDate = DateUtils.dateOnly(lastDate), - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()), - assert(initialEntryMode != null), - assert(initialCalendarMode != null) { - assert( - !this.lastDate.isBefore(this.firstDate), - 'lastDate ${this.lastDate} must be on or after firstDate ${this.firstDate}.', - ); - assert( - !this.initialDate.isBefore(this.firstDate), - 'initialDate ${this.initialDate} must be on or after firstDate ${this.firstDate}.', - ); - assert( - !this.initialDate.isAfter(this.lastDate), - 'initialDate ${this.initialDate} must be on or before lastDate ${this.lastDate}.', - ); - assert( - selectableDayPredicate == null || selectableDayPredicate!(this.initialDate), - 'Provided initialDate ${this.initialDate} must satisfy provided selectableDayPredicate', - ); - } - - /// The initially selected [DateTime] that the picker should display. - final DateTime initialDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// The [DateTime] representing today. It will be highlighted in the day grid. - final DateTime currentDate; - - /// The initial mode of date entry method for the date picker dialog. - /// - /// See [DatePickerEntryMode] for more details on the different data entry - /// modes available. - final DatePickerEntryMode initialEntryMode; - - /// Function to provide full control over which [DateTime] can be selected. - final SelectableDayPredicate? selectableDayPredicate; - - /// The text that is displayed on the cancel button. - final String? cancelText; - - /// The text that is displayed on the confirm button. - final String? confirmText; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String? helpText; - - /// The initial display of the calendar picker. - final DatePickerMode initialCalendarMode; - - /// The error text displayed if the entered date is not in the correct format. - final String? errorFormatText; - - /// The error text displayed if the date is not valid. - /// - /// A date is not valid if it is earlier than [firstDate], later than - /// [lastDate], or doesn't pass the [selectableDayPredicate]. - final String? errorInvalidText; - - /// The hint text displayed in the [TextField]. - /// - /// If this is null, it will default to the date format string. For example, - /// 'mm/dd/yyyy' for en_US. - final String? fieldHintText; - - /// The label text displayed in the [TextField]. - /// - /// If this is null, it will default to the words representing the date format - /// string. For example, 'Month, Day, Year' for en_US. - final String? fieldLabelText; - - /// The keyboard type of the [TextField]. - /// - /// If this is null, it will default to [TextInputType.datetime] - final TextInputType? keyboardType; - - /// Restoration ID to save and restore the state of the [DatePickerDialog]. - /// - /// If it is non-null, the date picker will persist and restore the - /// date selected on the dialog. - /// - /// The state of this widget is persisted in a [RestorationBucket] claimed - /// from the surrounding [RestorationScope] using the provided restoration ID. - /// - /// See also: - /// - /// * [RestorationManager], which explains how state restoration works in - /// Flutter. - final String? restorationId; - - @override - State createState() => _DatePickerDialogState(); -} - -class _DatePickerDialogState extends State with RestorationMixin { - late final RestorableDateTime _selectedDate = RestorableDateTime(widget.initialDate); - late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); - final _RestorableAutovalidateMode _autovalidateMode = _RestorableAutovalidateMode(AutovalidateMode.disabled); - - @override - String? get restorationId => widget.restorationId; - - @override - void restoreState(RestorationBucket? oldBucket, bool initialRestore) { - registerForRestoration(_selectedDate, 'selected_date'); - registerForRestoration(_autovalidateMode, 'autovalidateMode'); - registerForRestoration(_entryMode, 'calendar_entry_mode'); - } - - final GlobalKey _calendarPickerKey = GlobalKey(); - final GlobalKey _formKey = GlobalKey(); - - void _handleOk() { - if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { - final FormState form = _formKey.currentState!; - if (!form.validate()) { - setState(() => _autovalidateMode.value = AutovalidateMode.always); - return; - } - form.save(); - } - Navigator.pop(context, _selectedDate.value); - } - - void _handleCancel() { - Navigator.pop(context); - } - - void _handleEntryModeToggle() { - setState(() { - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - _autovalidateMode.value = AutovalidateMode.disabled; - _entryMode.value = DatePickerEntryMode.input; - break; - case DatePickerEntryMode.input: - _formKey.currentState!.save(); - _entryMode.value = DatePickerEntryMode.calendar; - break; - case DatePickerEntryMode.calendarOnly: - case DatePickerEntryMode.inputOnly: - assert(false, 'Can not change entry mode from _entryMode'); - break; - } - }); - } - - void _handleDateChanged(DateTime date) { - setState(() { - _selectedDate.value = date; - }); - } - - Size _dialogSize(BuildContext context) { - final Orientation orientation = MediaQuery.of(context).orientation; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - case DatePickerEntryMode.calendarOnly: - switch (orientation) { - case Orientation.portrait: - return _calendarPortraitDialogSize; - case Orientation.landscape: - return _calendarLandscapeDialogSize; - } - case DatePickerEntryMode.input: - case DatePickerEntryMode.inputOnly: - switch (orientation) { - case Orientation.portrait: - return _inputPortraitDialogSize; - case Orientation.landscape: - return _inputLandscapeDialogSize; - } - } - } - - static const Map _formShortcutMap = { - // Pressing enter on the field will move focus to the next field or control. - SingleActivator(LogicalKeyboardKey.enter): NextFocusIntent(), - }; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - // Constrain the textScaleFactor to the largest supported value to prevent - // layout issues. - final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.3); - - final String dateText = localizations.formatMediumDate(_selectedDate.value); - final Color onPrimarySurface = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.copyWith(color: onPrimarySurface) - : textTheme.headline4?.copyWith(color: onPrimarySurface); - - final Widget actions = Container( - alignment: AlignmentDirectional.centerEnd, - constraints: const BoxConstraints(minHeight: 52.0), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: OverflowBar( - spacing: 8, - children: [ - TextButton( - onPressed: _handleCancel, - child: Text(widget.cancelText ?? localizations.cancelButtonLabel), - ), - TextButton( - onPressed: _handleOk, - child: Text(widget.confirmText ?? localizations.okButtonLabel), - ), - ], - ), - ); - - CalendarDatePicker calendarDatePicker() { - return CalendarDatePicker( - key: _calendarPickerKey, - initialDate: _selectedDate.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - currentDate: widget.currentDate, - onDateChanged: _handleDateChanged, - selectableDayPredicate: widget.selectableDayPredicate, - initialCalendarMode: widget.initialCalendarMode, - ); - } - - Form inputDatePicker() { - return Form( - key: _formKey, - autovalidateMode: _autovalidateMode.value, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 24), - height: orientation == Orientation.portrait ? _inputFormPortraitHeight : _inputFormLandscapeHeight, - child: Shortcuts( - shortcuts: _formShortcutMap, - child: Column( - children: [ - const Spacer(), - InputDatePickerFormField( - initialDate: _selectedDate.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - onDateSubmitted: _handleDateChanged, - onDateSaved: _handleDateChanged, - selectableDayPredicate: widget.selectableDayPredicate, - errorFormatText: widget.errorFormatText, - errorInvalidText: widget.errorInvalidText, - fieldHintText: widget.fieldHintText, - fieldLabelText: widget.fieldLabelText, - keyboardType: widget.keyboardType, - autofocus: true, - ), - const Spacer(), - ], - ), - ), - ), - ); - } - - final Widget picker; - final Widget? entryModeButton; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - picker = calendarDatePicker(); - entryModeButton = IconButton( - icon: const Icon(Icons.edit), - color: onPrimarySurface, - tooltip: localizations.inputDateModeButtonLabel, - onPressed: _handleEntryModeToggle, - ); - break; - - case DatePickerEntryMode.calendarOnly: - picker = calendarDatePicker(); - entryModeButton = null; - break; - - case DatePickerEntryMode.input: - picker = inputDatePicker(); - entryModeButton = IconButton( - icon: const Icon(Icons.calendar_today), - color: onPrimarySurface, - tooltip: localizations.calendarModeButtonLabel, - onPressed: _handleEntryModeToggle, - ); - break; - - case DatePickerEntryMode.inputOnly: - picker = inputDatePicker(); - entryModeButton = null; - break; - } - - final Widget header = _DatePickerHeader( - helpText: widget.helpText ?? localizations.datePickerHelpText, - titleText: dateText, - titleStyle: dateStyle, - orientation: orientation, - isShort: orientation == Orientation.landscape, - entryModeButton: entryModeButton, - ); - - final Size dialogSize = _dialogSize(context) * textScaleFactor; - return Dialog( - insetPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0), - clipBehavior: Clip.antiAlias, - child: AnimatedContainer( - width: dialogSize.width, - height: dialogSize.height, - duration: _dialogSizeAnimationDuration, - curve: Curves.easeIn, - child: MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaleFactor: textScaleFactor, - ), - child: Builder(builder: (BuildContext context) { - switch (orientation) { - case Orientation.portrait: - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Expanded(child: picker), - actions, - ], - ); - case Orientation.landscape: - return Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Flexible( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(child: picker), - actions, - ], - ), - ), - ], - ); - } - }), - ), - ), - ); - } -} - -// A restorable [DatePickerEntryMode] value. -// -// This serializes each entry as a unique `int` value. -class _RestorableDatePickerEntryMode extends RestorableValue { - _RestorableDatePickerEntryMode( - DatePickerEntryMode defaultValue, - ) : _defaultValue = defaultValue; - - final DatePickerEntryMode _defaultValue; - - @override - DatePickerEntryMode createDefaultValue() => _defaultValue; - - @override - void didUpdateValue(DatePickerEntryMode? oldValue) { - assert(debugIsSerializableForRestoration(value.index)); - notifyListeners(); - } - - @override - DatePickerEntryMode fromPrimitives(Object? data) => DatePickerEntryMode.values[data! as int]; - - @override - Object? toPrimitives() => value.index; -} - -// A restorable [AutovalidateMode] value. -// -// This serializes each entry as a unique `int` value. -class _RestorableAutovalidateMode extends RestorableValue { - _RestorableAutovalidateMode( - AutovalidateMode defaultValue, - ) : _defaultValue = defaultValue; - - final AutovalidateMode _defaultValue; - - @override - AutovalidateMode createDefaultValue() => _defaultValue; - - @override - void didUpdateValue(AutovalidateMode? oldValue) { - assert(debugIsSerializableForRestoration(value.index)); - notifyListeners(); - } - - @override - AutovalidateMode fromPrimitives(Object? data) => AutovalidateMode.values[data! as int]; - - @override - Object? toPrimitives() => value.index; -} - -/// Re-usable widget that displays the selected date (in large font) and the -/// help text above it. -/// -/// These types include: -/// -/// * Single Date picker with calendar mode. -/// * Single Date picker with text input mode. -/// * Date Range picker with text input mode. -/// -/// [helpText], [orientation], [icon], [onIconPressed] are required and must be -/// non-null. -class _DatePickerHeader extends StatelessWidget { - - /// Creates a header for use in a date picker dialog. - const _DatePickerHeader({ - required this.helpText, - required this.titleText, - this.titleSemanticsLabel, - required this.titleStyle, - required this.orientation, - this.isShort = false, - this.entryModeButton, - }) : assert(helpText != null), - assert(orientation != null), - assert(isShort != null); - - static const double _datePickerHeaderLandscapeWidth = 152.0; - static const double _datePickerHeaderPortraitHeight = 120.0; - static const double _headerPaddingLandscape = 16.0; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String helpText; - - /// The text that is displayed at the center of the header. - final String titleText; - - /// The semantic label associated with the [titleText]. - final String? titleSemanticsLabel; - - /// The [TextStyle] that the title text is displayed with. - final TextStyle? titleStyle; - - /// The orientation is used to decide how to layout its children. - final Orientation orientation; - - /// Indicates the header is being displayed in a shorter/narrower context. - /// - /// This will be used to tighten up the space between the help text and date - /// text if `true`. Additionally, it will use a smaller typography style if - /// `true`. - /// - /// This is necessary for displaying the manual input mode in - /// landscape orientation, in order to account for the keyboard height. - final bool isShort; - - final Widget? entryModeButton; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final TextTheme textTheme = theme.textTheme; - - // The header should use the primary color in light themes and surface color in dark - final bool isDark = colorScheme.brightness == Brightness.dark; - final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; - final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; - - final TextStyle? helpStyle = textTheme.overline?.copyWith( - color: onPrimarySurfaceColor, - ); - - final Text help = Text( - helpText, - style: helpStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ); - final Text title = Text( - titleText, - semanticsLabel: titleSemanticsLabel ?? titleText, - style: titleStyle, - maxLines: orientation == Orientation.portrait ? 1 : 2, - overflow: TextOverflow.ellipsis, - ); - - switch (orientation) { - case Orientation.portrait: - return SizedBox( - height: _datePickerHeaderPortraitHeight, - child: Material( - color: primarySurfaceColor, - child: Padding( - padding: const EdgeInsetsDirectional.only( - start: 24, - end: 12, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 16), - help, - const Flexible(child: SizedBox(height: 38)), - Row( - children: [ - Expanded(child: title), - if (entryModeButton != null) - entryModeButton!, - ], - ), - ], - ), - ), - ), - ); - case Orientation.landscape: - return SizedBox( - width: _datePickerHeaderLandscapeWidth, - child: Material( - color: primarySurfaceColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 16), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: _headerPaddingLandscape, - ), - child: help, - ), - SizedBox(height: isShort ? 16 : 56), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: _headerPaddingLandscape, - ), - child: title, - ), - ), - if (entryModeButton != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: entryModeButton, - ), - ], - ), - ), - ); - } - } -} - -/// Shows a full screen modal dialog containing a Material Design date range -/// picker. -/// -/// The returned [Future] resolves to the [DateTimeRange] selected by the user -/// when the user saves their selection. If the user cancels the dialog, null is -/// returned. -/// -/// If [initialDateRange] is non-null, then it will be used as the initially -/// selected date range. If it is provided, `initialDateRange.start` must be -/// before or on `initialDateRange.end`. -/// -/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest -/// allowable date. Both must be non-null. -/// -/// If an initial date range is provided, `initialDateRange.start` -/// and `initialDateRange.end` must both fall between or on [firstDate] and -/// [lastDate]. For all of these [DateTime] values, only their dates are -/// considered. Their time fields are ignored. -/// -/// The [currentDate] represents the current day (i.e. today). This -/// date will be highlighted in the day grid. If null, the date of -/// `DateTime.now()` will be used. -/// -/// An optional [initialEntryMode] argument can be used to display the date -/// picker in the [DatePickerEntryMode.calendar] (a scrollable calendar month -/// grid) or [DatePickerEntryMode.input] (two text input fields) mode. -/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. -/// -/// The following optional string parameters allow you to override the default -/// text used for various parts of the dialog: -/// -/// * [helpText], the label displayed at the top of the dialog. -/// * [cancelText], the label on the cancel button for the text input mode. -/// * [confirmText],the label on the ok button for the text input mode. -/// * [saveText], the label on the save button for the fullscreen calendar -/// mode. -/// * [errorFormatText], the message used when an input text isn't in a proper -/// date format. -/// * [errorInvalidText], the message used when an input text isn't a -/// selectable date. -/// * [errorInvalidRangeText], the message used when the date range is -/// invalid (e.g. start date is after end date). -/// * [fieldStartHintText], the text used to prompt the user when no text has -/// been entered in the start field. -/// * [fieldEndHintText], the text used to prompt the user when no text has -/// been entered in the end field. -/// * [fieldStartLabelText], the label for the start date text input field. -/// * [fieldEndLabelText], the label for the end date text input field. -/// -/// An optional [locale] argument can be used to set the locale for the date -/// picker. It defaults to the ambient locale provided by [Localizations]. -/// -/// An optional [textDirection] argument can be used to set the text direction -/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It -/// defaults to the ambient text direction provided by [Directionality]. If both -/// [locale] and [textDirection] are non-null, [textDirection] overrides the -/// direction chosen for the [locale]. -/// -/// The [context], [useRootNavigator] and [routeSettings] arguments are passed -/// to [showDialog], the documentation for which discusses how it is used. -/// [context] and [useRootNavigator] must be non-null. -/// -/// The [builder] parameter can be used to wrap the dialog widget -/// to add inherited widgets like [Theme]. -/// -/// {@macro flutter.widgets.RawDialogRoute} -/// -/// ### State Restoration -/// -/// Using this method will not enable state restoration for the date range picker. -/// In order to enable state restoration for a date range picker, use -/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with -/// [DateRangePickerDialog]. -/// -/// For more information about state restoration, see [RestorationManager]. -/// -/// {@macro flutter.widgets.RestorationManager} -/// -/// {@tool sample} -/// This sample demonstrates how to create a restorable Material date range picker. -/// This is accomplished by enabling state restoration by specifying -/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to -/// push [DateRangePickerDialog] when the button is tapped. -/// -/// ** See code in examples/api/lib/material/date_picker/show_date_range_picker.0.dart ** -/// {@end-tool} -/// -/// See also: -/// -/// * [showDatePicker], which shows a Material Design date picker used to -/// select a single date. -/// * [DateTimeRange], which is used to describe a date range. -/// * [DisplayFeatureSubScreen], which documents the specifics of how -/// [DisplayFeature]s can split the screen into sub-screens. -Future showDateRangePicker({ - required BuildContext context, - DateTimeRange? initialDateRange, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, - String? helpText, - String? cancelText, - String? confirmText, - String? saveText, - String? errorFormatText, - String? errorInvalidText, - String? errorInvalidRangeText, - String? fieldStartHintText, - String? fieldEndHintText, - String? fieldStartLabelText, - String? fieldEndLabelText, - Locale? locale, - bool useRootNavigator = true, - RouteSettings? routeSettings, - TextDirection? textDirection, - TransitionBuilder? builder, - Offset? anchorPoint, -}) async { - assert(context != null); - assert( - initialDateRange == null || (initialDateRange.start != null && initialDateRange.end != null), - 'initialDateRange must be null or have non-null start and end dates.', - ); - assert( - initialDateRange == null || !initialDateRange.start.isAfter(initialDateRange.end), - "initialDateRange's start date must not be after it's end date.", - ); - initialDateRange = initialDateRange == null ? null : DateUtils.datesOnly(initialDateRange); - assert(firstDate != null); - firstDate = DateUtils.dateOnly(firstDate); - assert(lastDate != null); - lastDate = DateUtils.dateOnly(lastDate); - assert( - !lastDate.isBefore(firstDate), - 'lastDate $lastDate must be on or after firstDate $firstDate.', - ); - assert( - initialDateRange == null || !initialDateRange.start.isBefore(firstDate), - "initialDateRange's start date must be on or after firstDate $firstDate.", - ); - assert( - initialDateRange == null || !initialDateRange.end.isBefore(firstDate), - "initialDateRange's end date must be on or after firstDate $firstDate.", - ); - assert( - initialDateRange == null || !initialDateRange.start.isAfter(lastDate), - "initialDateRange's start date must be on or before lastDate $lastDate.", - ); - assert( - initialDateRange == null || !initialDateRange.end.isAfter(lastDate), - "initialDateRange's end date must be on or before lastDate $lastDate.", - ); - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()); - assert(initialEntryMode != null); - assert(useRootNavigator != null); - assert(debugCheckHasMaterialLocalizations(context)); - - Widget dialog = DateRangePickerDialog( - initialDateRange: initialDateRange, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - initialEntryMode: initialEntryMode, - helpText: helpText, - cancelText: cancelText, - confirmText: confirmText, - saveText: saveText, - errorFormatText: errorFormatText, - errorInvalidText: errorInvalidText, - errorInvalidRangeText: errorInvalidRangeText, - fieldStartHintText: fieldStartHintText, - fieldEndHintText: fieldEndHintText, - fieldStartLabelText: fieldStartLabelText, - fieldEndLabelText: fieldEndLabelText, - ); - - if (textDirection != null) { - dialog = Directionality( - textDirection: textDirection, - child: dialog, - ); - } - - if (locale != null) { - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); - } - - return showDialog( - context: context, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - useSafeArea: false, - builder: (BuildContext context) { - return builder == null ? dialog : builder(context, dialog); - }, - anchorPoint: anchorPoint, - ); -} - -/// Returns a locale-appropriate string to describe the start of a date range. -/// -/// If `startDate` is null, then it defaults to 'Start Date', otherwise if it -/// is in the same year as the `endDate` then it will use the short month -/// day format (i.e. 'Jan 21'). Otherwise it will return the short date format -/// (i.e. 'Jan 21, 2020'). -String _formatRangeStartDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate) { - return startDate == null - ? localizations.dateRangeStartLabel - : (endDate == null || startDate.year == endDate.year) - ? localizations.formatShortMonthDay(startDate) - : localizations.formatShortDate(startDate); -} - -/// Returns an locale-appropriate string to describe the end of a date range. -/// -/// If `endDate` is null, then it defaults to 'End Date', otherwise if it -/// is in the same year as the `startDate` and the `currentDate` then it will -/// just use the short month day format (i.e. 'Jan 21'), otherwise it will -/// include the year (i.e. 'Jan 21, 2020'). -String _formatRangeEndDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate, DateTime currentDate) { - return endDate == null - ? localizations.dateRangeEndLabel - : (startDate != null && startDate.year == endDate.year && startDate.year == currentDate.year) - ? localizations.formatShortMonthDay(endDate) - : localizations.formatShortDate(endDate); -} - -/// A Material-style date range picker dialog. -/// -/// It is used internally by [showDateRangePicker] or can be directly pushed -/// onto the [Navigator] stack to enable state restoration. See -/// [showDateRangePicker] for a state restoration app example. -/// -/// See also: -/// -/// * [showDateRangePicker], which is a way to display the date picker. -class DateRangePickerDialog extends StatefulWidget { - /// A Material-style date range picker dialog. - const DateRangePickerDialog({ - super.key, - this.initialDateRange, - required this.firstDate, - required this.lastDate, - this.currentDate, - this.initialEntryMode = DatePickerEntryMode.calendar, - this.helpText, - this.cancelText, - this.confirmText, - this.saveText, - this.errorInvalidRangeText, - this.errorFormatText, - this.errorInvalidText, - this.fieldStartHintText, - this.fieldEndHintText, - this.fieldStartLabelText, - this.fieldEndLabelText, - this.restorationId, - }); - - /// The date range that the date range picker starts with when it opens. - /// - /// If an initial date range is provided, `initialDateRange.start` - /// and `initialDateRange.end` must both fall between or on [firstDate] and - /// [lastDate]. For all of these [DateTime] values, only their dates are - /// considered. Their time fields are ignored. - /// - /// If [initialDateRange] is non-null, then it will be used as the initially - /// selected date range. If it is provided, `initialDateRange.start` must be - /// before or on `initialDateRange.end`. - final DateTimeRange? initialDateRange; - - /// The earliest allowable date on the date range. - final DateTime firstDate; - - /// The latest allowable date on the date range. - final DateTime lastDate; - - /// The [currentDate] represents the current day (i.e. today). - /// - /// This date will be highlighted in the day grid. - /// - /// If `null`, the date of `DateTime.now()` will be used. - final DateTime? currentDate; - - /// The initial date range picker entry mode. - /// - /// The date range has two main modes: [DatePickerEntryMode.calendar] (a - /// scrollable calendar month grid) or [DatePickerEntryMode.input] (two text - /// input fields) mode. - /// - /// It defaults to [DatePickerEntryMode.calendar] and must be non-null. - final DatePickerEntryMode initialEntryMode; - - /// The label on the cancel button for the text input mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.cancelButtonLabel] is used. - final String? cancelText; - - /// The label on the "OK" button for the text input mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.okButtonLabel] is used. - final String? confirmText; - - /// The label on the save button for the fullscreen calendar mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.saveButtonLabel] is used. - final String? saveText; - - /// The label displayed at the top of the dialog. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateRangePickerHelpText] is used. - final String? helpText; - - /// The message used when the date range is invalid (e.g. start date is after - /// end date). - /// - /// If null, the localized value of - /// [MaterialLocalizations.invalidDateRangeLabel] is used. - final String? errorInvalidRangeText; - - /// The message used when an input text isn't in a proper date format. - /// - /// If null, the localized value of - /// [MaterialLocalizations.invalidDateFormatLabel] is used. - final String? errorFormatText; - - /// The message used when an input text isn't a selectable date. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateOutOfRangeLabel] is used. - final String? errorInvalidText; - - /// The text used to prompt the user when no text has been entered in the - /// start field. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateHelpText] is used. - final String? fieldStartHintText; - - /// The text used to prompt the user when no text has been entered in the - /// end field. - /// - /// If null, the localized value of [MaterialLocalizations.dateHelpText] is - /// used. - final String? fieldEndHintText; - - /// The label for the start date text input field. - /// - /// If null, the localized value of [MaterialLocalizations.dateRangeStartLabel] - /// is used. - final String? fieldStartLabelText; - - /// The label for the end date text input field. - /// - /// If null, the localized value of [MaterialLocalizations.dateRangeEndLabel] - /// is used. - final String? fieldEndLabelText; - - /// Restoration ID to save and restore the state of the [DateRangePickerDialog]. - /// - /// If it is non-null, the date range picker will persist and restore the - /// date range selected on the dialog. - /// - /// The state of this widget is persisted in a [RestorationBucket] claimed - /// from the surrounding [RestorationScope] using the provided restoration ID. - /// - /// See also: - /// - /// * [RestorationManager], which explains how state restoration works in - /// Flutter. - final String? restorationId; - - @override - State createState() => _DateRangePickerDialogState(); -} - -class _DateRangePickerDialogState extends State with RestorationMixin { - late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); - late final RestorableDateTimeN _selectedStart = RestorableDateTimeN(widget.initialDateRange?.start); - late final RestorableDateTimeN _selectedEnd = RestorableDateTimeN(widget.initialDateRange?.end); - final RestorableBool _autoValidate = RestorableBool(false); - final GlobalKey _calendarPickerKey = GlobalKey(); - final GlobalKey<_InputDateRangePickerState> _inputPickerKey = GlobalKey<_InputDateRangePickerState>(); - - @override - String? get restorationId => widget.restorationId; - - @override - void restoreState(RestorationBucket? oldBucket, bool initialRestore) { - registerForRestoration(_entryMode, 'entry_mode'); - registerForRestoration(_selectedStart, 'selected_start'); - registerForRestoration(_selectedEnd, 'selected_end'); - registerForRestoration(_autoValidate, 'autovalidate'); - } - - void _handleOk() { - if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { - final _InputDateRangePickerState picker = _inputPickerKey.currentState!; - if (!picker.validate()) { - setState(() { - _autoValidate.value = true; - }); - return; - } - } - final DateTimeRange? selectedRange = _hasSelectedDateRange - ? DateTimeRange(start: _selectedStart.value!, end: _selectedEnd.value!) - : null; - - Navigator.pop(context, selectedRange); - } - - void _handleCancel() { - Navigator.pop(context); - } - - void _handleEntryModeToggle() { - setState(() { - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - _autoValidate.value = false; - _entryMode.value = DatePickerEntryMode.input; - break; - - case DatePickerEntryMode.input: - // Validate the range dates - if (_selectedStart.value != null && - (_selectedStart.value!.isBefore(widget.firstDate) || _selectedStart.value!.isAfter(widget.lastDate))) { - _selectedStart.value = null; - // With no valid start date, having an end date makes no sense for the UI. - _selectedEnd.value = null; - } - if (_selectedEnd.value != null && - (_selectedEnd.value!.isBefore(widget.firstDate) || _selectedEnd.value!.isAfter(widget.lastDate))) { - _selectedEnd.value = null; - } - // If invalid range (start after end), then just use the start date - if (_selectedStart.value != null && _selectedEnd.value != null && _selectedStart.value!.isAfter(_selectedEnd.value!)) { - _selectedEnd.value = null; - } - _entryMode.value = DatePickerEntryMode.calendar; - break; - - case DatePickerEntryMode.calendarOnly: - case DatePickerEntryMode.inputOnly: - assert(false, 'Can not change entry mode from $_entryMode'); - break; - } - }); - } - - void _handleStartDateChanged(DateTime? date) { - setState(() => _selectedStart.value = date); - } - - void _handleEndDateChanged(DateTime? date) { - setState(() => _selectedEnd.value = date); - } - - bool get _hasSelectedDateRange => _selectedStart.value != null && _selectedEnd.value != null; - - @override - Widget build(BuildContext context) { - final MediaQueryData mediaQuery = MediaQuery.of(context); - final Orientation orientation = mediaQuery.orientation; - final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final ColorScheme colors = Theme.of(context).colorScheme; - final Color onPrimarySurface = colors.brightness == Brightness.light - ? colors.onPrimary - : colors.onSurface; - - final Widget contents; - final Size size; - ShapeBorder? shape; - final double elevation; - final EdgeInsets insetPadding; - final bool showEntryModeButton = - _entryMode.value == DatePickerEntryMode.calendar || - _entryMode.value == DatePickerEntryMode.input; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - case DatePickerEntryMode.calendarOnly: - contents = _CalendarRangePickerDialog( - key: _calendarPickerKey, - selectedStartDate: _selectedStart.value, - selectedEndDate: _selectedEnd.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - currentDate: widget.currentDate, - onStartDateChanged: _handleStartDateChanged, - onEndDateChanged: _handleEndDateChanged, - onConfirm: _hasSelectedDateRange ? _handleOk : null, - onCancel: _handleCancel, - entryModeButton: showEntryModeButton - ? IconButton( - icon: const Icon(Icons.edit), - padding: EdgeInsets.zero, - color: onPrimarySurface, - tooltip: localizations.inputDateModeButtonLabel, - onPressed: _handleEntryModeToggle, - ) - : null, - confirmText: widget.saveText ?? localizations.saveButtonLabel, - helpText: widget.helpText ?? localizations.dateRangePickerHelpText, - ); - size = mediaQuery.size; - insetPadding = EdgeInsets.zero; - shape = const RoundedRectangleBorder(); - elevation = 0; - break; - - case DatePickerEntryMode.input: - case DatePickerEntryMode.inputOnly: - contents = _InputDateRangePickerDialog( - selectedStartDate: _selectedStart.value, - selectedEndDate: _selectedEnd.value, - currentDate: widget.currentDate, - picker: Container( - padding: const EdgeInsets.symmetric(horizontal: 24), - height: orientation == Orientation.portrait - ? _inputFormPortraitHeight - : _inputFormLandscapeHeight, - child: Column( - children: [ - const Spacer(), - _InputDateRangePicker( - key: _inputPickerKey, - initialStartDate: _selectedStart.value, - initialEndDate: _selectedEnd.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - onStartDateChanged: _handleStartDateChanged, - onEndDateChanged: _handleEndDateChanged, - autofocus: true, - autovalidate: _autoValidate.value, - helpText: widget.helpText, - errorInvalidRangeText: widget.errorInvalidRangeText, - errorFormatText: widget.errorFormatText, - errorInvalidText: widget.errorInvalidText, - fieldStartHintText: widget.fieldStartHintText, - fieldEndHintText: widget.fieldEndHintText, - fieldStartLabelText: widget.fieldStartLabelText, - fieldEndLabelText: widget.fieldEndLabelText, - ), - const Spacer(), - ], - ), - ), - onConfirm: _handleOk, - onCancel: _handleCancel, - entryModeButton: showEntryModeButton - ? IconButton( - icon: const Icon(Icons.calendar_today), - padding: EdgeInsets.zero, - color: onPrimarySurface, - tooltip: localizations.calendarModeButtonLabel, - onPressed: _handleEntryModeToggle, - ) - : null, - confirmText: widget.confirmText ?? localizations.okButtonLabel, - cancelText: widget.cancelText ?? localizations.cancelButtonLabel, - helpText: widget.helpText ?? localizations.dateRangePickerHelpText, - ); - final DialogTheme dialogTheme = Theme.of(context).dialogTheme; - size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; - insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); - shape = dialogTheme.shape; - elevation = dialogTheme.elevation ?? 24; - break; - } - - return Dialog( - insetPadding: insetPadding, - shape: shape, - elevation: elevation, - clipBehavior: Clip.antiAlias, - child: AnimatedContainer( - width: size.width, - height: size.height, - duration: _dialogSizeAnimationDuration, - curve: Curves.easeIn, - child: MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaleFactor: textScaleFactor, - ), - child: Builder(builder: (BuildContext context) { - return contents; - }), - ), - ), - ); - } -} - -class _CalendarRangePickerDialog extends StatelessWidget { - const _CalendarRangePickerDialog({ - super.key, - required this.selectedStartDate, - required this.selectedEndDate, - required this.firstDate, - required this.lastDate, - required this.currentDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - required this.onConfirm, - required this.onCancel, - required this.confirmText, - required this.helpText, - this.entryModeButton, - }); - - final DateTime? selectedStartDate; - final DateTime? selectedEndDate; - final DateTime firstDate; - final DateTime lastDate; - final DateTime? currentDate; - final ValueChanged onStartDateChanged; - final ValueChanged onEndDateChanged; - final VoidCallback? onConfirm; - final VoidCallback? onCancel; - final String confirmText; - final String helpText; - final Widget? entryModeButton; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - final Color headerForeground = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final Color headerDisabledForeground = headerForeground.withOpacity(0.38); - final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); - final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); - final TextStyle? headlineStyle = textTheme.headline5; - final TextStyle? startDateStyle = headlineStyle?.apply( - color: selectedStartDate != null ? headerForeground : headerDisabledForeground, - ); - final TextStyle? endDateStyle = headlineStyle?.apply( - color: selectedEndDate != null ? headerForeground : headerDisabledForeground, - ); - final TextStyle saveButtonStyle = textTheme.button!.apply( - color: onConfirm != null ? headerForeground : headerDisabledForeground, - ); - - return SafeArea( - top: false, - left: false, - right: false, - child: Scaffold( - appBar: AppBar( - leading: CloseButton( - onPressed: onCancel, - ), - actions: [ - if (orientation == Orientation.landscape && entryModeButton != null) - entryModeButton!, - TextButton( - onPressed: onConfirm, - child: Text(confirmText, style: saveButtonStyle), - ), - const SizedBox(width: 8), - ], - bottom: PreferredSize( - preferredSize: const Size(double.infinity, 64), - child: Row(children: [ - SizedBox(width: MediaQuery.of(context).size.width < 360 ? 42 : 72), - Expanded( - child: Semantics( - label: '$helpText $startDateText to $endDateText', - excludeSemantics: true, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - helpText, - style: textTheme.overline!.apply( - color: headerForeground, - ), - ), - const SizedBox(height: 8), - Row( - children: [ - Text( - startDateText, - style: startDateStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text(' – ', style: startDateStyle, - ), - Flexible( - child: Text( - endDateText, - style: endDateStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - const SizedBox(height: 16), - ], - ), - ), - ), - if (orientation == Orientation.portrait && entryModeButton != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: entryModeButton, - ), - ]), - ), - ), - body: _CalendarDateRangePicker( - initialStartDate: selectedStartDate, - initialEndDate: selectedEndDate, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - onStartDateChanged: onStartDateChanged, - onEndDateChanged: onEndDateChanged, - ), - ), - ); - } -} - -const Duration _monthScrollDuration = Duration(milliseconds: 200); - -const double _monthItemHeaderHeight = 58.0; -const double _monthItemFooterHeight = 12.0; -const double _monthItemRowHeight = 42.0; -const double _monthItemSpaceBetweenRows = 8.0; -const double _horizontalPadding = 8.0; -const double _maxCalendarWidthLandscape = 384.0; -const double _maxCalendarWidthPortrait = 480.0; - -/// Displays a scrollable calendar grid that allows a user to select a range -/// of dates. -class _CalendarDateRangePicker extends StatefulWidget { - /// Creates a scrollable calendar grid for picking date ranges. - _CalendarDateRangePicker({ - DateTime? initialStartDate, - DateTime? initialEndDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - }) : initialStartDate = initialStartDate != null ? DateUtils.dateOnly(initialStartDate) : null, - initialEndDate = initialEndDate != null ? DateUtils.dateOnly(initialEndDate) : null, - assert(firstDate != null), - assert(lastDate != null), - firstDate = DateUtils.dateOnly(firstDate), - lastDate = DateUtils.dateOnly(lastDate), - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()) { - assert( - this.initialStartDate == null || this.initialEndDate == null || !this.initialStartDate!.isAfter(initialEndDate!), - 'initialStartDate must be on or before initialEndDate.', - ); - assert( - !this.lastDate.isBefore(this.firstDate), - 'firstDate must be on or before lastDate.', - ); - } - - /// The [DateTime] that represents the start of the initial date range selection. - final DateTime? initialStartDate; - - /// The [DateTime] that represents the end of the initial date range selection. - final DateTime? initialEndDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// The [DateTime] representing today. It will be highlighted in the day grid. - final DateTime currentDate; - - /// Called when the user changes the start date of the selected range. - final ValueChanged? onStartDateChanged; - - /// Called when the user changes the end date of the selected range. - final ValueChanged? onEndDateChanged; - - @override - _CalendarDateRangePickerState createState() => _CalendarDateRangePickerState(); -} - -class _CalendarDateRangePickerState extends State<_CalendarDateRangePicker> { - final GlobalKey _scrollViewKey = GlobalKey(); - DateTime? _startDate; - DateTime? _endDate; - int _initialMonthIndex = 0; - late ScrollController _controller; - late bool _showWeekBottomDivider; - - @override - void initState() { - super.initState(); - _controller = ScrollController(); - _controller.addListener(_scrollListener); - - _startDate = widget.initialStartDate; - _endDate = widget.initialEndDate; - - // Calculate the index for the initially displayed month. This is needed to - // divide the list of months into two `SliverList`s. - final DateTime initialDate = widget.initialStartDate ?? widget.currentDate; - if (!initialDate.isBefore(widget.firstDate) && - !initialDate.isAfter(widget.lastDate)) { - _initialMonthIndex = DateUtils.monthDelta(widget.firstDate, initialDate); - } - - _showWeekBottomDivider = _initialMonthIndex != 0; - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - void _scrollListener() { - if (_controller.offset <= _controller.position.minScrollExtent) { - setState(() { - _showWeekBottomDivider = false; - }); - } else if (!_showWeekBottomDivider) { - setState(() { - _showWeekBottomDivider = true; - }); - } - } - - int get _numberOfMonths => DateUtils.monthDelta(widget.firstDate, widget.lastDate) + 1; - - void _vibrate() { - switch (Theme.of(context).platform) { - case TargetPlatform.android: - case TargetPlatform.fuchsia: - HapticFeedback.vibrate(); - break; - case TargetPlatform.iOS: - case TargetPlatform.linux: - case TargetPlatform.macOS: - case TargetPlatform.windows: - break; - } - } - - // This updates the selected date range using this logic: - // - // * From the unselected state, selecting one date creates the start date. - // * If the next selection is before the start date, reset date range and - // set the start date to that selection. - // * If the next selection is on or after the start date, set the end date - // to that selection. - // * After both start and end dates are selected, any subsequent selection - // resets the date range and sets start date to that selection. - void _updateSelection(DateTime date) { - _vibrate(); - setState(() { - if (_startDate != null && _endDate == null && !date.isBefore(_startDate!)) { - _endDate = date; - widget.onEndDateChanged?.call(_endDate); - } else { - _startDate = date; - widget.onStartDateChanged?.call(_startDate!); - if (_endDate != null) { - _endDate = null; - widget.onEndDateChanged?.call(_endDate); - } - } - }); - } - - Widget _buildMonthItem(BuildContext context, int index, bool beforeInitialMonth) { - final int monthIndex = beforeInitialMonth - ? _initialMonthIndex - index - 1 - : _initialMonthIndex + index; - final DateTime month = DateUtils.addMonthsToMonthDate(widget.firstDate, monthIndex); - return Stack( - alignment: Alignment.center, - children: [ - Text("${month.month}",style: TextStyle(fontSize: 200,color: Colors.grey.withOpacity(0.1)),), - _MonthItem( - selectedDateStart: _startDate, - selectedDateEnd: _endDate, - currentDate: widget.currentDate, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - displayedMonth: month, - onChanged: _updateSelection, - ), - ], - ); - } - - @override - Widget build(BuildContext context) { - const Key sliverAfterKey = Key('sliverAfterKey'); - - return Column( - children: [ - const _DayHeaders(), - if (_showWeekBottomDivider) const Divider(height: 0), - Expanded( - child: _CalendarKeyboardNavigator( - firstDate: widget.firstDate, - lastDate: widget.lastDate, - initialFocusedDay: _startDate ?? widget.initialStartDate ?? widget.currentDate, - // In order to prevent performance issues when displaying the - // correct initial month, 2 `SliverList`s are used to split the - // months. The first item in the second SliverList is the initial - // month to be displayed. - child: CustomScrollView( - key: _scrollViewKey, - controller: _controller, - center: sliverAfterKey, - slivers: [ - SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) => _buildMonthItem(context, index, true), - childCount: _initialMonthIndex, - ), - ), - SliverList( - key: sliverAfterKey, - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) => _buildMonthItem(context, index, false), - childCount: _numberOfMonths - _initialMonthIndex, - ), - ), - ], - ), - ), - ), - ], - ); - } -} - -class _CalendarKeyboardNavigator extends StatefulWidget { - const _CalendarKeyboardNavigator({ - required this.child, - required this.firstDate, - required this.lastDate, - required this.initialFocusedDay, - }); - - final Widget child; - final DateTime firstDate; - final DateTime lastDate; - final DateTime initialFocusedDay; - - @override - _CalendarKeyboardNavigatorState createState() => _CalendarKeyboardNavigatorState(); -} - -class _CalendarKeyboardNavigatorState extends State<_CalendarKeyboardNavigator> { - - final Map _shortcutMap = const { - SingleActivator(LogicalKeyboardKey.arrowLeft): DirectionalFocusIntent(TraversalDirection.left), - SingleActivator(LogicalKeyboardKey.arrowRight): DirectionalFocusIntent(TraversalDirection.right), - SingleActivator(LogicalKeyboardKey.arrowDown): DirectionalFocusIntent(TraversalDirection.down), - SingleActivator(LogicalKeyboardKey.arrowUp): DirectionalFocusIntent(TraversalDirection.up), - }; - late Map> _actionMap; - late FocusNode _dayGridFocus; - TraversalDirection? _dayTraversalDirection; - DateTime? _focusedDay; - - @override - void initState() { - super.initState(); - - _actionMap = >{ - NextFocusIntent: CallbackAction(onInvoke: _handleGridNextFocus), - PreviousFocusIntent: CallbackAction(onInvoke: _handleGridPreviousFocus), - DirectionalFocusIntent: CallbackAction(onInvoke: _handleDirectionFocus), - }; - _dayGridFocus = FocusNode(debugLabel: 'Day Grid'); - } - - @override - void dispose() { - _dayGridFocus.dispose(); - super.dispose(); - } - - void _handleGridFocusChange(bool focused) { - setState(() { - if (focused) { - _focusedDay ??= widget.initialFocusedDay; - } - }); - } - - /// Move focus to the next element after the day grid. - void _handleGridNextFocus(NextFocusIntent intent) { - _dayGridFocus.requestFocus(); - _dayGridFocus.nextFocus(); - } - - /// Move focus to the previous element before the day grid. - void _handleGridPreviousFocus(PreviousFocusIntent intent) { - _dayGridFocus.requestFocus(); - _dayGridFocus.previousFocus(); - } - - /// Move the internal focus date in the direction of the given intent. - /// - /// This will attempt to move the focused day to the next selectable day in - /// the given direction. If the new date is not in the current month, then - /// the page view will be scrolled to show the new date's month. - /// - /// For horizontal directions, it will move forward or backward a day (depending - /// on the current [TextDirection]). For vertical directions it will move up and - /// down a week at a time. - void _handleDirectionFocus(DirectionalFocusIntent intent) { - assert(_focusedDay != null); - setState(() { - final DateTime? nextDate = _nextDateInDirection(_focusedDay!, intent.direction); - if (nextDate != null) { - _focusedDay = nextDate; - _dayTraversalDirection = intent.direction; - } - }); - } - - static const Map _directionOffset = { - TraversalDirection.up: -DateTime.daysPerWeek, - TraversalDirection.right: 1, - TraversalDirection.down: DateTime.daysPerWeek, - TraversalDirection.left: -1, - }; - - int _dayDirectionOffset(TraversalDirection traversalDirection, TextDirection textDirection) { - // Swap left and right if the text direction if RTL - if (textDirection == TextDirection.rtl) { - if (traversalDirection == TraversalDirection.left) { - traversalDirection = TraversalDirection.right; - } else if (traversalDirection == TraversalDirection.right) { - traversalDirection = TraversalDirection.left; - } - } - return _directionOffset[traversalDirection]!; - } - - DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { - final TextDirection textDirection = Directionality.of(context); - final DateTime nextDate = DateUtils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); - if (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { - return nextDate; - } - return null; - } - - @override - Widget build(BuildContext context) { - return FocusableActionDetector( - shortcuts: _shortcutMap, - actions: _actionMap, - focusNode: _dayGridFocus, - onFocusChange: _handleGridFocusChange, - child: _FocusedDate( - date: _dayGridFocus.hasFocus ? _focusedDay : null, - scrollDirection: _dayGridFocus.hasFocus ? _dayTraversalDirection : null, - child: widget.child, - ), - ); - } -} - -/// InheritedWidget indicating what the current focused date is for its children. -/// -/// This is used by the [_MonthPicker] to let its children [_DayPicker]s know -/// what the currently focused date (if any) should be. -class _FocusedDate extends InheritedWidget { - const _FocusedDate({ - required super.child, - this.date, - this.scrollDirection, - }); - - final DateTime? date; - final TraversalDirection? scrollDirection; - - @override - bool updateShouldNotify(_FocusedDate oldWidget) { - return !DateUtils.isSameDay(date, oldWidget.date) || scrollDirection != oldWidget.scrollDirection; - } - - static _FocusedDate? of(BuildContext context) { - return context.dependOnInheritedWidgetOfExactType<_FocusedDate>(); - } -} - - -class _DayHeaders extends StatelessWidget { - const _DayHeaders(); - - /// Builds widgets showing abbreviated days of week. The first widget in the - /// returned list corresponds to the first day of week for the current locale. - /// - /// Examples: - /// - /// ``` - /// ┌ Sunday is the first day of week in the US (en_US) - /// | - /// S M T W T F S <-- the returned list contains these widgets - /// _ _ _ _ _ 1 2 - /// 3 4 5 6 7 8 9 - /// - /// ┌ But it's Monday in the UK (en_GB) - /// | - /// M T W T F S S <-- the returned list contains these widgets - /// _ _ _ _ 1 2 3 - /// 4 5 6 7 8 9 10 - /// ``` - List _getDayHeaders(TextStyle headerStyle, MaterialLocalizations localizations) { - final List result = []; - for (int i = localizations.firstDayOfWeekIndex; true; i = (i + 1) % 7) { - final String weekday = localizations.narrowWeekdays[i]; - result.add(ExcludeSemantics( - child: Center(child: Text(weekday, style: headerStyle)), - )); - if (i == (localizations.firstDayOfWeekIndex - 1) % 7) { - break; - } - } - return result; - } - - @override - Widget build(BuildContext context) { - final ThemeData themeData = Theme.of(context); - final ColorScheme colorScheme = themeData.colorScheme; - final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final List labels = _getDayHeaders(textStyle, localizations); - - // Add leading and trailing containers for edges of the custom grid layout. - labels.insert(0, Container()); - labels.add(Container()); - - return Container( - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).orientation == Orientation.landscape - ? _maxCalendarWidthLandscape - : _maxCalendarWidthPortrait, - maxHeight: _monthItemRowHeight, - ), - child: GridView.custom( - shrinkWrap: true, - gridDelegate: _monthItemGridDelegate, - childrenDelegate: SliverChildListDelegate( - labels, - addRepaintBoundaries: false, - ), - ), - ); - } -} - -class _MonthItemGridDelegate extends SliverGridDelegate { - const _MonthItemGridDelegate(); - - @override - SliverGridLayout getLayout(SliverConstraints constraints) { - final double tileWidth = (constraints.crossAxisExtent - 2 * _horizontalPadding) / DateTime.daysPerWeek; - return _MonthSliverGridLayout( - crossAxisCount: DateTime.daysPerWeek + 2, - dayChildWidth: tileWidth, - edgeChildWidth: _horizontalPadding, - reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection), - ); - } - - @override - bool shouldRelayout(_MonthItemGridDelegate oldDelegate) => false; -} - -const _MonthItemGridDelegate _monthItemGridDelegate = _MonthItemGridDelegate(); - -class _MonthSliverGridLayout extends SliverGridLayout { - /// Creates a layout that uses equally sized and spaced tiles for each day of - /// the week and an additional edge tile for padding at the start and end of - /// each row. - /// - /// This is necessary to facilitate the painting of the range highlight - /// correctly. - const _MonthSliverGridLayout({ - required this.crossAxisCount, - required this.dayChildWidth, - required this.edgeChildWidth, - required this.reverseCrossAxis, - }) : assert(crossAxisCount != null && crossAxisCount > 0), - assert(dayChildWidth != null && dayChildWidth >= 0), - assert(edgeChildWidth != null && edgeChildWidth >= 0), - assert(reverseCrossAxis != null); - - /// The number of children in the cross axis. - final int crossAxisCount; - - /// The width in logical pixels of the day child widgets. - final double dayChildWidth; - - /// The width in logical pixels of the edge child widgets. - final double edgeChildWidth; - - /// Whether the children should be placed in the opposite order of increasing - /// coordinates in the cross axis. - /// - /// For example, if the cross axis is horizontal, the children are placed from - /// left to right when [reverseCrossAxis] is false and from right to left when - /// [reverseCrossAxis] is true. - /// - /// Typically set to the return value of [axisDirectionIsReversed] applied to - /// the [SliverConstraints.crossAxisDirection]. - final bool reverseCrossAxis; - - /// The number of logical pixels from the leading edge of one row to the - /// leading edge of the next row. - double get _rowHeight { - return _monthItemRowHeight + _monthItemSpaceBetweenRows; - } - - /// The height in logical pixels of the children widgets. - double get _childHeight { - return _monthItemRowHeight; - } - - @override - int getMinChildIndexForScrollOffset(double scrollOffset) { - return crossAxisCount * (scrollOffset ~/ _rowHeight); - } - - @override - int getMaxChildIndexForScrollOffset(double scrollOffset) { - final int mainAxisCount = (scrollOffset / _rowHeight).ceil(); - return math.max(0, crossAxisCount * mainAxisCount - 1); - } - - double _getCrossAxisOffset(double crossAxisStart, bool isPadding) { - if (reverseCrossAxis) { - return - ((crossAxisCount - 2) * dayChildWidth + 2 * edgeChildWidth) - - crossAxisStart - - (isPadding ? edgeChildWidth : dayChildWidth); - } - return crossAxisStart; - } - - @override - SliverGridGeometry getGeometryForChildIndex(int index) { - final int adjustedIndex = index % crossAxisCount; - final bool isEdge = adjustedIndex == 0 || adjustedIndex == crossAxisCount - 1; - final double crossAxisStart = math.max(0, (adjustedIndex - 1) * dayChildWidth + edgeChildWidth); - - return SliverGridGeometry( - scrollOffset: (index ~/ crossAxisCount) * _rowHeight, - crossAxisOffset: _getCrossAxisOffset(crossAxisStart, isEdge), - mainAxisExtent: _childHeight, - crossAxisExtent: isEdge ? edgeChildWidth : dayChildWidth, - ); - } - - @override - double computeMaxScrollOffset(int childCount) { - assert(childCount >= 0); - final int mainAxisCount = ((childCount - 1) ~/ crossAxisCount) + 1; - final double mainAxisSpacing = _rowHeight - _childHeight; - return _rowHeight * mainAxisCount - mainAxisSpacing; - } -} - -/// Displays the days of a given month and allows choosing a date range. -/// -/// The days are arranged in a rectangular grid with one column for each day of -/// the week. -class _MonthItem extends StatefulWidget { - /// Creates a month item. - _MonthItem({ - required this.selectedDateStart, - required this.selectedDateEnd, - required this.currentDate, - required this.onChanged, - required this.firstDate, - required this.lastDate, - required this.displayedMonth, - this.dragStartBehavior = DragStartBehavior.start, - }) : assert(firstDate != null), - assert(lastDate != null), - assert(!firstDate.isAfter(lastDate)), - assert(selectedDateStart == null || !selectedDateStart.isBefore(firstDate)), - assert(selectedDateEnd == null || !selectedDateEnd.isBefore(firstDate)), - assert(selectedDateStart == null || !selectedDateStart.isAfter(lastDate)), - assert(selectedDateEnd == null || !selectedDateEnd.isAfter(lastDate)), - assert(selectedDateStart == null || selectedDateEnd == null || !selectedDateStart.isAfter(selectedDateEnd)), - assert(currentDate != null), - assert(onChanged != null), - assert(displayedMonth != null), - assert(dragStartBehavior != null); - - /// The currently selected start date. - /// - /// This date is highlighted in the picker. - final DateTime? selectedDateStart; - - /// The currently selected end date. - /// - /// This date is highlighted in the picker. - final DateTime? selectedDateEnd; - - /// The current date at the time the picker is displayed. - final DateTime currentDate; - - /// Called when the user picks a day. - final ValueChanged onChanged; - - /// The earliest date the user is permitted to pick. - final DateTime firstDate; - - /// The latest date the user is permitted to pick. - final DateTime lastDate; - - /// The month whose days are displayed by this picker. - final DateTime displayedMonth; - - /// Determines the way that drag start behavior is handled. - /// - /// If set to [DragStartBehavior.start], the drag gesture used to scroll a - /// date picker wheel will begin at the position where the drag gesture won - /// the arena. If set to [DragStartBehavior.down] it will begin at the position - /// where a down event is first detected. - /// - /// In general, setting this to [DragStartBehavior.start] will make drag - /// animation smoother and setting it to [DragStartBehavior.down] will make - /// drag behavior feel slightly more reactive. - /// - /// By default, the drag start behavior is [DragStartBehavior.start]. - /// - /// See also: - /// - /// * [DragGestureRecognizer.dragStartBehavior], which gives an example for - /// the different behaviors. - final DragStartBehavior dragStartBehavior; - - @override - _MonthItemState createState() => _MonthItemState(); -} - -class _MonthItemState extends State<_MonthItem> { - /// List of [FocusNode]s, one for each day of the month. - late List _dayFocusNodes; - - @override - void initState() { - super.initState(); - final int daysInMonth = DateUtils.getDaysInMonth(widget.displayedMonth.year, widget.displayedMonth.month); - _dayFocusNodes = List.generate( - daysInMonth, - (int index) => FocusNode(skipTraversal: true, debugLabel: 'Day ${index + 1}'), - ); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - // Check to see if the focused date is in this month, if so focus it. - final DateTime? focusedDate = _FocusedDate.of(context)?.date; - if (focusedDate != null && DateUtils.isSameMonth(widget.displayedMonth, focusedDate)) { - _dayFocusNodes[focusedDate.day - 1].requestFocus(); - } - } - - @override - void dispose() { - for (final FocusNode node in _dayFocusNodes) { - node.dispose(); - } - super.dispose(); - } - - Color _highlightColor(BuildContext context) { - return Theme.of(context).colorScheme.primary.withOpacity(0.12); - } - - void _dayFocusChanged(bool focused) { - if (focused) { - final TraversalDirection? focusDirection = _FocusedDate.of(context)?.scrollDirection; - if (focusDirection != null) { - ScrollPositionAlignmentPolicy policy = ScrollPositionAlignmentPolicy.explicit; - switch (focusDirection) { - case TraversalDirection.up: - case TraversalDirection.left: - policy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; - break; - case TraversalDirection.right: - case TraversalDirection.down: - policy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; - break; - } - Scrollable.ensureVisible(primaryFocus!.context!, - duration: _monthScrollDuration, - alignmentPolicy: policy, - ); - } - } - } - - Widget _buildDayItem(BuildContext context, DateTime dayToBuild, int firstDayOffset, int daysInMonth) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final TextTheme textTheme = theme.textTheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final TextDirection textDirection = Directionality.of(context); - final Color highlightColor = _highlightColor(context); - final int day = dayToBuild.day; - - final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); - - BoxDecoration? decoration; - TextStyle? itemStyle = textTheme.bodyText2; - - final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; - final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); - final bool isSelectedDayEnd = widget.selectedDateEnd != null && dayToBuild.isAtSameMomentAs(widget.selectedDateEnd!); - final bool isInRange = isRangeSelected && - dayToBuild.isAfter(widget.selectedDateStart!) && - dayToBuild.isBefore(widget.selectedDateEnd!); - - _HighlightPainter? highlightPainter; - - if (isSelectedDayStart || isSelectedDayEnd) { - // The selected start and end dates gets a circle background - // highlight, and a contrasting text color. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onPrimary); - decoration = BoxDecoration( - color: colorScheme.primary, - shape: BoxShape.circle, - ); - - if (isRangeSelected && widget.selectedDateStart != widget.selectedDateEnd) { - final _HighlightPainterStyle style = isSelectedDayStart - ? _HighlightPainterStyle.highlightTrailing - : _HighlightPainterStyle.highlightLeading; - highlightPainter = _HighlightPainter( - color: highlightColor, - style: style, - textDirection: textDirection, - ); - } - } else if (isInRange) { - // The days within the range get a light background highlight. - highlightPainter = _HighlightPainter( - color: highlightColor, - style: _HighlightPainterStyle.highlightAll, - textDirection: textDirection, - ); - } else if (isDisabled) { - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onSurface.withOpacity(0.38)); - } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { - // The current day gets a different text color and a circle stroke - // border. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.primary); - decoration = BoxDecoration( - border: Border.all(color: colorScheme.primary), - shape: BoxShape.circle, - ); - } - - // We want the day of month to be spoken first irrespective of the - // locale-specific preferences or TextDirection. This is because - // an accessibility user is more likely to be interested in the - // day of month before the rest of the date, as they are looking - // for the day of month. To do that we prepend day of month to the - // formatted full date. - String semanticLabel = '${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}'; - if (isSelectedDayStart) { - semanticLabel = localizations.dateRangeStartDateSemanticLabel(semanticLabel); - } else if (isSelectedDayEnd) { - semanticLabel = localizations.dateRangeEndDateSemanticLabel(semanticLabel); - } - - Widget dayWidget = Container( - decoration: decoration, - child: Center( - child: Semantics( - label: semanticLabel, - selected: isSelectedDayStart || isSelectedDayEnd, - child: ExcludeSemantics( - child: Text(localizations.formatDecimal(day), style: itemStyle), - ), - ), - ), - ); - - if (highlightPainter != null) { - dayWidget = CustomPaint( - painter: highlightPainter, - child: dayWidget, - ); - } - - if (!isDisabled) { - dayWidget = InkResponse( - focusNode: _dayFocusNodes[day - 1], - onTap: () => widget.onChanged(dayToBuild), - radius: _monthItemRowHeight / 2 + 4, - splashColor: colorScheme.primary.withOpacity(0.38), - onFocusChange: _dayFocusChanged, - child: dayWidget, - ); - } - - return dayWidget; - } - - Widget _buildEdgeContainer(BuildContext context, bool isHighlighted) { - return Container(color: isHighlighted ? _highlightColor(context) : null); - } - - @override - Widget build(BuildContext context) { - final ThemeData themeData = Theme.of(context); - final TextTheme textTheme = themeData.textTheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final int year = widget.displayedMonth.year; - final int month = widget.displayedMonth.month; - final int daysInMonth = DateUtils.getDaysInMonth(year, month); - final int dayOffset = DateUtils.firstDayOffset(year, month, localizations); - final int weeks = ((daysInMonth + dayOffset) / DateTime.daysPerWeek).ceil(); - final double gridHeight = - weeks * _monthItemRowHeight + (weeks - 1) * _monthItemSpaceBetweenRows; - final List dayItems = []; - - for (int i = 0; true; i += 1) { - // 1-based day of month, e.g. 1-31 for January, and 1-29 for February on - // a leap year. - final int day = i - dayOffset + 1; - if (day > daysInMonth) { - break; - } - if (day < 1) { - dayItems.add(Container()); - } else { - final DateTime dayToBuild = DateTime(year, month, day); - final Widget dayItem = _buildDayItem( - context, - dayToBuild, - dayOffset, - daysInMonth, - ); - dayItems.add(dayItem); - } - } - - // Add the leading/trailing edge containers to each week in order to - // correctly extend the range highlight. - final List paddedDayItems = []; - for (int i = 0; i < weeks; i++) { - final int start = i * DateTime.daysPerWeek; - final int end = math.min( - start + DateTime.daysPerWeek, - dayItems.length, - ); - final List weekList = dayItems.sublist(start, end); - - final DateTime dateAfterLeadingPadding = DateTime(year, month, start - dayOffset + 1); - // Only color the edge container if it is after the start date and - // on/before the end date. - final bool isLeadingInRange = - !(dayOffset > 0 && i == 0) && - widget.selectedDateStart != null && - widget.selectedDateEnd != null && - dateAfterLeadingPadding.isAfter(widget.selectedDateStart!) && - !dateAfterLeadingPadding.isAfter(widget.selectedDateEnd!); - weekList.insert(0, _buildEdgeContainer(context, isLeadingInRange)); - - // Only add a trailing edge container if it is for a full week and not a - // partial week. - if (end < dayItems.length || (end == dayItems.length && dayItems.length % DateTime.daysPerWeek == 0)) { - final DateTime dateBeforeTrailingPadding = - DateTime(year, month, end - dayOffset); - // Only color the edge container if it is on/after the start date and - // before the end date. - final bool isTrailingInRange = - widget.selectedDateStart != null && - widget.selectedDateEnd != null && - !dateBeforeTrailingPadding.isBefore(widget.selectedDateStart!) && - dateBeforeTrailingPadding.isBefore(widget.selectedDateEnd!); - weekList.add(_buildEdgeContainer(context, isTrailingInRange)); - } - - paddedDayItems.addAll(weekList); - } - - final double maxWidth = MediaQuery.of(context).orientation == Orientation.landscape - ? _maxCalendarWidthLandscape - : _maxCalendarWidthPortrait; - return Column( - children: [ - Container( - constraints: BoxConstraints(maxWidth: maxWidth), - height: _monthItemHeaderHeight, - padding: const EdgeInsets.symmetric(horizontal: 16), - alignment: AlignmentDirectional.centerStart, - child: ExcludeSemantics( - child: Text( - localizations.formatMonthYear(widget.displayedMonth), - style: textTheme.bodyText2!.apply(color: themeData.colorScheme.onSurface), - ), - ), - ), - Container( - constraints: BoxConstraints( - maxWidth: maxWidth, - maxHeight: gridHeight, - ), - child: GridView.custom( - physics: const NeverScrollableScrollPhysics(), - gridDelegate: _monthItemGridDelegate, - childrenDelegate: SliverChildListDelegate( - paddedDayItems, - addRepaintBoundaries: false, - ), - ), - ), - const SizedBox(height: _monthItemFooterHeight), - ], - ); - } -} - -/// Determines which style to use to paint the highlight. -enum _HighlightPainterStyle { - /// Paints nothing. - none, - - /// Paints a rectangle that occupies the leading half of the space. - highlightLeading, - - /// Paints a rectangle that occupies the trailing half of the space. - highlightTrailing, - - /// Paints a rectangle that occupies all available space. - highlightAll, -} - -/// This custom painter will add a background highlight to its child. -/// -/// This highlight will be drawn depending on the [style], [color], and -/// [textDirection] supplied. It will either paint a rectangle on the -/// left/right, a full rectangle, or nothing at all. This logic is determined by -/// a combination of the [style] and [textDirection]. -class _HighlightPainter extends CustomPainter { - _HighlightPainter({ - required this.color, - this.style = _HighlightPainterStyle.none, - this.textDirection, - }); - - final Color color; - final _HighlightPainterStyle style; - final TextDirection? textDirection; - - @override - void paint(Canvas canvas, Size size) { - if (style == _HighlightPainterStyle.none) { - return; - } - - final Paint paint = Paint() - ..color = color - ..style = PaintingStyle.fill; - - final Rect rectLeft = Rect.fromLTWH(0, 0, size.width / 2, size.height); - final Rect rectRight = Rect.fromLTWH(size.width / 2, 0, size.width / 2, size.height); - - switch (style) { - case _HighlightPainterStyle.highlightTrailing: - canvas.drawRect( - textDirection == TextDirection.ltr ? rectRight : rectLeft, - paint, - ); - break; - case _HighlightPainterStyle.highlightLeading: - canvas.drawRect( - textDirection == TextDirection.ltr ? rectLeft : rectRight, - paint, - ); - break; - case _HighlightPainterStyle.highlightAll: - canvas.drawRect( - Rect.fromLTWH(0, 0, size.width, size.height), - paint, - ); - break; - case _HighlightPainterStyle.none: - break; - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; -} - -class _InputDateRangePickerDialog extends StatelessWidget { - const _InputDateRangePickerDialog({ - required this.selectedStartDate, - required this.selectedEndDate, - required this.currentDate, - required this.picker, - required this.onConfirm, - required this.onCancel, - required this.confirmText, - required this.cancelText, - required this.helpText, - required this.entryModeButton, - }); - - final DateTime? selectedStartDate; - final DateTime? selectedEndDate; - final DateTime? currentDate; - final Widget picker; - final VoidCallback onConfirm; - final VoidCallback onCancel; - final String? confirmText; - final String? cancelText; - final String? helpText; - final Widget? entryModeButton; - - String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final String startText = _formatRangeStartDate(localizations, start, end); - final String endText = _formatRangeEndDate(localizations, start, end, now); - if (start == null || end == null) { - return localizations.unspecifiedDateRange; - } - if (Directionality.of(context) == TextDirection.ltr) { - return '$startText – $endText'; - } else { - return '$endText – $startText'; - } - } - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - - final Color onPrimarySurfaceColor = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.apply(color: onPrimarySurfaceColor) - : textTheme.headline4?.apply(color: onPrimarySurfaceColor); - final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); - final String semanticDateText = selectedStartDate != null && selectedEndDate != null - ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' - : ''; - - final Widget header = _DatePickerHeader( - helpText: helpText ?? localizations.dateRangePickerHelpText, - titleText: dateText, - titleSemanticsLabel: semanticDateText, - titleStyle: dateStyle, - orientation: orientation, - isShort: orientation == Orientation.landscape, - entryModeButton: entryModeButton, - ); - - final Widget actions = Container( - alignment: AlignmentDirectional.centerEnd, - constraints: const BoxConstraints(minHeight: 52.0), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: OverflowBar( - spacing: 8, - children: [ - TextButton( - onPressed: onCancel, - child: Text(cancelText ?? localizations.cancelButtonLabel), - ), - TextButton( - onPressed: onConfirm, - child: Text(confirmText ?? localizations.okButtonLabel), - ), - ], - ), - ); - - switch (orientation) { - case Orientation.portrait: - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Expanded(child: picker), - actions, - ], - ); - - case Orientation.landscape: - return Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Flexible( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(child: picker), - actions, - ], - ), - ), - ], - ); - } - } -} - -/// Provides a pair of text fields that allow the user to enter the start and -/// end dates that represent a range of dates. -class _InputDateRangePicker extends StatefulWidget { - /// Creates a row with two text fields configured to accept the start and end dates - /// of a date range. - _InputDateRangePicker({ - super.key, - DateTime? initialStartDate, - DateTime? initialEndDate, - required DateTime firstDate, - required DateTime lastDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - this.helpText, - this.errorFormatText, - this.errorInvalidText, - this.errorInvalidRangeText, - this.fieldStartHintText, - this.fieldEndHintText, - this.fieldStartLabelText, - this.fieldEndLabelText, - this.autofocus = false, - this.autovalidate = false, - }) : initialStartDate = initialStartDate == null ? null : DateUtils.dateOnly(initialStartDate), - initialEndDate = initialEndDate == null ? null : DateUtils.dateOnly(initialEndDate), - assert(firstDate != null), - firstDate = DateUtils.dateOnly(firstDate), - assert(lastDate != null), - lastDate = DateUtils.dateOnly(lastDate), - assert(firstDate != null), - assert(lastDate != null), - assert(autofocus != null), - assert(autovalidate != null); - - /// The [DateTime] that represents the start of the initial date range selection. - final DateTime? initialStartDate; - - /// The [DateTime] that represents the end of the initial date range selection. - final DateTime? initialEndDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// Called when the user changes the start date of the selected range. - final ValueChanged? onStartDateChanged; - - /// Called when the user changes the end date of the selected range. - final ValueChanged? onEndDateChanged; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String? helpText; - - /// Error text used to indicate the text in a field is not a valid date. - final String? errorFormatText; - - /// Error text used to indicate the date in a field is not in the valid range - /// of [firstDate] - [lastDate]. - final String? errorInvalidText; - - /// Error text used to indicate the dates given don't form a valid date - /// range (i.e. the start date is after the end date). - final String? errorInvalidRangeText; - - /// Hint text shown when the start date field is empty. - final String? fieldStartHintText; - - /// Hint text shown when the end date field is empty. - final String? fieldEndHintText; - - /// Label used for the start date field. - final String? fieldStartLabelText; - - /// Label used for the end date field. - final String? fieldEndLabelText; - - /// {@macro flutter.widgets.editableText.autofocus} - final bool autofocus; - - /// If true, this the date fields will validate and update their error text - /// immediately after every change. Otherwise, you must call - /// [_InputDateRangePickerState.validate] to validate. - final bool autovalidate; - - @override - _InputDateRangePickerState createState() => _InputDateRangePickerState(); -} - -/// The current state of an [_InputDateRangePicker]. Can be used to -/// [validate] the date field entries. -class _InputDateRangePickerState extends State<_InputDateRangePicker> { - late String _startInputText; - late String _endInputText; - DateTime? _startDate; - DateTime? _endDate; - late TextEditingController _startController; - late TextEditingController _endController; - String? _startErrorText; - String? _endErrorText; - bool _autoSelected = false; - - @override - void initState() { - super.initState(); - _startDate = widget.initialStartDate; - _startController = TextEditingController(); - _endDate = widget.initialEndDate; - _endController = TextEditingController(); - } - - @override - void dispose() { - _startController.dispose(); - _endController.dispose(); - super.dispose(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - if (_startDate != null) { - _startInputText = localizations.formatCompactDate(_startDate!); - final bool selectText = widget.autofocus && !_autoSelected; - _updateController(_startController, _startInputText, selectText); - _autoSelected = selectText; - } - - if (_endDate != null) { - _endInputText = localizations.formatCompactDate(_endDate!); - _updateController(_endController, _endInputText, false); - } - } - - /// Validates that the text in the start and end fields represent a valid - /// date range. - /// - /// Will return true if the range is valid. If not, it will - /// return false and display an appropriate error message under one of the - /// text fields. - bool validate() { - String? startError = _validateDate(_startDate); - final String? endError = _validateDate(_endDate); - if (startError == null && endError == null) { - if (_startDate!.isAfter(_endDate!)) { - startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel; - } - } - setState(() { - _startErrorText = startError; - _endErrorText = endError; - }); - return startError == null && endError == null; - } - - DateTime? _parseDate(String? text) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - return localizations.parseCompactDate(text); - } - - String? _validateDate(DateTime? date) { - if (date == null) { - return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel; - } else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) { - return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel; - } - return null; - } - - void _updateController(TextEditingController controller, String text, bool selectText) { - TextEditingValue textEditingValue = controller.value.copyWith(text: text); - if (selectText) { - textEditingValue = textEditingValue.copyWith(selection: TextSelection( - baseOffset: 0, - extentOffset: text.length, - )); - } - controller.value = textEditingValue; - } - - void _handleStartChanged(String text) { - setState(() { - _startInputText = text; - _startDate = _parseDate(text); - widget.onStartDateChanged?.call(_startDate); - }); - if (widget.autovalidate) { - validate(); - } - } - - void _handleEndChanged(String text) { - setState(() { - _endInputText = text; - _endDate = _parseDate(text); - widget.onEndDateChanged?.call(_endDate); - }); - if (widget.autovalidate) { - validate(); - } - } - - @override - Widget build(BuildContext context) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final InputDecorationTheme inputTheme = Theme.of(context).inputDecorationTheme; - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: TextField( - controller: _startController, - decoration: InputDecoration( - border: inputTheme.border ?? const UnderlineInputBorder(), - filled: inputTheme.filled, - hintText: widget.fieldStartHintText ?? localizations.dateHelpText, - labelText: widget.fieldStartLabelText ?? localizations.dateRangeStartLabel, - errorText: _startErrorText, - ), - keyboardType: TextInputType.datetime, - onChanged: _handleStartChanged, - autofocus: widget.autofocus, - ), - ), - const SizedBox(width: 8), - Expanded( - child: TextField( - controller: _endController, - decoration: InputDecoration( - border: inputTheme.border ?? const UnderlineInputBorder(), - filled: inputTheme.filled, - hintText: widget.fieldEndHintText ?? localizations.dateHelpText, - labelText: widget.fieldEndLabelText ?? localizations.dateRangeEndLabel, - errorText: _endErrorText, - ), - keyboardType: TextInputType.datetime, - onChanged: _handleEndChanged, - ), - ), - ], - ); - } -} diff --git a/packages/components/lib/project_ui/project_ui.dart b/packages/components/lib/project_ui/project_ui.dart deleted file mode 100644 index 6d54f3de..00000000 --- a/packages/components/lib/project_ui/project_ui.dart +++ /dev/null @@ -1,8 +0,0 @@ -export 'default/empty_search_page.dart'; -export 'default/empty_shower.dart'; -export 'default/error_shower.dart'; -export 'default/loading_shower.dart'; -export 'default/error_page.dart'; -export 'default/no_more_widget.dart'; -export 'wrapper/honour_wrapper.dart'; -export 'unit_app_bar.dart'; \ No newline at end of file diff --git a/packages/components/lib/toly_ui/code/code_widget.dart b/packages/components/lib/toly_ui/code/code_widget.dart deleted file mode 100644 index d98bf0f8..00000000 --- a/packages/components/lib/toly_ui/code/code_widget.dart +++ /dev/null @@ -1,50 +0,0 @@ - -/// create by 张风捷特烈 on 2020-04-15 -/// contact me by email 1981462002@qq.com -/// 说明: -import 'package:flutter/material.dart'; - -import 'high_light_code.dart'; -import 'highlighter_style.dart'; -import 'language/dart_languge.dart'; - -class CodeWidget extends StatelessWidget { - const CodeWidget({Key? key, required this.code,required this.style, this.fontSize = 13,this.fontFamily}) - : super(key: key); - - final String code; - final HighlighterStyle style; - final double fontSize; - final String? fontFamily; - - @override - Widget build(BuildContext context) { - Widget body; - Widget _codeWidget; - try { - _codeWidget = RichText( - text: TextSpan( - style: TextStyle(fontSize: fontSize,fontFamily: fontFamily), - children: [ - CodeHighlighter( - style: style, - language: const DartLanguage() - ).format(code)], - ), - ); - } catch (err) { - print(err); - _codeWidget = Text(code); - } - body = SingleChildScrollView( - child: Container( - child: _codeWidget, - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - color: style.backgroundColor ?? const Color(0xffF6F8FA), - borderRadius: const BorderRadius.all(Radius.circular(5.0))), - ), - ); - return body; - } -} \ No newline at end of file diff --git a/packages/components/lib/toly_ui/code/language/language.dart b/packages/components/lib/toly_ui/code/language/language.dart deleted file mode 100644 index c2ea52d4..00000000 --- a/packages/components/lib/toly_ui/code/language/language.dart +++ /dev/null @@ -1,17 +0,0 @@ -/// create by 张风捷特烈 on 2021/1/21 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class Language { - final String name; - - const Language(this.name); - - bool containsKeywords(String word); - - bool containsInTypes(String word); - - List get keywords; - - List get inTypes; -} diff --git a/packages/components/lib/toly_ui/ti/circle_image.dart b/packages/components/lib/toly_ui/ti/circle_image.dart deleted file mode 100644 index c1146cb8..00000000 --- a/packages/components/lib/toly_ui/ti/circle_image.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -class CircleImage extends StatelessWidget { - - const CircleImage({ - Key? key, - this.borderSize = 3, - required this.image, - this.size = 70, - this.shadowColor, - this.roundColor, - }) : super(key: key); - - final ImageProvider image; //图片 - final double size; //大小 - final Color? shadowColor; //阴影颜色 - final Color? roundColor; //边框颜色 - final double borderSize; - - @override - Widget build(BuildContext context) { - return Container( - width: size, - height: size, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: roundColor ?? Colors.white, - boxShadow: [ - BoxShadow( - color: shadowColor ?? Colors.grey.withOpacity(0.3), - offset: const Offset(0.0, 0.0), - blurRadius: 3.0, - spreadRadius: 0.0, - ), - ], - ), - child: Padding( - padding: EdgeInsets.all(borderSize), - child: DecoratedBox( - decoration: BoxDecoration( - image: DecorationImage( - image: image, - fit: BoxFit.cover, - filterQuality: FilterQuality.low), - shape: BoxShape.circle, - ), - ), - ), - ); - } -} diff --git a/packages/components/pubspec.yaml b/packages/components/pubspec.yaml deleted file mode 100644 index d5fd45b7..00000000 --- a/packages/components/pubspec.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: components -description: A new Flutter package project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - flutter_spinkit: ^5.1.0 # loading - flutter_markdown: ^0.6.4 # markdown -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/db_storage/lib/db_storage.dart b/packages/db_storage/lib/db_storage.dart deleted file mode 100644 index c8507f3a..00000000 --- a/packages/db_storage/lib/db_storage.dart +++ /dev/null @@ -1,13 +0,0 @@ -library db_storage; - - -export 'src/dao/category_dao.dart'; -export 'src/dao/like_dao.dart'; -export 'src/dao/node_dao.dart'; -export 'src/dao/widget_dao.dart'; - -export 'src/bean/category_po.dart'; -export 'src/bean/node_po.dart'; -export 'src/bean/widget_po.dart'; -export 'src/local_db.dart'; -export 'src/db_open_helper.dart'; diff --git a/packages/db_storage/lib/src/dao/category_dao.dart b/packages/db_storage/lib/src/dao/category_dao.dart deleted file mode 100644 index 8d0bd4e0..00000000 --- a/packages/db_storage/lib/src/dao/category_dao.dart +++ /dev/null @@ -1,199 +0,0 @@ - -import 'package:sqflite/sqflite.dart'; -import '../bean/category_po.dart'; - -//""" -// CREATE TABLE IF NOT EXISTS category_widget( -// id INTEGER PRIMARY KEY AUTOINCREMENT, -// name VARCHAR(64) NOT NULL, -// color VARCHAR(9) DEFAULT '#FF2196F3', -// info VARCHAR(256) DEFAULT '这里什么都没有...', -// created DATETIME NOT NULL, -// updated DATETIME NOT NULL, -// priority INTEGER DEFAULT 0, -// image VARCHAR(128) NULL image DEFAULT '' -// ); -//"""; - -class CategoryDao { - final Database db; - - CategoryDao(this.db); - - - - Future insert(CategoryPo category) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "category(id,name,color,info,priority,image,created,updated) " - "VALUES (?,?,?,?,?,?,?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ - category.id, - category.name, - category.color, - category.info, - category.priority, - category.image, - category.created?.toIso8601String(), - category.updated.toIso8601String(), - ])); - } - - Future update(CategoryPo widget) async { - //插入方法 - String updateSql = //插入数据 - "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " - "WHERE id = ?"; - - return await db.transaction((tran) async => - await tran.rawUpdate(updateSql, [ - widget.name, - widget.color, - widget.info, - widget.priority, - widget.image, - widget.updated.toIso8601String(), - widget.id, - ])); - } - - - - Future addWidget(int categoryId,int widgetId,) async { - String addSql = //插入数据 - "INSERT INTO " - "category_widget(widgetId,categoryId) " - "VALUES (?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ - widgetId, - categoryId, - ])); - } - - Future addWidgets(int categoryId,List widgetIds) async { - String addSql = //插入数据 - "INSERT INTO " - "category_widget(widgetId,categoryId) VALUES "; - - String args = ''; - - for(int i=0;i< widgetIds.length;i++){ - args+= "(${widgetIds[i]},$categoryId)"; - if(i==widgetIds.length-1){ - args+=";"; - }else{ - args+=","; - } - } - addSql += args; - return await db.transaction((tran) async => await tran.rawInsert(addSql)); - } - - Future existByName(String name) async { - String sql = //插入数据 - "SELECT COUNT(name) as count FROM category " - "WHERE name = ?"; - List> rawData = await db.rawQuery(sql, [name]); - if (rawData.isNotEmpty) { - return rawData[0]['count'] > 0; - } - return false; - } - - Future>> queryAll() async { - List> data = await db.rawQuery( - "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" - "FROM category AS c " - "LEFT JOIN category_widget AS cw " - "ON c.id = cw.categoryId GROUP BY c.id " - "ORDER BY priority DESC,created DESC", - []); - return data; - } - - Future> categoryWidgetIds(int id) async { - List> data = await db.rawQuery( - "SELECT categoryId FROM `category_widget`" - "WHERE widgetId = ?", - [id]); - return data.toList().map((e)=>e["categoryId"]).toList(); - } - - - - Future deleteCollect(int id) async { - await db.execute( - "DELETE FROM category_widget " - "WHERE categoryId = ?", - [id]); - return await db.execute( - "DELETE FROM category " - "WHERE id = ?", - [id]); - } - - Future clear() async { - await db.execute( - "DELETE FROM category_widget " - "WHERE categoryId >0"); - return await db.execute( - "DELETE FROM category " - "WHERE id > 0"); - } - - Future removeWidget(int categoryId, int widgetId) async { - //插入方法 - String deleteSql = //插入数据 - "DELETE FROM " - "category_widget WHERE categoryId = ? AND widgetId = ? "; - return await db - .transaction((tran) async => await tran.rawInsert(deleteSql, [ - categoryId, - widgetId, - ])); - } - - Future existWidgetInCollect(int categoryId, int widgetId) async { - String sql = //插入数据 - "SELECT COUNT(id) as count FROM category_widget " - "WHERE categoryId = ? AND widgetId = ?"; - List> rawData = await db.rawQuery(sql, [categoryId, widgetId]); - if (rawData.isNotEmpty) { - return rawData[0]['count'] > 0; - } - return false; - } - - Future toggleCollect(int categoryId, int widgetId) async { - if (await existWidgetInCollect(categoryId, widgetId)) { - //已存在: 移除 - await removeWidget(categoryId, widgetId); - } else { - await addWidget(categoryId, widgetId); - } - } - - Future toggleCollectDefault(int widgetId) async { - await toggleCollect(1, widgetId); - } - - Future>> loadCollectWidgets(int categoryId) async{ - String querySql = //插入数据 - "SELECT * FROM widget " - "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " - "ORDER BY lever DESC"; - - return await db.rawQuery(querySql,[categoryId]); - } - - Future> loadCollectWidgetIds(int categoryId) async{ - String querySql = //插入数据 - "SELECT id FROM widget " - "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " - "ORDER BY lever DESC"; - - var data = await db.rawQuery(querySql,[categoryId]); - return data.map((e) => e["id"] as int).toList(); - } -} diff --git a/packages/db_storage/lib/src/dao/node_dao.dart b/packages/db_storage/lib/src/dao/node_dao.dart deleted file mode 100644 index 4dc55288..00000000 --- a/packages/db_storage/lib/src/dao/node_dao.dart +++ /dev/null @@ -1,39 +0,0 @@ -import '../bean/node_po.dart'; -import 'package:sqflite/sqflite.dart'; - -class NodeDao { - - final Database db; - - NodeDao(this.db); - - Future insert(NodePo widget) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "node(widgetId,name,priority,subtitle,code) " - "VALUES (?,?,?,?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.widgetId, - widget.name, - widget.priority, - widget.subtitle, - widget.code - ])); - } - - Future>> queryAll() async { - //插入方法 - return await db.rawQuery("SELECT * " - "FROM node"); - } - - //根据 id 查询组件 node - Future>> queryById(int id) async { - return await db.rawQuery( - "SELECT name,subtitle,code " - "FROM node " - "WHERE widgetId = ? ORDER BY priority", - [id]); - } -} diff --git a/packages/db_storage/lib/src/dao/widget_dao.dart b/packages/db_storage/lib/src/dao/widget_dao.dart deleted file mode 100644 index 99c806a5..00000000 --- a/packages/db_storage/lib/src/dao/widget_dao.dart +++ /dev/null @@ -1,75 +0,0 @@ - -import 'package:sqflite/sqflite.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../bean/widget_po.dart'; - - -class WidgetDao { - - final Database db; - - WidgetDao(this.db); - - Future insert(WidgetPo widget) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " - "VALUES (?,?,?,?,?,?,?,?);"; - return db.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.id, - widget.name, - widget.nameCN, - widget.deprecated, - widget.family, - widget.lever, - widget.linkWidget, - widget.info - ])); - } - - Future>> queryAll() async { - return db.rawQuery("SELECT * FROM widget"); - } - - Future>> queryByFamily(WidgetFamily family) async { - return db.rawQuery( - "SELECT * " - "FROM widget WHERE family = ? ORDER BY lever DESC", - [family.index]); - } - - Future>> queryByIds(List ids) async { - if (ids.isEmpty) { - return []; - } - String sql = "SELECT * " - "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; - - return db.rawQuery(sql, [...ids]); - } - - Future>> search(WidgetFilter arguments) async { - // 保证 name 参数为空时,不进行搜索 - if (arguments.name.isEmpty) { - return []; - } - // _表示 name 任意 - String name = arguments.name == '*' ? '' : arguments.name; - bool hasFamily = arguments.family != null; - String familySql = hasFamily ? ' AND family = ?' : ''; - List familyArg = hasFamily ? [arguments.family!.index] : []; - List starArg = arguments.stars; - // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 - if (arguments.stars.reduce((a, b) => a + b) == -5) { - starArg = [1, 2, 3, 4, 5]; - } - return db.rawQuery( - "SELECT * " - "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC", - ["%$name%", ...familyArg, ...starArg]); - } -} - - diff --git a/packages/db_storage/lib/src/db_open_helper.dart b/packages/db_storage/lib/src/db_open_helper.dart deleted file mode 100644 index 45ffe979..00000000 --- a/packages/db_storage/lib/src/db_open_helper.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'dart:io'; - -import 'package:path_provider/path_provider.dart'; -import 'package:path/path.dart' as path; -import 'dart:ffi'; - -import 'package:sqlite3/open.dart'; -import 'package:sqlite3/sqlite3.dart'; -import 'package:path/path.dart'; - - -class DbOpenHelper{ - - static void setupDatabase(){ - if(Platform.isWindows){ - String location = Directory.current.path; - _windowsInit(join(location, 'sqlite3.dll')); - } - } - - static void _windowsInit(String path) { - open.overrideFor(OperatingSystem.windows, () { - try { - return DynamicLibrary.open(path); - } catch (e) { - stderr.writeln('Failed to load sqlite3.dll at $path'); - rethrow; - } - }); - sqlite3.openInMemory().dispose(); - } - - static Future getDbDirPath() async{ - Directory appDocDir = await getApplicationDocumentsDirectory(); - String dirName = 'databases'; - String dirPath = path.join(appDocDir.path, dirName); - - if(Platform.isAndroid){ - dirPath = path.join(appDocDir.parent.path, dirName); - } - if(Platform.isWindows||Platform.isLinux){ - dirPath = path.join(appDocDir.path, 'FlutterUnit','databases'); - } - - Directory result = Directory(dirPath); - if(!result.existsSync()){ - result.createSync(recursive: true); - } - print('====数据库所在文件夹: $dirPath======='); - return dirPath; - } -} \ No newline at end of file diff --git a/packages/db_storage/lib/src/local_db.dart b/packages/db_storage/lib/src/local_db.dart deleted file mode 100644 index fe66d9da..00000000 --- a/packages/db_storage/lib/src/local_db.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'dart:io'; - -import 'package:db_storage/db_storage.dart'; - -import 'db_open_helper.dart'; -import 'package:sqflite_common_ffi/sqflite_ffi.dart'; - -import 'package:path/path.dart' as path; -import 'package:sqflite/sqflite.dart'; - - -class LocalDb { - Database? _database; - - LocalDb._(); - - static LocalDb instance = LocalDb._(); - - late WidgetDao _widgetDao; - late CategoryDao _categoryDao; - late NodeDao _nodeDao; - late LikeDao _likeDao; - - WidgetDao get widgetDao => _widgetDao; - - CategoryDao get categoryDao => _categoryDao; - - NodeDao get nodeDao => _nodeDao; - - LikeDao get likeDao => _likeDao; - - Database get db => _database!; - bool get inited => _database!=null; - - Future initDb({String name = "flutter.db"}) async { - if (_database != null) return; - String databasesPath = await DbOpenHelper.getDbDirPath(); - String dbPath = path.join(databasesPath, name); - - if (Platform.isWindows||Platform.isLinux) { - DatabaseFactory databaseFactory = databaseFactoryFfi; - _database = await databaseFactory.openDatabase( - dbPath, - options: OpenDatabaseOptions( - // version: DbUpdater.VERSION, - // onCreate: _onCreate, - // onUpgrade: _onUpgrade, - // onOpen: _onOpen - ), - ); - }else{ - _database = await openDatabase(dbPath); - } - - _widgetDao = WidgetDao(_database!); - _categoryDao = CategoryDao(_database!); - _nodeDao = NodeDao(_database!); - _likeDao = LikeDao(_database!); - - print('初始化数据库....'); - } - - Future closeDb() async { - await _database?.close(); - _database = null; - } -} diff --git a/packages/db_storage/pubspec.yaml b/packages/db_storage/pubspec.yaml deleted file mode 100644 index c36ecb8f..00000000 --- a/packages/db_storage/pubspec.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: db_storage -description: A new Flutter project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.1 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - sqflite: ^2.0.2+1 # 数据库 - sqflite_common_ffi: ^2.1.1 # 数据库 - path_provider: ^2.0.11 # 路径 - widget_repository: - path: ../widget_repository - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart b/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart deleted file mode 100644 index 46055f45..00000000 --- a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'dart:ui'; - -import 'package:app_config/app_config.dart'; -import 'package:bloc/bloc.dart'; -import 'package:widget_repository/widget_repository.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/packages/old_fancy_mobile_ui/lib/home_page/background.dart b/packages/old_fancy_mobile_ui/lib/home_page/background.dart deleted file mode 100644 index 4d65a12b..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/background.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; - -class BackgroundShower extends StatelessWidget { - const BackgroundShower({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Opacity( - opacity: 0.05, - child: DecoratedBox( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/sabar.webp'), - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(400), - topLeft: Radius.circular(400))), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart deleted file mode 100644 index 6200a0df..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../widget_item/home_item_support.dart'; - -class DeskWidgetContent extends StatelessWidget { - final List items; - final double width; - - const DeskWidgetContent({Key? key,required this.items,required this.width}) : super(key: key); - - @override - Widget build(BuildContext context) { - // - // final SliverGridDelegateWithFixedCrossAxisCount gridDelegate = SliverGridDelegateWithFixedCrossAxisCount( - // crossAxisCount: 2, - // mainAxisSpacing: 10, - // crossAxisSpacing: 20, - // childAspectRatio: 3.2, - // ); - - SliverGridDelegate gridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 400, - mainAxisSpacing: 10, - mainAxisExtent: 100, - crossAxisSpacing: 20, - ); - - return SliverPadding( - padding: const EdgeInsets.all(15), - sliver: SliverGrid( - gridDelegate: gridDelegate, - delegate: SliverChildBuilderDelegate( - (_, int index) => _buildHomeItem(items[index]), - childCount: items.length), - ), - ); - } - - Widget _buildHomeItem(WidgetModel model) { - return BlocBuilder( - buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - builder: (context, state) { - int index = state.itemStyleIndex; - ShapeBorder? shapeBorder = HomeItemSupport.shapeBorderMap[index]; - return InkWell( - customBorder: shapeBorder, - onTap: ()=> _toDetail(context,model), - child: HomeItemSupport.get(model, index)); - }, - ); - } - - // Widget _buildHomeItem(WidgetModel model) => - // BlocBuilder( - // buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - // builder: (_, state) { - // return FeedbackWidget( - // a: 0.95, - // duration: const Duration(milliseconds: 200), - // onEnd: () => _toDetailPage(model), - // child: HomeItemSupport.get(model, state.itemStyleIndex)); - // }, - // ); - - void _toDetail(BuildContext context,WidgetModel model){ - // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart b/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart deleted file mode 100644 index 95cc2313..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart +++ /dev/null @@ -1,146 +0,0 @@ -import 'dart:math'; - -import 'package:app_config/app_config.dart'; -import 'package:components/project_ui/project_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../bloc/color_change_bloc.dart'; -import 'phone_widget_content.dart'; - -class FancyHomePage extends StatefulWidget { - - const FancyHomePage({Key? key}) : super(key: key); - - @override - _FancyHomePageState createState() => _FancyHomePageState(); -} - -class _FancyHomePageState extends State with AutomaticKeepAliveClientMixin { - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - body: Stack( - children: [ - BlocBuilder(builder: _buildBackground), - BlocBuilder( - builder: (_, state) => CustomScrollView( - slivers: [ - _buildPersistentHeader(), - _buildContent(state), - const SliverToBoxAdapter( - child: NoMoreWidget(), - ) - ], - )) - ], - )); - } - - Widget _buildPersistentHeader() => SliverPersistentHeader( - pinned: true, - delegate: FlexHeaderDelegate( - minHeight: 35 + 56.0, - maxHeight: 120.0, - childBuilder: (offset, max, min) { - double dy = max - 25 - offset; - if (dy < min - 25) { - dy = min - 25; - } - return TolyAppBar( - maxHeight: dy, - onItemClick: _switchTab, - ); - })); - - Widget _buildBackground(BuildContext context, AppState state) { - if (state.showBackGround) { - return const BackgroundShower(); - } - return const SizedBox.shrink(); - } - - Widget _buildContent(WidgetsState state) { - if (state is WidgetsLoading) { - return const SliverFillRemaining( - child: LoadingShower(), - ); - } - - if (state is WidgetsLoaded) { - List items = state.widgets; - if (items.isEmpty) { - return const SliverFillRemaining( - child: EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", - ), - ); - } - return SliverLayoutBuilder(builder: (_,c){ - if(c.crossAxisExtent>500){ - return DeskWidgetContent( - items: items, - width: c.crossAxisExtent, - ); - } - return FancyWidgetContent( - items: items, - ); - }); - } - - if (state is WidgetsLoadFailed) { - return SliverFillRemaining( - child: ErrorShower( - error: "数据加载异常:\n${state.error}", - )); - } - return Container(); - } - - void _switchTab(int index) { - WidgetFamily widgetFamily = WidgetFamily.values[index]; - context.read().change(Cons.tabColors[index],family: widgetFamily); - BlocProvider.of(context).add(EventTabTap(widgetFamily)); - } - - @override - bool get wantKeepAlive => true; -} - -class FlexHeaderDelegate extends SliverPersistentHeaderDelegate { - FlexHeaderDelegate({ - required this.minHeight, - required this.maxHeight, - required this.childBuilder, - }); - - final double minHeight; //最小高度 - final double maxHeight; //最大高度 - final Widget Function(double offset, double max, double min) - childBuilder; //最大高度 - - @override - double get minExtent => minHeight; - - @override - double get maxExtent => max(maxHeight, minHeight); - - @override - Widget build( - BuildContext context, double shrinkOffset, bool overlapsContent) { - return childBuilder(shrinkOffset, maxHeight, minHeight); - } - - @override //是否需要重建 - bool shouldRebuild(FlexHeaderDelegate oldDelegate) { - return maxHeight != oldDelegate.maxHeight || - minHeight != oldDelegate.minHeight; - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart deleted file mode 100644 index 727901ed..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -class FancyWidgetContent extends StatelessWidget { - final List items; - - const FancyWidgetContent({Key? key,required this.items}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => _buildHomeItem(context, items[index]), - childCount: items.length, - ), - ); - } - - Widget _buildHomeItem(BuildContext context, WidgetModel model) { - return BlocBuilder( - buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - builder: (context, state) { - int index = state.itemStyleIndex; - ShapeBorder? shapeBorder = HomeItemSupport.shapeBorderMap[index]; - return Padding( - padding: const EdgeInsets.only( - bottom: 10, top: 2, left: 10, right: 10), - child: InkWell( - customBorder: shapeBorder, - onTap: () => _toDetail(context, model), - child: HomeItemSupport.get(model, index)), - ); - }, - ); - - } - - void _toDetail(BuildContext context, WidgetModel model) { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart deleted file mode 100644 index 1afe60b7..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart +++ /dev/null @@ -1,215 +0,0 @@ -import 'package:flutter/material.dart'; - - -class TolyAppBar extends StatefulWidget { - final double maxHeight; - final Function(int)? onItemClick; - final int defaultIndex; - - const TolyAppBar({Key? key, required this.maxHeight, this.onItemClick, this.defaultIndex = 0}) : super(key: key); - - @override - _TolyAppBarState createState() => _TolyAppBarState(); - -} - -const BorderRadius _kBorderRadius = BorderRadius.only( - bottomLeft: Radius.circular(15), - bottomRight: Radius.circular(15), -); - -const TextStyle _kTabTextStyle = TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(0.5, 0.5), blurRadius: 0.5) -]); - -class _TolyAppBarState extends State - with SingleTickerProviderStateMixin { - // double? _width; - int _selectIndex = 0; - int _prevSelectIndex = 0; - - static const List colors = [ - 0xff44D1FD, - 0xffFD4F43, - 0xffB375FF, - 0xFF4CAF50, - 0xFFFF9800, - 0xFF00F1F1, - 0xFFDBD83F - ]; - - static const List info = [ - 'Stles', - 'Stful', - 'Scrow', - 'Mcrow', - 'Sliver', - 'Proxy', - 'Other' - ]; - - static const List semantics = [ - '无状态组件', - '有状态组件', - '单子组件', - '多子组件', - '滑动组件', - '代理组件', - '其他组件' - ]; - - late AnimationController _controller; - late Animation circleAnim; - late Animation heightAnim; - late Animation backCircleAnim; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - value: 1, - duration: const Duration(milliseconds: 300), - vsync: this, - ); - circleAnim = circleTween.animate(_controller); - heightAnim = CurveTween(curve: Curves.ease).animate(_controller); - backCircleAnim = ReverseAnimation(circleAnim); - - _selectIndex = widget.defaultIndex; - } - - int get nextIndex => (_selectIndex + 1) % colors.length; - - Tween circleTween = Tween(begin: 1, end: 0); - - @override - Widget build(BuildContext context) { - // _width = MediaQuery.of(context).size.width / colors.length; - return LayoutBuilder( - builder:(_,c)=> Center( - child:Flow( - delegate: TolyAppBarDelegate( - _selectIndex, - _prevSelectIndex, - widget.maxHeight, - repaint: heightAnim, - ), - children: [ - ...colors - .map((e) => GestureDetector( - onTap: () => _onTap(e), - child: _buildChild(e,c.maxWidth/ colors.length), - )) - .toList(), - ...colors.map((e) { - Widget child = CircleAvatar( - backgroundColor: Color(e), - radius: 6, - ); - if (e == colors[_selectIndex]) { - return ScaleTransition(scale: circleAnim, child: child); - } - if (e == colors[_prevSelectIndex]) { - return ScaleTransition(scale: backCircleAnim, child: child); - } - return child; - }) - ]), - ), - ); - } - - Widget _buildChild(int color,double width) { - ThemeData themeData = Theme.of(context); - bool isDark = themeData.brightness == Brightness.dark; - int index = colors.indexOf(color); - return Container( - alignment: const Alignment(0, 0.4), - decoration: BoxDecoration(boxShadow: [ - if(!isDark) - BoxShadow( - color: _selectIndex == colors.indexOf(color) - ? Colors.transparent - : Color(colors[_selectIndex]), - offset: const Offset(1, 1), - blurRadius: 2) - ], color: Color(color), borderRadius: _kBorderRadius), - height: widget.maxHeight + 20, - width: width, - child: Text( - info[index], - style: _kTabTextStyle, - semanticsLabel: '您当前点击了:${semantics[index]}', - ), - ); - } - - void _onTap(int color) { - if (_selectIndex == colors.indexOf(color)) return; - setState(() { - _controller.reset(); - _controller.forward(); - _prevSelectIndex = _selectIndex; - _selectIndex = colors.indexOf(color); - widget.onItemClick?.call(_selectIndex); - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class TolyAppBarDelegate extends FlowDelegate { - final int selectIndex; - final int prevSelectIndex; - final double height; - final Animation repaint; - - TolyAppBarDelegate(this.selectIndex, this.prevSelectIndex, this.height, - {required this.repaint}) - : super(repaint: repaint); - - double get factor => repaint.value; - - @override - void paintChildren(FlowPaintingContext context) { - double ox = 0; - double obx = 0; - - for (int i = 0; i < context.childCount / 2; i++) { - Size cSize = context.getChildSize(i)??Size.zero; - if (i == selectIndex) { - context.paintChild(i, - transform: Matrix4.translationValues(ox, 20.0 * factor - 20, 0.0)); - ox += cSize.width; - } else if (i == prevSelectIndex) { - context.paintChild(i, - transform: - Matrix4.translationValues(ox, 20.0 * (1 - factor) - 20, 0.0)); - ox += cSize.width; - } else { - context.paintChild(i, - transform: Matrix4.translationValues(ox, -20, 0.0)); - ox += cSize.width; - } - } - - // 绘制小点 - for (int i = (context.childCount / 2).floor(); i < context.childCount; i++) { - Size size = context.getChildSize(0)??Size.zero; - context.paintChild(i, - transform: Matrix4.translationValues( - obx + size.width / 2 - 5, height + 5, 0)); - obx += size.width; - } - } - - @override - bool shouldRepaint(TolyAppBarDelegate oldDelegate) => - oldDelegate.selectIndex != selectIndex || - oldDelegate.height != height || - oldDelegate.repaint != repaint; -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart deleted file mode 100644 index acc0ecbe..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart +++ /dev/null @@ -1,200 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020-04-11 -/// contact me by email 1981462002@qq.com -/// 说明: 自定义底部导航栏 - -typedef IndexTapCallback = void Function(int); -typedef IndexLongTapCallback = void Function(BuildContext, int); - -class UnitBottomBar extends StatefulWidget { - final Color color; - final int initPosition; - // item 点击事件 - final IndexTapCallback? onItemTap; - - // item 长按事件 - final IndexLongTapCallback? onItemLongTap; - - const UnitBottomBar({Key? key, - this.color = Colors.blue, - this.initPosition = 0, - required this.onItemTap, - this.onItemLongTap, - }) : super(key: key); - - @override - _UnitBottomBarState createState() => _UnitBottomBarState(); -} - -class _UnitBottomBarState extends State { - int _position = 0; - - @override - void initState() { - super.initState(); - _position = widget.initPosition; - } - - final NotchedShape shape = const CircularNotchedRectangle(); - - final borderTR = const BorderRadius.only( - topRight: Radius.circular(10), - ); - - final borderTL = const BorderRadius.only(topLeft: Radius.circular(10)); - final paddingTR = const EdgeInsets.only(top: 2, right: 2); - final paddingTL = const EdgeInsets.only(top: 2, left: 2); - final paddingL = const EdgeInsets.only(left: 8); - final paddingR = const EdgeInsets.only(right: 8); - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - Color get color { - if(isDark){ - return Theme.of(context).bottomNavigationBarTheme.backgroundColor??const Color(0xff181818); - }else{ - return widget.color; - } - } - - @override - Widget build(BuildContext context) { - return BottomAppBar( - elevation: 0, - shape: shape, - notchMargin: 5, - color: color, - child: IconTheme( - data: IconTheme.of(context).copyWith(color: isDark?null:Colors.white, size: 25), - child: Stack( - children: [ - _buildLeftBtn(context), - Positioned( - right: 0, - child: _buildRightBtn(context), - ), - ], - ), - )); - } - - Widget _buildLeftBtn(BuildContext context) => Material( - shape: RoundedRectangleBorder(borderRadius: borderTR), - child: Container( - margin: paddingTR, - alignment: Alignment.center, - decoration: BoxDecoration( - color: color.withAlpha(88), borderRadius: borderTR), - height: SizeUnit.bottom_nav_height, - width: SizeUnit.bottom_nav_right_width, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(0), - onLongPressed: () => _onLongPress(context, 0), - child: Container( - padding: paddingL, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.icon_layout, - size: getIconSizeByPosition(0), - color: getIconColorByPosition(0), - )), - ), - ), - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(1), - child: Container( - height: SizeUnit.bottom_nav_height, - padding: paddingR, - child: Icon( - TolyIcon.dingzhi1, - size: getIconSizeByPosition(1), - color: getIconColorByPosition(1), - )), - ), - ), - ], - ), - ), - ); - - Widget _buildRightBtn(BuildContext context) => Material( - shape: RoundedRectangleBorder(borderRadius: borderTL), - child: Container( - margin: paddingTL, - alignment: Alignment.center, - decoration: BoxDecoration( - color: color.withAlpha(88), borderRadius: borderTL), - height: SizeUnit.bottom_nav_height, - width: SizeUnit.bottom_nav_right_width, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(2), - child: Container( - padding: paddingL, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.icon_collect, - size: getIconSizeByPosition(2), - color: getIconColorByPosition(2), - )), - ), - ), - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(3), - onLongPressed: () => _onLongPress(context, 3), - child: Stack( - children: [ - Container( - padding: paddingR, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.yonghu, - size: getIconSizeByPosition(3), - color: getIconColorByPosition(3), - )), - // const Positioned( - // left: 20, - // top: 5, - // child: UpdateRedPoint()) - ], - ), - ), - ), - ], - ), - ), - ); - - double getIconSizeByPosition(int position) => _position == position - ? SizeUnit.active_bottom_nav_icon - : SizeUnit.default_bottom_nav_icon; - - Color getIconColorByPosition(int position) => - _position == position ? isDark? Colors.blue: widget.color : Colors.white; - - void _updateIndex(int index) { - setState(() { - _position = index; - widget.onItemTap?.call(_position); - }); - } - - void _onLongPress(BuildContext context, int index) { - widget.onItemLongTap?.call(context, index); - } - - -} diff --git a/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart b/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart deleted file mode 100644 index 7e1a7393..00000000 --- a/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart +++ /dev/null @@ -1,18 +0,0 @@ -library old_fancy_mobile_ui; - -export 'widget_item/coupon_widget_list_item.dart'; -export 'widget_item/home_item_support.dart'; -export 'widget_item/simple_widget_list_item.dart'; -export 'widget_item/techno_widget_list_item.dart'; - -export 'splash/flutter_unit_splash.dart'; -export 'splash/flutter_unit_text.dart'; -export 'splash/splash_bottom.dart'; -export 'splash/unit_paint.dart'; -export 'splash/unit_splash.dart'; - -export 'home_page/background.dart'; -export 'home_page/desk_widget_content.dart'; -export 'home_page/toly_app_bar.dart'; -export 'home_page/unit_bottom_bar.dart'; -export 'home_page/unit_bottom_bar.dart'; \ No newline at end of file diff --git a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart deleted file mode 100644 index f42e54f1..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - - - -class FlutterUnitSplash extends StatefulWidget { - const FlutterUnitSplash({Key? key}) : super(key: key); - - @override - State createState() => _FlutterUnitSplashState(); -} - -class _FlutterUnitSplashState extends State { - - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return BlocListener( - listener: _listenStart, - child: Material( - child: Center( - child: Text('捷特', textDirection: TextDirection.ltr,), - ), - ), - ); - } - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - print('======_listenStart========'); - BlocProvider.of(context).add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - // _loaded = true; - // if(_splashDone){ - // Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - // } - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart b/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart deleted file mode 100644 index 489d9342..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'dart:async'; -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; - -class SplashBottom extends StatefulWidget { - const SplashBottom({Key? key}) : super(key: key); - - - - @override - _SplashBottomState createState() => _SplashBottomState(); -} - -class _SplashBottomState extends State { - bool _animStart = false; - - final Duration delayTime = const Duration(milliseconds: 600); - final Duration animTime = const Duration(milliseconds: 800); - final String logoPath = 'assets/images/icon_head.webp'; - - @override - void initState() { - super.initState(); - // 延迟 600 ms 后开启动画 - Future.delayed(delayTime).then(startAnim); - } - - void startAnim(value){ - setState(() { - _animStart = true; - }); - } - - @override - Widget build(BuildContext context) { - return AnimatedOpacity( - duration: animTime, - opacity: _animStart ? 1.0 : 0.0, - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - Text("Power By 张风捷特烈", style: UnitTextStyle.splashShadows), - Text("· 2021 · @编程之王 ", style: UnitTextStyle.splashShadows), - ], - )); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart b/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart deleted file mode 100644 index 6bf790a6..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页画板 - -class UnitPainter extends CustomPainter { - late Paint _paint; - final double width; - late Animation _curveAnim; - final Color color; - - final Path _path1 = Path(); - final Path _path2 = Path(); - final Path _path3 = Path(); - final Path _path4 = Path(); - - UnitPainter( - {this.width = 200.0, - this.color = Colors.blue, - required Animation repaint}) - : super(repaint: repaint) { - _paint = Paint(); - _curveAnim = CurvedAnimation(parent: repaint, curve: Curves.fastOutSlowIn); - } - - @override - void paint(Canvas canvas, Size size) { - _path1.reset(); - _path2.reset(); - _path3.reset(); - _path4.reset(); - var factor = _curveAnim.value; - canvas.translate( - size.width / 2 - width * 0.5, size.height / 2 - width * 0.5); - - canvas.save(); - canvas.translate( - -size.width / 2 * (1 - factor), -size.width / 2 * (1 - factor)); - drawColor1(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - size.width / 2 * (1 - factor), -size.width / 2 * (1 - factor)); - drawColor2(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - size.width / 2 * (1 - factor), size.width / 2 * (1 - factor)); - drawColor3(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - -size.width / 2 * (1 - factor), size.width / 2 * (1 - factor)); - drawColor4(canvas); - canvas.restore(); - } - - @override - bool shouldRepaint(UnitPainter oldDelegate) { - return - oldDelegate.color!=color|| - oldDelegate.width!=width|| - oldDelegate._curveAnim!=_curveAnim; - } - - void drawColor1(Canvas canvas) { - double factor = _curveAnim.value; - _path1.moveTo(0, 0); - _path1.lineTo(width * 0.618 * factor - 1, 0); - _path1.lineTo(width * 0.5 - 1, width * 0.5 - 1); - _path1.lineTo(0, width * (1 - 0.618) * factor - 1); - - canvas.drawPath(_clipAngle(_path1), _paint..color = Colors.red); - } - - void drawColor2(Canvas canvas) { - double factor = _curveAnim.value; - _path2.moveTo(width * 0.618 * factor, 0); - _path2.lineTo(width, 0); - _path2.lineTo(width, width * 0.618 * factor); - _path2.lineTo(width * 0.5, width * 0.5); - - canvas.drawPath(_clipAngle(_path2), _paint..color = Colors.blue); - } - - void drawColor3(Canvas canvas) { - double factor = _curveAnim.value; - _path3.moveTo(width * 0.5 + 1, width * 0.5 + 1); - _path3.lineTo(width, width * 0.618 * factor + 1); - _path3.lineTo(width, width); - _path3.lineTo(width * (1 - 0.618) * factor + 1, width); - canvas.drawPath(_clipAngle(_path3), _paint..color = Colors.green); - } - - void drawColor4(Canvas canvas) { - double factor = _curveAnim.value; - _path4.moveTo(0, width * (1 - 0.618) * factor); - _path4.lineTo(width * 0.5, width * 0.5); - _path4.lineTo(width * (1 - 0.618) * factor, width); - _path4.lineTo(0, width); - canvas.drawPath(_clipAngle(_path4), _paint..color = Colors.yellow); - } - - Path _clipAngle(Path path) { - return Path.combine( - PathOperation.difference, - path, - Path() - ..addOval(Rect.fromCircle( - center: Offset(width * 0.5, width * 0.5), radius: 25.0))); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart deleted file mode 100644 index 158ecdb1..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart +++ /dev/null @@ -1,174 +0,0 @@ -import 'package:app_config/app_config.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'flutter_unit_text.dart'; -import 'splash_bottom.dart'; -import 'unit_paint.dart'; -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页 - -class UnitSplash extends StatefulWidget { - const UnitSplash({Key? key}) : super(key: key); - - @override - _UnitSplashState createState() => _UnitSplashState(); -} - -class _UnitSplashState extends State with TickerProviderStateMixin { - late AnimationController _controller; - - final ValueNotifier _animEnd = ValueNotifier(false); - - final Duration animTime = const Duration(milliseconds: 1000); - final Duration delayTime = const Duration(milliseconds: 500); - final Duration fadeInTime = const Duration(milliseconds: 600); - - late Animation logoOffsetAnim; - late Animation headOffsetAnim; - late Animation logoScaleAnim; - - late UnitPainter unitPainter = UnitPainter(repaint: _controller); - - @override - void initState() { - super.initState(); - - SystemChrome.setSystemUIOverlayStyle( - const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - ), - ); - - _controller = AnimationController(duration: animTime, vsync: this) - ..addStatusListener(_listenStatus) - ..forward(); - - initAnimation(); - - Future.delayed(delayTime).then((e) => _animEnd.value = true); - } - - void initAnimation() { - logoOffsetAnim = Tween( - begin: const Offset(0, 0), - end: const Offset(0, -1.5), - ).animate(_controller); - - headOffsetAnim = Tween( - end: const Offset(0, 0), - begin: const Offset(0, -5), - ).animate(_controller); - - logoScaleAnim = Tween(begin: 2.0, end: 1.0).animate(_controller); - } - - @override - void dispose() { - _controller.dispose(); - _animEnd.dispose(); - super.dispose(); - } - - - bool _loaded = false; - bool _splashDone = false; - - - - void _listenStatus(AnimationStatus status) { - if (status == AnimationStatus.completed) { - Future.delayed(delayTime).then((e) { - _splashDone = true; - if(_loaded){ - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - } - }); - } - } - - - @override - Widget build(BuildContext context) { - final Size winSize = MediaQuery.of(context).size; - return Material( - child: BlocListener( - listener: _listenStart, - child: Stack( - alignment: Alignment.center, - children: [ - _buildFlutterLogo(), - CustomPaint( - painter: unitPainter, - size: winSize, - ), - _buildFlutterUnitText(winSize.height, winSize.width), - _buildHead(), - const Positioned(bottom: 15, child: SplashBottom()) - ], - ), - ), - ); - } - - Widget _buildFlutterUnitText(double winH, double winW) { - return Positioned( - top: winH / 1.4, - child: ValueListenableBuilder( - child: FlutterUnitText( - text: StrUnit.appName, - color: Theme.of(context).primaryColor, - ), - valueListenable: _animEnd, - builder: (_, bool value, Widget? child) => value - ? child! : const SizedBox(), - ), - ); - } - - Widget _buildFlutterLogo() { - return SlideTransition( - position: logoOffsetAnim, - child: RotationTransition( - turns: _controller, - child: ScaleTransition( - scale: logoScaleAnim, - child: FadeTransition( - opacity: _controller, - child: const SizedBox( - height: 120, - child: FlutterLogo( - size: 60, - ), - )), - )), - ); - } - - Widget _buildHead() => SlideTransition( - position: headOffsetAnim, - child: Image.asset( - 'assets/images/icon_head.webp', - width: 45, - height: 45, - ), - ); - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - BlocProvider.of(context).add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - _loaded = true; - if(_splashDone){ - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - } - } - -} - diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart deleted file mode 100644 index c63fa659..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class CouponWidgetListItem extends StatelessWidget { - final WidgetModel data; - final bool hasTopHole; - final bool hasBottomHole; - final bool isClip; - - const CouponWidgetListItem( - {Key? key, - required this.data, - this.hasTopHole = true, - this.hasBottomHole = false, - this.isClip = true}) - : super(key: key); - - final List colors = Cons.tabColors; - - @override - Widget build(BuildContext context) { - final CouponShapeBorder couponShapeBorder = CouponShapeBorder( - hasTopHole: hasTopHole, - hasBottomHole: hasBottomHole, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20); - - return Stack( - children: [ - isClip - ? ClipPath( - clipper: ShapeBorderClipper(shape: couponShapeBorder), - child: buildContent(), - ) - : buildContent(), - _buildCollectTag(Theme.of(context).primaryColor) - ], - ); - } - - Widget buildContent() => Container( - color: - data.death ? Colors.grey : colors[data.family.index].withAlpha(66), - height: 95, - padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - buildLeading(), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary()], - ), - ), - ], - ), - ); - - Widget buildLeading() => Padding( - padding: const EdgeInsets.all(5.0), - child: Hero( - tag: "hero_widget_image_${data.id}", - child: Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 60, - color: invColor, - ), - ), - ), - ); - - Color get invColor { - return colors[data.family.index]; - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 20 - 6.0), - child: Tag( - color: color, - shadowHeight: 6.0, - size: const Size(15, 20), - ), - ), - ); - })); - } - - Widget _buildTitle() { - return Expanded( - child: Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated - ? TextDecoration.lineThrough - : TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - StarScore( - star: Star(emptyColor: Colors.white, size: 15, fillColor: invColor), - score: data.lever, - ), - ], - ), - ); - } - - Widget _buildSummary() { - return Padding( - padding: const EdgeInsets.only(left: 10, bottom: 10, top: 5), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.grey[600], fontSize: 14, shadows: const [ - Shadow(color: Colors.white, offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart deleted file mode 100644 index ac5667cb..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'dart:math'; - -import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'coupon_widget_list_item.dart'; -import 'simple_widget_list_item.dart'; -import 'techno_widget_list_item.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -class HomeItemSupport { - - static Map shapeBorderMap={ - 1: TechnoShapeBorder(), - 2: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), - 3: const CouponShapeBorder( - hasTopHole: true, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - 4: const CouponShapeBorder( - hasTopHole: false, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - 5: const CouponShapeBorder( - hasTopHole: true, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - }; - - static Widget get( - WidgetModel model, - int index, - ) { - switch (index) { - case 1: - return TechnoWidgetListItem(data: model); - case 2: - return SimpleWidgetListItem(data: model); - case 3: - return CouponWidgetListItem(data: model); - case 4: - return CouponWidgetListItem(hasTopHole: false, data: model); - case 5: - return CouponWidgetListItem( - hasTopHole: true, hasBottomHole: true, data: model); - case 6: - return CouponWidgetListItem(isClip: false, data: model); - } - return TechnoWidgetListItem(data: model); - } - - static List itemSimples() => [ - Container( - height: 10, - ), - TechnoWidgetListItem(data: getContainer()), - SimpleWidgetListItem(data: getContainer()), - CouponWidgetListItem(data: getContainer()), - CouponWidgetListItem(hasTopHole: false, data: getContainer()), - CouponWidgetListItem( - hasTopHole: true, hasBottomHole: true, data: getContainer()), - CouponWidgetListItem(isClip: false, data: getContainer()), - ]; - - static WidgetModel getContainer() => WidgetModel( - id: Random().nextInt(10000), - name: 'Container', - nameCN: "", - links: const [], - lever: 5, - family: WidgetFamily.statelessWidget, - info: '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...'); -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart deleted file mode 100644 index b45cbe5d..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart +++ /dev/null @@ -1,145 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2020/11/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -class SimpleWidgetListItem extends StatelessWidget { - final WidgetModel data; - - const SimpleWidgetListItem({Key? key, - required this.data, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: itemColor.withAlpha(66), - borderRadius: BorderRadius.circular(6) - ), - // margin: const EdgeInsets.only(bottom: 10,top:2,left: 10,right: 10), - child: Stack( - children: [ - Container( - height: 95, - padding: - const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - Wrap( - spacing: 5, - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Hero( - tag: "hero_widget_image_${data.id}", - child: _buildLeading()), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary()], - ), - ), - ], - ), - ), - _buildCollectTag(Theme.of(context).primaryColor) - ], - ), - ); - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 30 - 8.0), - child: Tag( - color: color, - shadowHeight: 8.0, - size: const Size(20, 30), - ), - ), - ); - })); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 60, - color: itemColor, - ), - ) - : CircleImage( - image: data.image!, - size: 55, - ), - ); - - Color get itemColor => Cons.tabColors[data.family.index]; - - Widget _buildTitle() { - return Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated?TextDecoration.lineThrough:TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - ], - ); - } - - Widget _buildSummary() { - return Container( - padding: const EdgeInsets.only(left: 10), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.grey[600], fontSize: 14, shadows: const [ - Shadow(color: Colors.white, offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart deleted file mode 100644 index 9b28f14e..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; - -class TechnoWidgetListItem extends StatelessWidget { - final WidgetModel data; - - const TechnoWidgetListItem({Key? key, required this.data}) : super(key: key); - - @override - Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - bool isDark = themeData.brightness == Brightness.dark; - Color tagColor = isDark?themeData.floatingActionButtonTheme.backgroundColor!: themeData.primaryColor; - return Stack( - children: [ - Material( - // color: Colors.transparent, - color: isDark ? itemColor.withAlpha(22) : itemColor.withAlpha(66), - shape: TechnoShapeBorder(color: itemColor), - child: Container( - height: 95, - padding: - const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - Wrap( - spacing: 5, - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Hero( - tag: "hero_widget_image_${data.id}", - child: _buildLeading()), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary(isDark)], - ), - ), - ], - ), - ), - ), - _buildCollectTag(tagColor) - ], - ); - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 30 - 8.0), - child: Tag( - color: color, - shadowHeight: 8.0, - size: const Size(20, 30), - ), - ), - ); - })); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - // backgroundColor: Colors.bla, - text: data.name, - size: 60, - color: itemColor, - ), - ) - : CircleImage( - image: data.image!, - size: 55, - ), - ); - - Color get itemColor => data.death?Colors.grey:Cons.tabColors[data.family.index]; - - - Widget _buildTitle() { - return Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated?TextDecoration.lineThrough:TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - ], - ); - } - - Widget _buildSummary(bool isDark) { - return Container( - padding: const EdgeInsets.only(left: 10), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: isDark ? Colors.white : Colors.grey[600], - fontSize: 14, - shadows: [ - Shadow( - color: isDark ? Colors.grey[600]! : Colors.white, - offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/pubspec.yaml b/packages/old_fancy_mobile_ui/pubspec.yaml deleted file mode 100644 index 98b5fb68..00000000 --- a/packages/old_fancy_mobile_ui/pubspec.yaml +++ /dev/null @@ -1,65 +0,0 @@ -name: old_fancy_mobile_ui -description: A new Flutter package project. -version: 0.0.1 -homepage: -publish_to: none - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - url_launcher: ^6.0.20 # url - flutter_star: ^1.0.2 # 星星组件 - app_config: - path: ../app_config - components: - path: ../components - widget_module: - path: ../widget_module - widget_repository: - path: ../widget_repository -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart b/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart deleted file mode 100644 index 82b74e03..00000000 --- a/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -// import 'package:flutter_test/flutter_test.dart'; -// -// import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -// -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } diff --git a/packages/utils/lib/src/color_utils.dart b/packages/utils/lib/src/color_utils.dart deleted file mode 100644 index 4d0f8f43..00000000 --- a/packages/utils/lib/src/color_utils.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'random_provider.dart'; - -class ColorUtils { - static Color randomColor({ - int limitA = 120, - int limitR = 0, - int limitG = 0, - int limitB = 0, - }) { - Random random = RandomProvider.random; - int a = limitA + random.nextInt(256 - limitA); //透明度值 - int r = limitR + random.nextInt(256 - limitR); //红值 - int g = limitG + random.nextInt(256 - limitG); //绿值 - int b = limitB + random.nextInt(256 - limitB); //蓝值 - return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 - } - - - /// 使用方法: - /// var color1=ColorUtils.parse("#33428A43"); - /// var color2=ColorUtils.parse("33428A43"); - /// var color3=ColorUtils.parse("#428A43"); - ///var color4=ColorUtils.parse("428A43"); - /// - static Color parse(String code) { - Color result =Colors.red; - int value = 0 ; - if (code.contains("#")) { - try { - value = int.parse(code.substring(1), radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 1 + 6://6位 - result = Color(value + 0xFF000000); - break; - case 1 + 8://8位 - result = Color(value); - break; - default: - result =Colors.red; - } - }else { - try { - value = int.parse(code, radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 6: - result = Color(value + 0xFF000000); - break; - case 8: - result = Color(value); - break; - default: - result =Colors.red; - } - } - return result; - } - - static String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - diff --git a/packages/utils/lib/src/http_utils/task_result.dart b/packages/utils/lib/src/http_utils/task_result.dart deleted file mode 100644 index 50ba5cd1..00000000 --- a/packages/utils/lib/src/http_utils/task_result.dart +++ /dev/null @@ -1,21 +0,0 @@ -class TaskResult { - final T? data; - final bool success; - final String msg; - - TaskResult({this.data, this.success=false, this.msg=''}); - - @override - String toString() { - return 'RepResult{data: $data, status: $success, msg:$msg}'; - } - - const TaskResult.error({required this.msg}) - : success = false, - data = null; - - const TaskResult.success({ - this.data, - this.msg = '', - }) : success = true; -} diff --git a/packages/utils/lib/src/random_provider.dart b/packages/utils/lib/src/random_provider.dart deleted file mode 100644 index b34218b1..00000000 --- a/packages/utils/lib/src/random_provider.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'dart:math'; - -class RandomProvider{ - RandomProvider._();//私有化构造 - static final _random= Random(); - static Random get random =>_random; -} \ No newline at end of file diff --git a/packages/utils/pubspec.yaml b/packages/utils/pubspec.yaml deleted file mode 100644 index fc01dec4..00000000 --- a/packages/utils/pubspec.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: utils -description: utils -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.1 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - dio: ^4.0.4 # 网络请求 - jwt_decoder: ^2.0.1 # jwt 解析 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/widget_module/.metadata b/packages/widget_module/.metadata deleted file mode 100644 index fbfa6dfb..00000000 --- a/packages/widget_module/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849 - channel: stable - -project_type: package diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart deleted file mode 100644 index 5624fb13..00000000 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; - -part 'widget_detail_event.dart'; -part 'widget_detail_state.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -class WidgetDetailBloc extends Bloc { - final WidgetRepository widgetRepository; - final NodeRepository nodeRepository; - - WidgetDetailBloc({ - required this.widgetRepository, - required this.nodeRepository, - }) : super(DetailLoading()) { - on(_onFetchWidgetDetail); - on(_onResetDetailState); - } - - void _onFetchWidgetDetail( - FetchWidgetDetail event, Emitter emit) async { - emit(DetailLoading()); - try { - final WidgetModel widget = event.widgetModel; - final List nodes = - await nodeRepository.loadNode(widget.id); - final List links = - await widgetRepository.loadWidget(widget.links); - if (nodes.isEmpty) { - emit(DetailEmpty()); - } else { - emit(DetailWithData( - widgetModel: widget, - nodes: nodes, - links: links, - )); - } - } catch (_) { - emit(DetailFailed()); - } - } - - void _onResetDetailState( - ResetDetailState event, Emitter emit) async { - emit(DetailLoading()); - } -} diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart deleted file mode 100644 index 743a8ff8..00000000 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart +++ /dev/null @@ -1,31 +0,0 @@ -part of 'widget_detail_bloc.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 详情事件 - -abstract class DetailEvent extends Equatable { - const DetailEvent(); - @override - List get props => []; -} - - -class FetchWidgetDetail extends DetailEvent { - final WidgetModel widgetModel; - - const FetchWidgetDetail(this.widgetModel); - - @override - List get props => [widgetModel]; - - @override - String toString() { - return 'FetchWidgetDetail{widgetModel: $widgetModel}'; - } -} - - -class ResetDetailState extends DetailEvent { - -} \ No newline at end of file diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart deleted file mode 100644 index dd8771ee..00000000 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart +++ /dev/null @@ -1,39 +0,0 @@ -part of 'widget_detail_bloc.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 详情状态类 - -abstract class DetailState extends Equatable { - const DetailState(); - - @override - List get props => []; -} - -class DetailWithData extends DetailState { - final WidgetModel widgetModel; - final List links; - final List nodes; - - const DetailWithData({ - required this.widgetModel, - required this.nodes, - required this.links, - }); - - @override - List get props => [widgetModel,nodes]; - - @override - String toString() { - return 'DetailWithData{widget: $widgetModel, nodes: $nodes}'; - } - -} - -class DetailLoading extends DetailState {} - -class DetailEmpty extends DetailState {} - -class DetailFailed extends DetailState {} \ No newline at end of file diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart deleted file mode 100644 index 73bd1451..00000000 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ /dev/null @@ -1,48 +0,0 @@ - -import 'package:db_storage/db_storage.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; - -part 'widgets_event.dart'; -part 'widgets_state.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 处理主页 Widget 列表加载逻辑 - -class WidgetsBloc extends Bloc { - final WidgetRepository repository; - - WidgetsBloc({required this.repository}):super(const WidgetsLoading()){ - on(_onEventTabTap); - on(_onEventSearchWidget); - } - - void _onEventTabTap(EventTabTap event, Emitter emit) async{ - emit( const WidgetsLoading()); - WidgetFilter filter = WidgetFilter.family(event.family); - try { - final List widgets = await repository.searchWidgets( - filter - ); - emit( WidgetsLoaded(widgets: widgets,filter: filter)); - } catch (err) { - print(err); - emit(WidgetsLoadFailed(err.toString(),filter: filter)); - } - } - - void _onEventSearchWidget(EventSearchWidget event, Emitter emit) async{ - emit( const WidgetsLoading()); - try { - final List widgets = await repository.searchWidgets( - event.filter - ); - emit( WidgetsLoaded(widgets: widgets,filter: event.filter)); - } catch (err) { - print(err); - emit(WidgetsLoadFailed(err.toString(),filter: event.filter)); - } - } -} diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart deleted file mode 100644 index fbebca6b..00000000 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart +++ /dev/null @@ -1,26 +0,0 @@ -part of 'widgets_bloc.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class WidgetsEvent extends Equatable { - const WidgetsEvent(); - @override - List get props => []; -} - -class EventTabTap extends WidgetsEvent { - final WidgetFamily family; - - const EventTabTap(this.family); - - @override - List get props => [family]; -} - -class EventSearchWidget extends WidgetsEvent { - final WidgetFilter filter;//参数 - const EventSearchWidget({required this.filter}); -} - diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart deleted file mode 100644 index 8e5c707f..00000000 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart +++ /dev/null @@ -1,41 +0,0 @@ -part of 'widgets_bloc.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 主页 Widget 列表 状态类 - -abstract class WidgetsState extends Equatable { - final WidgetFilter filter; - const WidgetsState({required this.filter}); - - @override - List get props => []; -} - -class WidgetsLoading extends WidgetsState { - const WidgetsLoading({ WidgetFilter filter=const WidgetFilter()}) : super(filter:filter) ; -} - -class WidgetsLoaded extends WidgetsState { - final List widgets; - - const WidgetsLoaded( {this.widgets = const [],required WidgetFilter filter}): super(filter:filter); - - @override - List get props => [widgets]; - - @override - String toString() { - return 'WidgetsLoaded{widgets: $widgets}'; - } -} - -class WidgetsLoadFailed extends WidgetsState { - final String error; - - const WidgetsLoadFailed(this.error, - {required WidgetFilter filter}): super(filter:filter); - - @override - List get props => [error]; -} diff --git a/packages/widget_module/lib/widget_module.dart b/packages/widget_module/lib/widget_module.dart deleted file mode 100644 index a76ec00c..00000000 --- a/packages/widget_module/lib/widget_module.dart +++ /dev/null @@ -1,3 +0,0 @@ -library widget_module; - -export ''; \ No newline at end of file diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml deleted file mode 100644 index 33740d6e..00000000 --- a/packages/widget_module/pubspec.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: widget_module -description: A new Flutter package project. -version: 0.0.1 -homepage: -publish_to: none - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - equatable: ^2.0.3 # 相等辅助 - widget_repository: - path: ../widget_repository - db_storage: - path: ../db_storage -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart b/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart deleted file mode 100644 index dbf512fe..00000000 --- a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:db_storage/db_storage.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -/// create by 张风捷特烈 on 2020-04-21 -/// contact me by email 1981462002@qq.com -/// 说明: - -class CategoryDbRepository implements CategoryRepository { - - CategoryDao get categoryDao => LocalDb.instance.categoryDao; - LikeDao get likeDao => LocalDb.instance.likeDao; - - // CategoryDbRepository({required this.categoryDao,required this.likeDao}); - - @override - Future addCategory(CategoryPo categoryPo) async { - int success = await categoryDao.insert(categoryPo); - return success != -1; - } - - @override - Future check(int categoryId, int widgetId) async { - return await categoryDao.existWidgetInCollect(categoryId, widgetId); - } - - @override - Future deleteCategory(int id) async { - await categoryDao.deleteCollect(id); - } - - @override - Future> loadCategories() async { - List> data = await categoryDao.queryAll(); - List collects = - data.map((e) => CategoryPo.fromJson(e)).toList(); - return collects.map(CategoryModel.fromPo).toList(); - } - - @override - Future> loadCategoryWidgets({int categoryId = 0}) async { - List> rawData = - await categoryDao.loadCollectWidgets(categoryId); - List widgets = rawData.map((e) => WidgetPo.fromJson(e)).toList(); - return widgets.map(WidgetModel.fromPo).toList(); - } - - @override - Future toggleCategory(int categoryId, int widgetId) async { - return await categoryDao.toggleCollect(categoryId, widgetId); - } - - @override - Future> getCategoryByWidget(int widgetId) async { - return await categoryDao.categoryWidgetIds(widgetId); - } - - @override - Future updateCategory(CategoryPo categoryPo) async { - int success = await categoryDao.update(categoryPo); - return success != -1; - } - - @override - Future> loadCategoryData() async { - List> data = await categoryDao.queryAll(); - - Completer> completer = Completer(); - List collects = []; - - if (data.isEmpty) { - completer.complete([]); - } - - for (int i = 0; i < data.length; i++) { - List ids = await categoryDao.loadCollectWidgetIds(data[i]['id']); - collects.add(CategoryTo( - widgetIds: ids, - model: CategoryPo.fromJson(data[i]))); - - if (i == data.length - 1) { - completer.complete(collects); - } - } - - return completer.future; - } - - @override - Future syncCategoryByData(String data,String likeData) async { - try { - await categoryDao.clear(); - List dataMap = json.decode(data); - for (int i = 0; i < dataMap.length; i++) { - CategoryPo po = CategoryPo.fromNetJson(dataMap[i]["model"]); - List widgetIds = dataMap[i]["widgetIds"]; - await addCategory(po); - if (widgetIds.isNotEmpty&&po.id!=null) { - await categoryDao.addWidgets(po.id!, widgetIds); - } - } - List likeWidgets = (json.decode(likeData) as List).map((e) => e).toList(); - for (int i = 0; i < likeWidgets.length; i++) { - await likeDao.like(likeWidgets[i]); - } - return true; - } catch (e) { - print(e); - return false; - } - } -} diff --git a/packages/widget_repository/lib/src/db_impl/db_impl.dart b/packages/widget_repository/lib/src/db_impl/db_impl.dart deleted file mode 100644 index be0f2b85..00000000 --- a/packages/widget_repository/lib/src/db_impl/db_impl.dart +++ /dev/null @@ -1,4 +0,0 @@ - -export 'widget_db_repository.dart'; -export 'catagory_db_repository.dart'; -export 'node_db_repository.dart'; \ No newline at end of file diff --git a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart b/packages/widget_repository/lib/src/db_impl/node_db_repository.dart deleted file mode 100644 index e15b6fa5..00000000 --- a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart +++ /dev/null @@ -1,20 +0,0 @@ - -import 'package:db_storage/db_storage.dart'; -import 'package:widget_repository/src/model/node_model.dart'; - -import '../node_repository.dart'; - -class NodeDbRepository implements NodeRepository{ - - const NodeDbRepository(); - - NodeDao get nodeDao => LocalDb.instance.nodeDao; - - @override - Future> loadNode(int widgetId) async{ - List> data = await nodeDao.queryById(widgetId); - List nodes = data.map((e) => NodeModel.fromJson(e)).toList(); - return nodes; - } - -} \ No newline at end of file diff --git a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart b/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart deleted file mode 100644 index 083e95af..00000000 --- a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:widget_repository/src/model/model.dart'; -import 'package:widget_repository/src/widget_repository.dart'; -import 'package:db_storage/db_storage.dart'; - - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明 : Widget数据仓库 - -class WidgetDbRepository implements WidgetRepository { - - const WidgetDbRepository(); - - WidgetDao get widgetDao => LocalDb.instance.widgetDao; - LikeDao get likeDao => LocalDb.instance.likeDao; - - @override - Future> loadLikeWidgets() async { - List likeIds = await likeDao.likeWidgetIds(); - List> data = await widgetDao.queryByIds(likeIds); - List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - return widgets.map(WidgetModel.fromPo).toList(); - } - - @override - Future> searchWidgets(WidgetFilter args) async { - List> data = await widgetDao.search(args); - List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - return widgets.map(WidgetModel.fromPo).toList(); - } - - @override - Future> loadWidget(List id) async { - List> data = await widgetDao.queryByIds(id); - List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); - return []; - } - - @override - Future toggleLike( - int id, - ) { - return likeDao.toggleCollect(id); - } - - @override - Future collected(int id) async { - return await likeDao.like(id); - } -} diff --git a/packages/widget_repository/lib/src/model/enums.dart b/packages/widget_repository/lib/src/model/enums.dart deleted file mode 100644 index 37a33388..00000000 --- a/packages/widget_repository/lib/src/model/enums.dart +++ /dev/null @@ -1,13 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: - -enum WidgetFamily { - statelessWidget, - statefulWidget, - singleChildRenderObjectWidget, - multiChildRenderObjectWidget, - sliver, - proxyWidget, - other, -} diff --git a/packages/widget_repository/lib/src/model/model.dart b/packages/widget_repository/lib/src/model/model.dart deleted file mode 100644 index f79c5c9d..00000000 --- a/packages/widget_repository/lib/src/model/model.dart +++ /dev/null @@ -1,5 +0,0 @@ -export 'node_model.dart'; -export 'widget_model.dart'; -export 'category_model.dart'; -export 'enums.dart'; -export 'widget_filter.dart'; \ No newline at end of file diff --git a/packages/widget_repository/lib/src/model/node_model.dart b/packages/widget_repository/lib/src/model/node_model.dart deleted file mode 100644 index 15b89f6d..00000000 --- a/packages/widget_repository/lib/src/model/node_model.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020-03-04 -/// contact me by email 1981462002@qq.com -/// 说明: 详情页节点-展示-数据模型 - -class NodeModel extends Equatable { - final String name; - final String subtitle; - final String code; - - const NodeModel({ - required this.name, - required this.subtitle, - required this.code, - }); - - @override - List get props => [name, subtitle, code]; - - factory NodeModel.fromJson(Map map) { - return NodeModel( - name: map['name'], subtitle: map["subtitle"], code: map["code"]); - } - - @override - String toString() { - return 'Node{name: $name, subtitle: $subtitle, code: $code}'; - } -} diff --git a/packages/widget_repository/lib/src/model/widget_filter.dart b/packages/widget_repository/lib/src/model/widget_filter.dart deleted file mode 100644 index 59aab45a..00000000 --- a/packages/widget_repository/lib/src/model/widget_filter.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'enums.dart'; - -class WidgetFilter { - final String name; - final WidgetFamily? family; - final List stars; - - const WidgetFilter({ - this.name = '', - this.family, - this.stars = const [-1, -1, -1, -1, -1], - }); - - WidgetFilter.family( - this.family, { - this.name = '*', - this.stars = const [1, 2, 3, 4, 5], - }); - - WidgetFilter copyWith({ - String? name, - WidgetFamily? family, - List? stars, - }) { - return WidgetFilter( - name: name ?? this.name, - family: family ?? this.family, - stars: stars ?? this.stars, - ); - } - - @override - String toString() { - return 'WidgetFilter{name: $name, family: $family, stars: $stars}'; - } -} diff --git a/packages/widget_repository/lib/src/model/widget_model.dart b/packages/widget_repository/lib/src/model/widget_model.dart deleted file mode 100644 index 3934afca..00000000 --- a/packages/widget_repository/lib/src/model/widget_model.dart +++ /dev/null @@ -1,110 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:db_storage/db_storage.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -/// create by 张风捷特烈 on 2020-03-04 -/// contact me by email 1981462002@qq.com -/// 说明: 组件信息-展示-数据模型 -/// - -const List kTabColors = [ - Color(0xff44D1FD), - Color(0xffFD4F43), - Color(0xffB375FF), - Color(0xFF4CAF50), - Color(0xFFFF9800), - Color(0xFF00F1F1), - Color(0xFFDBD83F), -]; - -class WidgetModel extends Equatable { - final int id; - final String name; - final String nameCN; - final WidgetFamily family; - final bool deprecated; - final bool death; - final List links; - final double lever; - final ImageProvider? image; - final String info; - - - const WidgetModel( - { - required this.id, - required this.name, - required this.nameCN, - required this.family, - this.deprecated =false, - this.death =false, - required this.links, - // required this.type, - required this.lever, - this.image, - required this.info}); - - @override - List get props => [id]; - - Color get color => kTabColors[family.index]; - - static WidgetModel fromPo(WidgetPo po) { - return WidgetModel( - id: po.id, - name: po.name, - nameCN: po.nameCN, - family: toFamily(po.family), - image: convertImage(po.name), - lever: po.lever, - deprecated: po.deprecated == 1, - death: po.deprecated == -1, - info: po.info, - links: formatLinkTo(po.linkWidget), - ); - } - - static convertImage(String name) { - // return image.isEmpty ? null : AssetImage(image); - return null; - } - - - @override - String toString() { - return 'WidgetModel{id: $id, name: $name, nameCN: $nameCN, family: $family, deprecated: $deprecated, links: $links, lever: $lever, image: $image, info: $info}'; - } - - static List formatLinkTo(String links) { - if(links.isEmpty){ - return []; - } - if(!links.contains(',')){ - return [int.parse(links)]; - } - return links.split(',').map((e)=>int.parse(e)).toList(); - } - - 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; - } - } -} diff --git a/packages/widget_repository/lib/src/node_repository.dart b/packages/widget_repository/lib/src/node_repository.dart deleted file mode 100644 index 21789988..00000000 --- a/packages/widget_repository/lib/src/node_repository.dart +++ /dev/null @@ -1,12 +0,0 @@ - -import 'model/model.dart'; - -abstract class NodeRepository{ - - Future> loadNode(int widgetId); - -} - - - - diff --git a/packages/widget_repository/lib/src/widget_repository.dart b/packages/widget_repository/lib/src/widget_repository.dart deleted file mode 100644 index d476a341..00000000 --- a/packages/widget_repository/lib/src/widget_repository.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'model/model.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com - -abstract class WidgetRepository { - // Future> loadWidgets(WidgetFamily family); - - /// - Future> loadWidget(List ids); - - /// 根据 [WidgetFilter] 搜索 [WidgetModel] 列表 - Future> searchWidgets(WidgetFilter args); - - Future toggleLike(int id); - - Future> loadLikeWidgets(); - - Future collected(int id); -} diff --git a/packages/widget_repository/lib/widget_repository.dart b/packages/widget_repository/lib/widget_repository.dart deleted file mode 100644 index 8913dcc3..00000000 --- a/packages/widget_repository/lib/widget_repository.dart +++ /dev/null @@ -1,7 +0,0 @@ -library widget_repository; - -export 'src/widget_repository.dart'; -export 'src/category_repository.dart'; -export 'src/node_repository.dart'; -export 'src/model/model.dart'; -export 'src/db_impl/db_impl.dart'; \ No newline at end of file diff --git a/packages/widget_repository/pubspec.yaml b/packages/widget_repository/pubspec.yaml deleted file mode 100644 index 2e2b33fc..00000000 --- a/packages/widget_repository/pubspec.yaml +++ /dev/null @@ -1,61 +0,0 @@ -name: widget_repository -description: A new Flutter project. -version: 0.0.1 -publish_to: none -homepage: - -environment: - sdk: '>=2.18.1 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - equatable: ^2.0.5 - intl: ^0.17.0 - utils: - path: ../utils - db_storage: - path: ../db_storage - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/widget_repository/test/widget_repository_test.dart b/packages/widget_repository/test/widget_repository_test.dart deleted file mode 100644 index a5eb0900..00000000 --- a/packages/widget_repository/test/widget_repository_test.dart +++ /dev/null @@ -1,4 +0,0 @@ - -void main() { - -} diff --git a/packages/widgets/.gitignore b/packages/widgets/.gitignore deleted file mode 100644 index 96486fd9..00000000 --- a/packages/widgets/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -.packages -build/ diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart deleted file mode 100644 index d35167f9..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 96, -// "name": 'Column基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n" -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n" -// "【textBaseline】 : 文字基线 【TextBaseline】\n" -// "【verticalDirection】 : 竖直方向 【VerticalDirection】\n" -// "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】", -// } - -class CustomColumn extends StatelessWidget { - const CustomColumn({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildTitle(), - _buildContent(context), - ], - ); - } - - Widget _buildTitle() { - return Container( - height: 70, - color: const Color(0x4484FFFF), - child: Row( - children: const [ - Padding( - child: Icon( - Icons.add_location, - size: 30, - color: Colors.pink, - ), - padding: EdgeInsets.only(left: 25, right: 20), - ), - Expanded( - child: Text( - "附近", - style: TextStyle(fontSize: 18), - ), - ), - Padding( - child: Icon(Icons.keyboard_arrow_right, color: Colors.black38), - padding: EdgeInsets.only(right: 25), - ), - ], - )); - } - - Widget _buildContent(ctx) => Container( - width: MediaQuery.of(ctx).size.width, - color: Colors.orangeAccent, - height: 100, - child: const Icon( - Icons.android, - size: 50, - color: Colors.white, - ), - ); -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart deleted file mode 100644 index 04ac3426..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/6 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 341, -// "name": 'CustomMultiChildLayout基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件集 【List】\n" -// "【delegate】 : 布局代理 【MultiChildLayoutDelegate】", -// } - - -class CustomMultiChildLayoutDemo extends StatelessWidget { - const CustomMultiChildLayoutDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: 300, - height: 150, - color: Colors.grey.withAlpha(33), - child: CustomMultiChildLayout( - delegate: CornerCustomMultiChildLayout( - padding:const EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5), - ), - children: [ - LayoutId(id: CornerType.topLeft, child: const Box50(Colors.red)), - LayoutId(id: CornerType.topRight, child: const Box50(Colors.yellow)), - LayoutId(id: CornerType.bottomLeft, child: const Box50(Colors.blue)), - LayoutId(id: CornerType.bottomRight, child: const Box50(Colors.green)), - ], - ), - ); - } -} - -// 50 颜色盒 -class Box50 extends StatelessWidget { - final Color color; - const Box50(this.color, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: 50, - height: 50, - color: color, - ); - } -} - - -enum CornerType{ - topLeft, - topRight, - bottomLeft, - bottomRight -} - - -class CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{ - final EdgeInsets padding; - - CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero}); - - @override - void performLayout(Size size) { - if (hasChild(CornerType.topLeft)) { - layoutChild(CornerType.topLeft, BoxConstraints.loose(size)); - positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top)); - } - if (hasChild(CornerType.topRight)) { - var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size)); - positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top)); - } - if (hasChild(CornerType.bottomLeft)) { - var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size)); - positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom)); - } - if (hasChild(CornerType.bottomRight)) { - var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size)); - positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom)); - } - } - - @override - bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding; - -} - diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart deleted file mode 100644 index b740fea9..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 94, -// "name": 'Flex的排布方向', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【direction】 : 方向 【Axis】", -// } -class DirectionFlex extends StatelessWidget { - DirectionFlex({Key? key}) : super(key: key); - - static TextStyle textStyle = - const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - - final Widget blueBox = Container( - alignment: Alignment.center, - color: Colors.blue, - height: 20, - width: 30, - child: Text('1', style: textStyle), - ); - - final Widget redBox = Container( - alignment: Alignment.center, - color: Colors.red, - height: 30, - width: 40, - child: Text('2', style: textStyle), - ); - - final Widget greenBox = Container( - alignment: Alignment.center, - color: Colors.green, - height: 20, - width: 20, - child: Text('3', style: textStyle), - ); - - @override - Widget build(BuildContext context) { - return Wrap( - children: Axis.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 80, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - Widget _buildItem(mode) => Flex( - direction: mode, - children: [ - blueBox, redBox, greenBox - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart deleted file mode 100644 index 15f2a22b..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 94, -// "name": 'Flex主轴对齐方式', -// "priority": 2, -// "subtitle": -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", -// } -class MainAxisAlignmentFlex extends StatelessWidget { - MainAxisAlignmentFlex({Key? key}) : super(key: key); - - static TextStyle textStyle = - const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - - final Widget blueBox = Container( - alignment: Alignment.center, - color: Colors.blue, - height: 20, - width: 30, - child: Text('1', style: textStyle), - ); - - final Widget redBox = Container( - alignment: Alignment.center, - color: Colors.red, - height: 30, - width: 40, - child: Text('2', style: textStyle), - ); - - final Widget greenBox = Container( - alignment: Alignment.center, - color: Colors.green, - height: 20, - width: 20, - child: Text('3', style: textStyle), - ); - - @override - Widget build(BuildContext context) { - return Wrap( - runSpacing: 5, - children: MainAxisAlignment.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 80, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - Widget _buildItem(mode) => Flex( - direction: Axis.horizontal, - mainAxisAlignment: mode, - children: [ - blueBox, redBox, greenBox - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart deleted file mode 100644 index 9071792b..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 94, -// "name": 'Flex交叉轴对齐方式', -// "priority": 3, -// "subtitle": -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", -// } -class CrossAxisAlignmentFlex extends StatelessWidget { - CrossAxisAlignmentFlex({Key? key}) : super(key: key); - - static TextStyle textStyle = - const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - - final Widget blueBox = Container( - alignment: Alignment.center, - color: Colors.blue, - height: 20, - width: 30, - child: Text( - '1', - style: textStyle - ), - ); - - final Widget redBox = Container( - alignment: Alignment.center, - color: Colors.red, - height: 30, - width: 40, - child: Text( - '2', - style: textStyle - ), - ); - - final Widget greenBox = Container( - alignment: Alignment.center, - color: Colors.green, - height: 20, - width: 20, - child: Text( - '3', - style: textStyle - ), - ); - - - @override - Widget build(BuildContext context) { - return Wrap( - runSpacing: 5, - children: CrossAxisAlignment.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 80, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - Widget _buildItem(mode) => Flex( - direction: Axis.horizontal, - crossAxisAlignment: mode, - textBaseline: TextBaseline.alphabetic, - children: [ - blueBox, redBox, greenBox - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart deleted file mode 100644 index e3b2c6fe..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 94, -// "name": 'Flex垂直方向顺序', -// "priority": 4, -// "subtitle": -// "【verticalDirection】 : 垂直方向顺序 【VerticalDirection】", -// } -class VerticalDirectionFlex extends StatelessWidget { - VerticalDirectionFlex({Key? key}) : super(key: key); - - static TextStyle textStyle = - const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - - final Widget blueBox = Container( - alignment: Alignment.center, - color: Colors.blue, - height: 20, - width: 30, - child: Text('1', style: textStyle), - ); - - final Widget redBox = Container( - alignment: Alignment.center, - color: Colors.red, - height: 30, - width: 40, - child: Text('2', style: textStyle), - ); - - final Widget greenBox = Container( - alignment: Alignment.center, - color: Colors.green, - height: 20, - width: 20, - child: Text('3', style: textStyle), - ); - - @override - Widget build(BuildContext context) { - return Wrap( - runSpacing: 5, - children: VerticalDirection.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 80, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - Widget _buildItem(mode) => Flex( - direction: Axis.vertical, - verticalDirection: mode, - children: [blueBox, redBox, greenBox], - ); -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart deleted file mode 100644 index e0abf3fb..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 94, -// "name": 'Flex水平方向顺序', -// "priority": 5, -// "subtitle": -// "【textDirection】 : 水平方向顺序 【TextDirection】", -// } -class TextDirectionFlex extends StatelessWidget { - TextDirectionFlex({Key? key}) : super(key: key); - - static TextStyle textStyle = - const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - - final Widget blueBox = Container( - alignment: Alignment.center, - color: Colors.blue, - height: 20, - width: 30, - child: Text('1', style: textStyle), - ); - - final Widget redBox = Container( - alignment: Alignment.center, - color: Colors.red, - height: 30, - width: 40, - child: Text('2', style: textStyle), - ); - - final Widget greenBox = Container( - alignment: Alignment.center, - color: Colors.green, - height: 20, - width: 20, - child: Text('3', style: textStyle), - ); - - @override - Widget build(BuildContext context) { - return Wrap( - runSpacing: 5, - children: TextDirection.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 80, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - Widget _buildItem(mode) => Flex( - direction: Axis.horizontal, - textDirection: mode, - children: [blueBox, redBox, greenBox], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart deleted file mode 100644 index 1d70d95a..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart +++ /dev/null @@ -1,188 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PlayFlex extends StatefulWidget { - const PlayFlex({Key? key}) : super(key: key); - - @override - _PlayFlexState createState() => _PlayFlexState(); -} - -class _PlayFlexState extends State { - final Widget redBox = Container( - color: Colors.red, - height: 50, - width: 50, - ); - final Widget blueBox = Container( - color: Colors.blue, - width: 60, - height: 60, - ); - final Widget yellowBox = Container( - color: Colors.yellow, - height: 10, - width: 10, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 30, - width: 20, - ); - Axis _direction = Axis.horizontal; - MainAxisAlignment _mainAxisAlignment = MainAxisAlignment.start; - CrossAxisAlignment _crossAxisAlignment = CrossAxisAlignment.center; - VerticalDirection _verticalDirection = VerticalDirection.up; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildDirectionSelector(), - _buildMainAxisAlignmentSelector(), - _buildCrossAxisAlignmentSelector(), - _buildVerticalDirectionSelector(), - Container( - width: 300, - height: 300 * 0.618, - color: Colors.grey.withAlpha(33), - child: Flex( - textBaseline: TextBaseline.alphabetic, - direction: _direction, - mainAxisAlignment: _mainAxisAlignment, - crossAxisAlignment: _crossAxisAlignment, - verticalDirection: _verticalDirection, - children: [redBox, blueBox, yellowBox, greenBox], - ), - ), - ], - ); - } - - Widget _buildDirectionSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "direction", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _direction, - items: Axis.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString()), - )) - .toList(), - onChanged: (e) { - setState(() { - _direction = e??_direction; - }); - }), - ], - ), - ); - } - - Widget _buildMainAxisAlignmentSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "mainAxisAlignment", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _mainAxisAlignment, - items: MainAxisAlignment.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _mainAxisAlignment = e??_mainAxisAlignment; - }); - }), - ], - ), - ); - } - - Widget _buildCrossAxisAlignmentSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "crossAxisAlignment", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _crossAxisAlignment, - items: CrossAxisAlignment.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _crossAxisAlignment = e??_crossAxisAlignment; - }); - }), - ], - ), - ); - } - - Widget _buildVerticalDirectionSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "MainAxisSize", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _verticalDirection, - items: VerticalDirection.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _verticalDirection = e??_verticalDirection; - }); - }), - ], - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart deleted file mode 100644 index 585c2636..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 99, -// "name": 'Flow圆形排布', -// "priority": 1, -// "subtitle": "【children】 : 组件列表 【List】\n" -// "【delegate】 : 代理 【FlowDelegate】", -// } -class CircleFlow extends StatelessWidget { - CircleFlow({Key? key}) : super(key: key); - - final List data = List.generate( - 16, - (index) => index.isEven - ? "assets/images/icon_head.webp" - : "assets/images/wy_300x200.webp"); - - @override - Widget build(BuildContext context) { - return Container( - width: 300, - height: 300, - alignment: Alignment.center, - child: Flow( - delegate: _CircleFlowDelegate(), - children: data - .map((e) => CircleAvatar(backgroundImage: AssetImage(e))) - .toList(), - ), - ); - } -} - -class _CircleFlowDelegate extends FlowDelegate { - - @override //绘制孩子的方法 - void paintChildren(FlowPaintingContext context) { - final double radius = context.size.shortestSide / 2; - final int count = context.childCount; - final double perRad = 2 * pi / count; - for (int i = 0; i < count; i++) { - final Size size = context.getChildSize(i) ?? Size.zero; - final double offsetX = - (radius - size.width / 2) * cos(i * perRad) + radius; - final double offsetY = - (radius - size.height / 2) * sin(i * perRad) + radius; - context.paintChild(i, - transform: Matrix4.translationValues( - offsetX - size.width / 2, offsetY - size.height / 2, 0.0)); - } - } - - @override - bool shouldRepaint(FlowDelegate oldDelegate) => false; -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart deleted file mode 100644 index 3ed205ee..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 99, -// "name": 'Flow圆形与动画结合', -// "priority": 2, -// "subtitle": -// "通过动画来更改周围组件的位置实现效果", -// } - -class BurstFlow extends StatefulWidget { - static final data = List.generate( - 16, - (index) => index.isEven - ? "assets/images/icon_head.webp" - : "assets/images/wy_300x200.webp"); - static final show = Container( - width: 300, - height: 300, - alignment: Alignment.center, - child: BurstFlow( - children: data - .map((e) => CircleAvatar(backgroundImage: AssetImage(e))) - .toList(), - menu: const CircleAvatar( - backgroundImage: AssetImage('assets/images/icon_head.webp'), - ))); - - final List children; - final Widget menu; - - const BurstFlow({Key? key, required this.children, required this.menu}) : super(key: key); - - @override - _BurstFlowState createState() => _BurstFlowState(); -} - -class _BurstFlowState extends State - with SingleTickerProviderStateMixin { - late AnimationController _controller; - double _rad = 0.0; - bool _closed = true; - - @override - void initState() { - _controller = AnimationController( - duration: const Duration(milliseconds: 1000), - vsync: this, - ) - ..addListener(() => setState( - () => _rad = (_closed ? (_controller.value) : 1 - _controller.value))) - ..addStatusListener((status) { - if (status == AnimationStatus.completed) { - _closed = !_closed; - } - }); - super.initState(); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Flow( - delegate: _BurstFlowDelegate(_rad), - children: [ - ...widget.children, - InkWell( - onTap: () { - _controller.reset(); - _controller.forward(); - }, - child: widget.menu) - ], - ); - } -} - -class _BurstFlowDelegate extends FlowDelegate { - final double rad; - - _BurstFlowDelegate(this.rad); - - @override //绘制孩子的方法 - void paintChildren(FlowPaintingContext context) { - double radius = context.size.shortestSide / 2; - final int count = context.childCount - 1; - final double perRad = 2 * pi / count; - for (int i = 0; i < count; i++) { - Size size = context.getChildSize(i) ?? Size.zero; - final double offsetX = rad * (radius - size.width/2) * cos(i * perRad) + radius; - final double offsetY = rad * (radius - size.height/2) * sin(i * perRad) + radius; - context.paintChild(i, - transform: Matrix4.translationValues( - offsetX - size.width/2, offsetY - size.height/2, 0.0)); - } - - Size size = context.getChildSize(context.childCount - 1) ?? Size.zero; - - context.paintChild(context.childCount - 1, - transform: Matrix4.translationValues( - radius - size.width / 2, radius - size.height / 2, 0.0)); - } - - @override - bool shouldRepaint(_BurstFlowDelegate oldDelegate) => oldDelegate.rad != rad; -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart deleted file mode 100644 index 0ce56b2f..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 161, -// "name": 'IndexedStack基本使用', -// "priority":1 , -// "subtitle": -// "【children】 : 子组件列表 【Lis】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【index】 : 当前显示组件 【int】", -// } -class CustomIndexedStack extends StatefulWidget { - const CustomIndexedStack({Key? key}) : super(key: key); - - @override - _CustomIndexedStackState createState() => _CustomIndexedStackState(); -} - -class _CustomIndexedStackState extends State { - int _index = 1; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - width: 200, - height: 100, - color: Colors.grey.withAlpha(33), - child: IndexedStack( - index: _index, - children: [ - Container( - color: Colors.red, - width: 80, - height: 80 - ), - Positioned( - bottom: 10, - right: 10, - child: Container( - color: Colors.blue, - width: 80, - height: 80, - ), - ) - ], - ), - ), - ], - ); - } - - Widget _buildSwitch() => Switch( - value: _index == 0, - onChanged: (v) => setState(() => _index = v ? 0 : 1), - ); -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart deleted file mode 100644 index ef5cda55..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/8/2 -/// contact me by email 1981462002@qq.com -/// 说明: 342 ListBody 列表体 将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListVIew。 - -// { -// "widgetId": 342, -// "name": "ListView的基本使用", -// "priority": 1, -// "subtitle": "【mainAxis】 : 主轴方向 【Axis】\n" -// "【reverse】: 是否反向 【bool】\n" -// "【children】: 子组件集 【List】", -// } - -class ListBodyDemo extends StatelessWidget { - const ListBodyDemo({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: ListView( - children: [ - ListBody( - mainAxis: Axis.vertical, - reverse: false, - children: [ - Container(color: Colors.red, height: 50.0,), - Container(color: Colors.orange, height: 50.0,), - Container(color: Colors.yellow, height: 50.0,), - ], - ), - Container(color: Colors.green, height: 80.0,), - ListBody( - mainAxis: Axis.vertical, - reverse: false, - children: [ - Container(color: Colors.blue, height: 50.0,), - Container(color: Colors.indigo, height: 50.0,), - Container(color: Colors.purple, height: 50.0,), - ], - ) - ] - ), - ); - } -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart deleted file mode 100644 index 9d98f3b5..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 344 NestedScrollViewViewport 嵌套滑动视口 -/// 在 NestedScrollView 中使用的视口,该视口持有 SliverOverlapAbsorberHandle,会在视口需要重新计算布局时通知它。例如,当滚动它时。 -/// -// { -// "widgetId": 344, -// "name": 'NestedScrollViewViewport 介绍', -// "priority": 1, -// "subtitle": -// "【offset】 : *偏移 【ViewportOffset】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【crossAxisDirection】 : 交叉轴向 【AxisDirection】\n" -// "【slivers】 : 子组件 【List】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【anchor】 : 锚点 【double】", -// } - -class NestedScrollViewViewportDemo extends StatelessWidget { - const NestedScrollViewViewportDemo({Key? key}) : super(key: key); - - final String info = - 'NestedScrollViewViewport 在源码中只有一处使用:' - '_NestedScrollViewCustomScrollView 继承自 CustomScrollView,复写了 buildViewport 方法,返回 NestedScrollViewViewport 。' - '而 NestedScrollView 构建时使用了 _NestedScrollViewCustomScrollView,也就是 NestedScrollView 的视口依赖于 NestedScrollViewViewport。' - 'NestedScrollViewViewport 的特点是持有 SliverOverlapAbsorberHandle 类对象 handle,源码中该 handle 在 NestedScrollViewState 中初始化。' - '可通过上下文获取,用于 SliverOverlapAbsorber/SliverOverlapInjector 组件,使用详见相关组件。'; - - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart deleted file mode 100644 index 6c547777..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../utils/color_utils.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 101, -// "name": 'RichText基本使用', -// "priority": 1, -// "subtitle": -// "【text】 : 文字 【TextSpan】\n" -// " 其他属性与Text相同,详见之。", -// } -class CustomRichText extends StatelessWidget { - const CustomRichText({Key? key}) : super(key: key); - - final str = " 发光强度简称光强,国际单位是(坎德拉)简写cd。" - "1cd是指光源在指定方向的单位立体角内发出的光通量。" - "光源辐射是均匀时,则光强为I=F/Ω,Ω为立体角,单位为球面度(sr),F为光通量," - "单位是流明,对于点光源由I=F/4π 。光亮度是表示发光面明亮程度的," - "指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比," - "单位是坎德拉/平方米。对于一个漫散射面,尽管各个方向的光强和光通量不同," - "但各个方向的亮度都是相等的。电视机的荧光屏就是近似于这样的漫散射面," - "所以从各个方向上观看图像,都有相同的亮度感。"; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only( - left: 10.0, - right: 10, - ), - child: RichText( - text: TextSpan( - children: str - .split("") - .map((str) => TextSpan( - text: str, - style: TextStyle( - fontSize: 14, color: ColorUtils.randomColor()))) - .toList())), - ); - } -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart deleted file mode 100644 index aeae4429..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 95, -// "name": 'Row基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n" -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n" -// "【textBaseline】 : 文字基线 【TextBaseline】\n" -// "【verticalDirection】 : 竖直方向 【VerticalDirection】\n" -// "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】", -// } - -class CustomRow extends StatelessWidget { - const CustomRow({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: 70, - color: const Color(0x4484FFFF), - child: Row( - children: const [ - Padding( - child: Icon( - Icons.add_location, - size: 30, - color: Colors.pink, - ), - padding: EdgeInsets.only(left: 25, right: 20), - ), - Expanded( - child: Text( - "附近", - style: TextStyle(fontSize: 18), - ), - ), - Padding( - child: Icon(Icons.keyboard_arrow_right, color: Colors.black38), - padding: EdgeInsets.only(right: 25), - ), - ], - )); - } -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart deleted file mode 100644 index 0580f29e..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 343 ShrinkWrappingViewport 收缩包围视图 -/// 和 ScrollView 的 shrinkWrap 属性之间关联。ShrinkWrappingViewport 在主轴上调整自身的大小以适应它的子节点,在无边界约束的情况下使用。 -/// -// { -// "widgetId": 343, -// "name": 'NestedScrollViewViewport 介绍', -// "priority": 1, -// "subtitle": -// "【offset】 : *偏移 【ViewportOffset】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【crossAxisDirection】 : 交叉轴向 【AxisDirection】\n" -// "【slivers】 : 子组件 【List】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】", -// } - -class ShrinkWrappingViewportDemo extends StatelessWidget { - - const ShrinkWrappingViewportDemo({Key? key}) : super(key: key); - - final String info = - 'ShrinkWrappingViewport 在源码中只有一处使用:' - '在 ScrollView 中如果 shrinkWrap 为 true,会使用 ShrinkWrappingViewport,该属性在其子类 ListView、GridView、CustomScrollView 中可指定。' - '如果 shrinkWrap 为 false,视口会使用 Viewport,此时,视图区域将会沿滑动方向尽可能延伸。在无边界约束的情况下,shrinkWrap 需要是 true。' - '另外 ShrinkWrappingViewport 使用比较昂贵,因为滑动时需要重新计算滑动视图的尺寸。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart deleted file mode 100644 index c1fdee43..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 97, -// "name": 'Stack基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【textDirection】 : 孩子排布方向 【MainAxisAlignment】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【overflow】 : 溢出模式 【Overflow】\n" -// "【fit】 : 适应模式 【StackFit】", -// } -class CustomStack extends StatelessWidget { - const CustomStack({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Widget yellowBox = Container( - color: Colors.yellow, - height: 100, - width: 100, - ); - - Widget redBox = Container( - color: Colors.red, - height: 90, - width: 90, - ); - - Widget greenBox = Container( - color: Colors.green, - height: 80, - width: 80, - ); - - Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 70, - width: 70, - ); - - return Container( - width: 200, - height: 120, - color: Colors.grey.withAlpha(33), - child: Stack( - textDirection: TextDirection.rtl, - fit: StackFit.loose, - alignment: Alignment.topRight, - // overflow: Overflow.clip, // 1.22.0 被去除 - children: [yellowBox, redBox, greenBox, cyanBox], - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart deleted file mode 100644 index 0cbbb1e1..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart +++ /dev/null @@ -1,92 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; - -/// create by 张风捷特烈 on 2020/8/2 -/// contact me by email 1981462002@qq.com -/// 说明: 340 Viewport 视口组件 通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。 - -// { -// "widgetId": 340, -// "name": "Viewport的基本使用", -// "priority": 1, -// "subtitle": "【offset】 : *视口偏移量 【ViewportOffset】\n" -// "【cacheExtentStyle】: 预加载类型 【CacheExtentStyle】\n" -// "【cacheExtent】: 预加载量 【double】\n" -// "【axisDirection】: 滑动方向 【AxisDirection】\n" -// "【slivers】: 子Sliver组件集 【List】\n" -// "【anchor】: 锚点 【double】\n" -// "可以运行这些代码,查看ColorItem的构建情况,128个色条并非一次性全部构建。", -// } - -class ViewportDemo extends StatelessWidget { - ViewportDemo({Key? key}) : super(key: key); - - final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 250, - child: Scrollable( - axisDirection: AxisDirection.down, - physics: const BouncingScrollPhysics(), - dragStartBehavior: DragStartBehavior.start, - viewportBuilder: (ctx, position) => Viewport( - axisDirection: AxisDirection.down, - cacheExtent: 200, - anchor: 0, - cacheExtentStyle: CacheExtentStyle.pixel, - offset: position, - slivers: [_buildSliverList()], - ), - ), - ); - } - - Widget _buildSliverList() => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) =>ColorItem(color: data[index],), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - -class ColorItem extends StatefulWidget { - final Color color; - - const ColorItem({Key? key, required this.color}) : super(key: key); - - @override - _ColorItemState createState() => _ColorItemState(); -} - -class _ColorItemState extends State { - - @override - void initState() { - super.initState(); - print('-----initState----${colorString(widget.color)}-----------'); - } - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.only(top: 1), - alignment: Alignment.center, - width: 100, - height: 60, - color: widget.color, - child: Text( - colorString(widget.color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ]), - ), - ); - } - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart deleted file mode 100644 index 894e2f71..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的基础用法', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【spacing】 : 主轴条目间距 【double】\n" -// "【runSpacing】 : 交叉轴条目间距 【double】\n" -// "【direction】 : 主轴对齐 【Axis】", -// } -class DirectionWrap extends StatelessWidget { - DirectionWrap({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: Axis.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 100, - color: Colors.grey.withAlpha(33), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - final Widget yellowBox = Container( - color: Colors.yellow, - height: 30, - width: 50, - ); - - final Widget redBox = Container( - color: Colors.red, - height: 40, - width: 40, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 40, - width: 20, - ); - final Widget blackBox = Container( - color: Colors.black, - height: 10, - width: 10, - ); - final Widget purpleBox = Container( - color: Colors.purple, - height: 20, - width: 20, - ); - final Widget orangeBox = Container( - color: Colors.orange, - height: 80, - width: 20, - ); - final Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 10, - width: 20, - ); - - Widget _buildItem(mode) => Wrap( - direction: mode, - runSpacing: 10, - spacing: 10, - children: [ - yellowBox, redBox, greenBox, cyanBox, - blackBox, purpleBox, orangeBox, - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart deleted file mode 100644 index b37f59d8..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 98, -// "name": 'Wrap的alignment属性', -// "priority": 2, -// "subtitle": -// "【alignment】 : 主轴对齐 【WrapAlignment】", -// } -class WrapAlignmentWrap extends StatelessWidget { - WrapAlignmentWrap({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: WrapAlignment.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 100, - color: Colors.grey.withAlpha(88), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - final Widget yellowBox = Container( - color: Colors.yellow, - height: 30, - width: 50, - ); - - final Widget redBox = Container( - color: Colors.red, - height: 40, - width: 40, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 40, - width: 20, - ); - final Widget blackBox = Container( - color: Colors.black, - height: 10, - width: 10, - ); - final Widget purpleBox = Container( - color: Colors.purple, - height: 20, - width: 20, - ); - final Widget orangeBox = Container( - color: Colors.orange, - height: 80, - width: 20, - ); - final Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 10, - width: 20, - ); - - Widget _buildItem(mode) => Wrap( - alignment: mode, - runSpacing: 10, - spacing: 10, - children: [ - yellowBox, redBox, - greenBox, cyanBox, - blackBox, purpleBox, - orangeBox, - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart deleted file mode 100644 index 90b61ca9..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 98, -// "name": 'Wrap的crossAxisAlignment属性', -// "priority": 3, -// "subtitle": -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", -// } -class CrossAxisAlignmentWrap extends StatelessWidget { - CrossAxisAlignmentWrap({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: WrapCrossAlignment.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 100, - color: Colors.grey.withAlpha(88), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - final Widget yellowBox = Container( - color: Colors.yellow, - height: 30, - width: 50, - ); - - final Widget redBox = Container( - color: Colors.red, - height: 40, - width: 40, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 40, - width: 20, - ); - final Widget blackBox = Container( - color: Colors.black, - height: 10, - width: 10, - ); - final Widget purpleBox = Container( - color: Colors.purple, - height: 20, - width: 20, - ); - final Widget orangeBox = Container( - color: Colors.orange, - height: 80, - width: 20, - ); - final Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 10, - width: 20, - ); - - Widget _buildItem(mode) => Wrap( - crossAxisAlignment: mode, - runSpacing: 10, - spacing: 10, - children: [ - yellowBox, redBox, - greenBox, cyanBox, - blackBox, purpleBox, - orangeBox, - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart deleted file mode 100644 index 252839c4..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 98, -// "name": 'Wrap的textDirection属性', -// "priority": 4, -// "subtitle": -// "【textDirection】 : 文字方向 【TextDirection】", -// } -class TextDirectionWrap extends StatelessWidget { - TextDirectionWrap({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: TextDirection.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 100, - color: Colors.grey.withAlpha(88), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - final Widget yellowBox = Container( - color: Colors.yellow, - height: 30, - width: 50, - ); - - final Widget redBox = Container( - color: Colors.red, - height: 40, - width: 40, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 40, - width: 20, - ); - final Widget blackBox = Container( - color: Colors.black, - height: 10, - width: 10, - ); - final Widget purpleBox = Container( - color: Colors.purple, - height: 20, - width: 20, - ); - final Widget orangeBox = Container( - color: Colors.orange, - height: 80, - width: 20, - ); - final Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 10, - width: 20, - ); - - Widget _buildItem(mode) => Wrap( - textDirection: mode, - runSpacing: 10, - spacing: 10, - children: [ - yellowBox, redBox, greenBox, cyanBox, - blackBox, purpleBox, orangeBox, - ], - ); -} diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart deleted file mode 100644 index d8ea28ba..00000000 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 98, -// "name": 'Wrap的verticalDirection属性', -// "priority": 5, -// "subtitle": -// "【verticalDirection】 : 竖直方向 【VerticalDirection】", -// } -class VerticalDirectionWrap extends StatelessWidget { - VerticalDirectionWrap({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: VerticalDirection.values - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 160, - height: 100, - color: Colors.grey.withAlpha(88), - child: _buildItem(mode)), - Text(mode.toString().split('.')[1]) - ])) - .toList()); - } - - final Widget yellowBox = Container( - color: Colors.yellow, - height: 30, - width: 50, - ); - - final Widget redBox = Container( - color: Colors.red, - height: 40, - width: 40, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 40, - width: 20, - ); - final Widget blackBox = Container( - color: Colors.black, - height: 10, - width: 10, - ); - final Widget purpleBox = Container( - color: Colors.purple, - height: 20, - width: 20, - ); - final Widget orangeBox = Container( - color: Colors.orange, - height: 80, - width: 20, - ); - final Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 10, - width: 20, - ); - - Widget _buildItem(mode) => Wrap( - verticalDirection: mode, - direction: Axis.vertical, - runSpacing: 10, - spacing: 10, - children: [ - yellowBox, redBox, greenBox, cyanBox, - blackBox, purpleBox, orangeBox, - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/Other/ErrorWidget/node1_base.dart b/packages/widgets/lib/Other/ErrorWidget/node1_base.dart deleted file mode 100644 index 601771c7..00000000 --- a/packages/widgets/lib/Other/ErrorWidget/node1_base.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 197, -// "name": 'ErrorWidget基本使用', -// "priority": 1, -// "subtitle": "入参 : 显示信息 【Object】", -// } -class ErrorWidgetDemo extends StatelessWidget { - const ErrorWidgetDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ErrorWidget( - 'I am Error ErrorWidget\n' - 'But now, there has no error.' - ), - ); - } -} diff --git a/packages/widgets/lib/Other/ListWheelViewport/node1_base.dart b/packages/widgets/lib/Other/ListWheelViewport/node1_base.dart deleted file mode 100644 index 318c99be..00000000 --- a/packages/widgets/lib/Other/ListWheelViewport/node1_base.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 291 ListWheelViewport 列表滚轮视口 一个将孩子列表显示在柱状滚轮上的视口,是 ListWheelScrollView、CupertinoPicker 的底层依赖。 -/// link 179,139,137,253 -/// -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 简单使用', -// "priority": 1, -// "subtitle": "【itemExtent】 : 轴向item尺寸 【double】\n" -// "【offset】 : 视口偏移 【ViewportOffset】\n" -// "【childDelegate】 : 孩子代理构造器 【ListWheelChildDelegate】", -// } - -class ListWheelViewportDemo extends StatelessWidget { - ListWheelViewportDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.blue[50]!, - Colors.blue[100]!, - Colors.blue[200]!, - Colors.blue[300]!, - Colors.blue[400]!, - Colors.blue[500]!, - Colors.blue[600]!, - Colors.blue[700]!, - Colors.blue[800]!, - Colors.blue[900]!, - Colors.blue[800]!, - Colors.blue[700]!, - Colors.blue[600]!, - Colors.blue[500]!, - Colors.blue[400]!, - Colors.blue[300]!, - Colors.blue[200]!, - Colors.blue[100]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 250, - width: 320, - child: Scrollable( - axisDirection: AxisDirection.down, - physics: const BouncingScrollPhysics(), - dragStartBehavior: DragStartBehavior.start, - viewportBuilder: (ctx, position) => ListWheelViewport( - itemExtent: 100, - offset: position, - childDelegate: ListWheelChildLoopingListDelegate( - children: data.map((e) => _buildItem(e)).toList()), - )), - ); - } - - Widget _buildItem(Color color) => Container( - alignment: Alignment.center, - color: color, - child: Text(colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ), - ])), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Other/PerformanceOverlay/node1_base.dart b/packages/widgets/lib/Other/PerformanceOverlay/node1_base.dart deleted file mode 100644 index 7362c0d1..00000000 --- a/packages/widgets/lib/Other/PerformanceOverlay/node1_base.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 312 PerformanceOverlay 性能浮层 6 可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。 -// { -// "widgetId": 312, -// "name": "PerformanceOverlay基本使用", -// "priority": 1, -// "subtitle": "使用PerformanceOverlay.allEnabled可以开始所有的监测项。", -// } - -class PerformanceOverlayDemo extends StatelessWidget { - const PerformanceOverlayDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return PerformanceOverlay.allEnabled( - - ); - } -} - diff --git a/packages/widgets/lib/Other/RawImage/node1_base.dart b/packages/widgets/lib/Other/RawImage/node1_base.dart deleted file mode 100644 index c33cfcbf..00000000 --- a/packages/widgets/lib/Other/RawImage/node1_base.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'dart:async'; -import 'dart:typed_data'; -import 'dart:ui' as ui; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 313 RawImage 6 是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。 -// { -// "widgetId": 313, -// "name": "RawImage基本使用", -// "priority": 1, -// "subtitle": "【image】 : 图片 【ui.Image】\n" -// "【width】 : 宽 【int】\n" -// "【height】: 高 【int】\n" -// "【isAntiAlias】: 是否抗锯齿 【bool】\n" -// "【filterQuality】: 过滤质量 【FilterQuality】\n" -// "很多属性同Image,详见之.", -// } -class RawImageDemo extends StatefulWidget { - const RawImageDemo({Key? key}) : super(key: key); - - @override - _RawImageDemoState createState() => _RawImageDemoState(); -} - -class _RawImageDemoState extends State { - ui.Image? _image; - - @override - void initState() { - super.initState(); - _loadImageFromAssets('assets/images/icon_head.webp'); - } - - @override - Widget build(BuildContext context) { - if (_image == null) { - return const SizedBox( - width: 80, - height: 80, - ); - } - - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - mainAxisSize: MainAxisSize.min, - children: [ - RawImage( - image: _image, - width: 150, - height: 150, - isAntiAlias: true, - filterQuality: FilterQuality.high, - ), - const Text('isAntiAlias: true'), - const Text('FilterQuality.high') - ], - ), - Column( - mainAxisSize: MainAxisSize.min, - children: [ - RawImage( - image: _image, - width: 150, - height: 150, - isAntiAlias: false, - ), - const Text('isAntiAlias: false'), - const Text('FilterQuality.low') - ], - ), - ], - ); - } - - void _loadImageFromAssets(String name) async { - _image = await loadImageFromAssets(name); - setState(() {}); - } - - //读取 assets 中的图片 - Future loadImageFromAssets(String path) async { - ByteData data = await rootBundle.load(path); - List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - return decodeImageFromList(Uint8List.fromList(bytes)); - } -} diff --git a/packages/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart b/packages/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart deleted file mode 100644 index f82eb1c6..00000000 --- a/packages/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ - -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 289 RenderObjectToWidgetAdapter 根组件 RenderObject 和 Element 树的桥梁。 -/// -// { -// "widgetId": 289, -// "name": 'RenderObjectToWidgetAdapter 介绍', -// "priority": 1, -// "subtitle": "【container】 : 渲染对象 【RenderObjectWithChildMixin】\n" -// "【child】 : 子组件 【Widget】\n" -// "【debugShortDescription】 : 调试简介 【String】", -// } - -class RenderObjectToWidgetAdapterDemo extends StatelessWidget { - const RenderObjectToWidgetAdapterDemo({Key? key}) : super(key: key); - - final String info = - '该组件并没有什么太大的使用价值,但却非常有纪念意义。它是 Flutter 框架中最顶层的 Widget,它的 child 是 runApp 传入的组件,在 attachRootWidget 方法中被实例化。' - '它持有根渲染对象 RenderView ,负责创建根元素 RenderObjectToWidgetElement,是一个无名英雄,一个深藏功与名的组件。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/Other/Table/node1_base.dart b/packages/widgets/lib/Other/Table/node1_base.dart deleted file mode 100644 index 4f6d0c78..00000000 --- a/packages/widgets/lib/Other/Table/node1_base.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 110, -// "name": 'Table基本使用', -// "priority": 1, -// "subtitle": "【children】 : 组件列表 【List】\n" -// "【columnWidths】 : 列宽 【Map】\n" -// "【defaultColumnWidth】 : 默认列宽 【TableColumnWidth】\n" -// "【border】 : 边线 【TableBorder】\n" -// "【textDirection】 : 文字方向 【TextDirection】\n" -// "【defaultVerticalAlignment】 : 单元格竖直方向对齐模式 【TableCellVerticalAlignment】", -// } -class CustomTable extends StatelessWidget { - const CustomTable({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); - _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); - _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); - _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); - _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); - _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); - _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); - _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); - - List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; - - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Table( - columnWidths: const { - 0: FixedColumnWidth(80.0), - 1: FixedColumnWidth(80.0), - 2: FixedColumnWidth(80.0), - 3: FixedColumnWidth(80.0), - 4: FixedColumnWidth(80.0), - }, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - border: TableBorder.all( - color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), - children: data - .map((item) => TableRow(children: [ - Center( - child: Text( - item.name, - style: const TextStyle(color: Colors.blue), - )), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.symbol)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unitSymbol)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unitName)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unit)), - ), - ])) - .toList(), - ), - ); - } -} - -class _ItemBean { - String name; - String symbol; - String unit; - String unitName; - String unitSymbol; - - _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); -} diff --git a/packages/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart deleted file mode 100644 index 0f0f91e2..00000000 --- a/packages/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 338 ButtonBarTheme 5 主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。 -// { -// "widgetId": 338, -// "name": "ButtonBarTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ButtonBarThemeData数据属性为【后代】的ButtonBar组件设置默认样式,如对齐方式、样式、边距等。也可以用ButtonBarTheme.of获取ButtonBar的主题属性。", -// } - -class ButtonBarThemeDemo extends StatelessWidget { - const ButtonBarThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ButtonBarTheme( - child: const TempButtonBar(), - data: ButtonBarTheme.of(context).copyWith( - alignment: MainAxisAlignment.center, - buttonPadding: const EdgeInsets.symmetric(horizontal: 6), - overflowDirection: VerticalDirection.up, - buttonMinWidth: 150, - buttonHeight: 30, - buttonTextTheme: ButtonTextTheme.primary)); - } -} - -class TempButtonBar extends StatelessWidget { - const TempButtonBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ButtonBar( - alignment: MainAxisAlignment.center, - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.blue), - child: const Text("1.Elevated"), onPressed: () {}), - OutlinedButton(child: const Text("2.Outlined"), onPressed: () {}), - TextButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.blue), - onPressed: () {}, - child: const Text("3.Text"), - ) - ], - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart deleted file mode 100644 index 9aa327e0..00000000 --- a/packages/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 326, -// "name": 'ButtonTheme使用', -// "priority": 1, -// "subtitle": "属性参数同MaterialButton,可以通过ButtonTheme.of获取按钮主题数据," -// "也可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。", -// } - - -class ButtonThemeDemo extends StatelessWidget { - const ButtonThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ButtonTheme( - buttonColor: Colors.orange, - splashColor: Colors.blue, - minWidth: 40, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - child: Wrap( - spacing: 10, - children: [ - ElevatedButton(onPressed: (){},child: const Icon(Icons.add)), - TextButton(onPressed: (){},child: const Icon(Icons.add)), - OutlinedButton(onPressed: (){},child: const Icon(Icons.add)), - MaterialButton(onPressed: (){},child: const Icon(Icons.add)), - ], - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart deleted file mode 100644 index aa1ca824..00000000 --- a/packages/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/20 -/// contact me by email 1981462002@qq.com -/// 说明: 328 ChipTheme 主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。 -// { -// "widgetId": 328, -// "name": 'ChipTheme基本使用', -// "priority": 1, -// "subtitle": "可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。", -// } -class ChipThemeDemo extends StatelessWidget { - const ChipThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ChipTheme( - data: ChipTheme.of(context).copyWith( - selectedColor: Colors.orange.withAlpha(55), - selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, - pressElevation: 5, - elevation: 3, - ), - child: const CustomFilterChip(), - ); - } -} - -class CustomFilterChip extends StatefulWidget { - const CustomFilterChip({Key? key}) : super(key: key); - - @override - _CustomFilterChipState createState() => _CustomFilterChipState(); -} - -class _CustomFilterChipState extends State { - final Map map = { - 'A': 'Ant', - 'B': 'Bug', - 'C': 'Cat', - 'D': 'Dog', - }; - final List _selected = []; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Wrap( - children: map.keys.map((key) => _buildChild(key)).toList(), - ), - Container( - padding: const EdgeInsets.all(10), - child: Text('您已选择: ${_selected.join(', ')}')), - ], - ); - } - - Padding _buildChild(String key) { - return Padding( - padding: const EdgeInsets.all(4.0), - child: FilterChip( - avatar: CircleAvatar(child: Text(key)), - label: Text(map[key]!), - selected: _selected.contains(map[key]), - onSelected: (bool value) { - setState(() { - if (value) { - _selected.add(map[key]!); - } else { - _selected.removeWhere((name) => name == map[key]); - } - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart b/packages/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart deleted file mode 100644 index b13045c8..00000000 --- a/packages/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: 337 CupertinoUserInterfaceLevel 用户接口等级 -/// ios 中的概念,内容可视级别 UIUserInterfaceLevel ,分为 base 和 elevated。作为一个 InheritedWidget ,主要就是共享该数据。 - -// { -// "widgetId": 337, -// "name": 'CupertinoUserInterfaceLevel 介绍', -// "priority": 1, -// "subtitle": "CupertinoUserInterfaceLevel.of(context) 可以获取 CupertinoUserInterfaceLevelData 数据。也可以使用该组件设置该数据与子树共享。关于数据原图详见: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel", -// } - -class CupertinoUserInterfaceLevelDemo extends StatelessWidget { - const CupertinoUserInterfaceLevelDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const CupertinoUserInterfaceLevel( - data: CupertinoUserInterfaceLevelData.elevated, - child: LevelShower() - ); - } - -} - -class LevelShower extends StatelessWidget { - const LevelShower({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - CupertinoUserInterfaceLevelData data = CupertinoUserInterfaceLevel.of(context); - return Container( - height: 150, - alignment: Alignment.center, - color: Theme.of(context).primaryColor.withOpacity(0.1), - child: Text(data.toString()), - ); - } -} - - diff --git a/packages/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart b/packages/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart deleted file mode 100644 index 0c25dca1..00000000 --- a/packages/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'dart:ui' as ui; -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: 320 DefaultAssetBundle 默认资源包 -/// 一个 InheritedWidget,设置 AssetBundle 对象后,该节点后的节点上下文可以通过 DefaultAssetBundle.of(context) 获取 AssetBundle 对象用于访问资源文件。 -// { -// "widgetId": 320, -// "name": 'DefaultAssetBundle 介绍', -// "priority": 1, -// "subtitle": "【bundle】 : *资源包 【AssetBundle】\n" -// "【child】 : *子组件 【Widget】\n" -// "我们可以定义自己的 DefaultAssetBundle 来供后续节点使用,也可以直接使用默认的。该案例演示通过框架提供的 DefaultAssetBundle 加载一张资源图片进行显示。", -// } -class DefaultAssetBundleDemo extends StatefulWidget { - const DefaultAssetBundleDemo({Key? key}) : super(key: key); - - @override - _DefaultAssetBundleDemoState createState() => _DefaultAssetBundleDemoState(); -} - -class _DefaultAssetBundleDemoState extends State { - ui.Image? _image; - @override - void initState() { - super.initState(); - _load(); - } - - @override - Widget build(BuildContext context) { - - return Container( - width: 150, - height: 150, - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: _image==null?Container():RawImage(image: _image,fit: BoxFit.cover,), - ); - } - - void _load() async{ - AssetBundle info = DefaultAssetBundle.of(context); - ByteData data = await info.load('assets/images/sabar.webp'); - _image = await decodeImageFromList(data.buffer.asUint8List()); - setState(() { - - }); - } -} diff --git a/packages/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart b/packages/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart deleted file mode 100644 index 28d297ce..00000000 --- a/packages/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 324, -// "name": 'DefaultTextStyle使用', -// "priority": 1, -// "subtitle": "各属性同Text,详见之。\n" -// "其功能是: 设置默认的文字样式应用于【后代组件】,注意后代组件也可以指定自身的样式", -// } -class DefaultTextStyleDemo extends StatelessWidget { - const DefaultTextStyleDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return DefaultTextStyle( - style: const TextStyle( - fontSize: 18, - color: Colors.blue, - decoration: TextDecoration.underline), - child: Wrap( - spacing: 5, - children: const[ - Text("Hello,",), - FlutterLogo(), - Text("Flutter",style: TextStyle(color: Colors.red),), - Text("Unit."), - ], - ), - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/Directionality/node1_base.dart b/packages/widgets/lib/ProxyWidget/Directionality/node1_base.dart deleted file mode 100644 index 734e9e74..00000000 --- a/packages/widgets/lib/ProxyWidget/Directionality/node1_base.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: 319 Directionality 定向性 为后代改变有textDirection属性的组件统一设置属性值,也可以通过Directionality.of(context)获取当前textDirection默认属性。 -// { -// "widgetId": 319, -// "name": "Directionality基本使用", -// "priority": 1, -// "subtitle": "【textDirection】 : 文字排列方向 【TextDirection】\n" -// "【child】 : 子组件 【Widget】", -// } -class DirectionalityDemo extends StatefulWidget { - const DirectionalityDemo({Key? key}) : super(key: key); - - @override - _DirectionalityDemoState createState() => _DirectionalityDemoState(); -} - -class _DirectionalityDemoState extends State { - TextDirection _textDirection = TextDirection.rtl; - - @override - Widget build(BuildContext context) { - return Directionality( - textDirection: _textDirection, - child: Container( - padding: const EdgeInsets.all(8), - width: 250, - color: Colors.grey.withAlpha(33), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'A widget that determines the ambient directionality of text and text direction sensitive render objects.'), - _buildSwitch(), - const Text( - 'The text direction from the closest instance of this class that encloses the given context.'), - ], - ), - ), - ); - } - - Widget _buildSwitch() => Row( - children: [ - Switch( - value: _textDirection == TextDirection.rtl, - onChanged: (v) { - setState(() { - _textDirection = - v ? TextDirection.rtl : TextDirection.ltr; - }); - }, - ), - Text( - _textDirection.toString(), - style: const TextStyle(color: Colors.blue, fontSize: 18), - ) - ], - ); -} diff --git a/packages/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart deleted file mode 100644 index 93c10205..00000000 --- a/packages/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 329, -// "name": 'DividerTheme使用', -// "priority": 1, -// "subtitle": "属性参数与Divider类似,可以通过DividerTheme.of获取分割线主题数据," -// "也可以为DividerTheme【后代】的分割线设置默认样式,包括颜色、粗细、高度等。", -// } - - -class DividerThemeDemo extends StatelessWidget { - const DividerThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return DividerTheme( - data: const DividerThemeData( - color: Colors.orange, - thickness: 2, - space: 10, - indent: 10, - endIndent: 10, - ), - child: Wrap( - spacing: 10, - children: [ - const Divider(), - const Divider(), - const Divider(), - const Divider(), - const Divider(), - SizedBox( - height: 100, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: const [ - VerticalDivider(), - VerticalDivider(), - VerticalDivider(), - VerticalDivider(), - VerticalDivider(), - ], - ), - ) - ], - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart b/packages/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart deleted file mode 100644 index eec57a57..00000000 --- a/packages/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 181, -// "name": 'DropDownButtonHideUnderline使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n", -// } -class CustomDropDownButtonHideUnderline extends StatefulWidget { - const CustomDropDownButtonHideUnderline({Key? key}) : super(key: key); - - @override - _CustomDropDownButtonHideUnderlineState createState() => - _CustomDropDownButtonHideUnderlineState(); -} - -class _CustomDropDownButtonHideUnderlineState - extends State { - Color _color = Colors.red; - final List _colors = const[ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - final List _info = const["红色", "黄色", "蓝色", "绿色"]; - - @override - Widget build(BuildContext context) { - return Wrap( - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - width: 50, - height: 50, - color: _color, - ), - DropdownButtonHideUnderline( - child: DropdownButton( - value: _color, - elevation: 1, - icon: Icon( - Icons.expand_more, - size: 20, - color: _color, - ), - items: _buildItems(), - onChanged: (Color? color) => - setState(() => _color = color ?? _color)), - ), - ], - ); - } - - List> _buildItems() => _colors - .map((e) => DropdownMenuItem( - value: e, - child: Text( - _info[_colors.indexOf(e)], - style: TextStyle(color: e), - ))) - .toList(); -} diff --git a/packages/widgets/lib/ProxyWidget/Expanded/node1_base.dart b/packages/widgets/lib/ProxyWidget/Expanded/node1_base.dart deleted file mode 100644 index fbf56eda..00000000 --- a/packages/widgets/lib/ProxyWidget/Expanded/node1_base.dart +++ /dev/null @@ -1,55 +0,0 @@ - import 'package:flutter/material.dart'; -import 'package:widgets/utils/color_utils.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 106, -// "name": 'Expanded基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【flex】 : 剩余空间分配占比 【int】", -// } -class CustomExpended extends StatefulWidget { - const CustomExpended({Key? key}) : super(key: key); - - @override - _CustomExpendedState createState() => _CustomExpendedState(); -} - -class _CustomExpendedState extends State { - @override - Widget build(BuildContext context) { - return Column( - children: [ - buildRow([0, 0, 0]), - const SizedBox(height: 10,), - buildRow([0, 0, 1]), - const SizedBox(height: 10,), - buildRow([1, 1, 1]), - const SizedBox(height: 10,), - buildRow([2, 3, 3]), - ], - ); - } - - Widget buildRow(List num) { - return Row( - children: num.map((e) => Expanded( - flex: e, - child: Container( - alignment: Alignment.center, - width: 50, - height: 50, - color: ColorUtils.randomColor(), - child: Text( - 'flex=$e', - style: const TextStyle(color: Colors.white), - ), - ), - )).toList()); - } -} diff --git a/packages/widgets/lib/ProxyWidget/Flexible/node1_base.dart b/packages/widgets/lib/ProxyWidget/Flexible/node1_base.dart deleted file mode 100644 index 4e3bc43a..00000000 --- a/packages/widgets/lib/ProxyWidget/Flexible/node1_base.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 109, -// "name": 'Flexible基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【fit】 : 适应模式*2 【FlexFit】\n" -// "【flex】 : 剩余空间分配占比 【int】", -// } -class CustomFlexible extends StatefulWidget { - const CustomFlexible({Key? key}) : super(key: key); - - @override - _CustomFlexibleState createState() => _CustomFlexibleState(); -} - -class _CustomFlexibleState extends State { - double _width = 300.0; - bool _loose = false; - - @override - Widget build(BuildContext context) { - return Column(children: [ - Container( - color: Colors.grey.withAlpha(33), - width: _width, - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Flexible( - flex: 2, - child: Container( - alignment: Alignment.center, - height: 50, - color: Colors.red, - child: const Text( - 'flex=2', - style: TextStyle(color: Colors.white), - ), - ), - ), - Flexible( - flex: 3, - child: Container( - alignment: Alignment.center, - height: 50, - color: Colors.blue, - child: const Text( - 'flex=3', - style: TextStyle(color: Colors.white), - ), - ), - ), - Flexible( - flex: 4, - fit: _loose?FlexFit.loose:FlexFit.tight, - child: Container( - constraints: const BoxConstraints(maxWidth: 60), - alignment: Alignment.center, - height: 50, - color: Colors.green, - child: Text( - 'flex=4 \nfit:${_loose?'loose':'tight'}', - style: const TextStyle(color: Colors.white), - ), - ), - ) - ], - )), - _buildOp() - ]); - } - - Widget _buildOp() => Row( - children: [ - Switch( - value: _loose, - onChanged: (v) => setState(() => _loose = v)), - Expanded( - child: Slider( - divisions: 10, - min: 100, - max: 350, - value: _width, - onChanged: (v) => setState(() => _width = v)), - ), - ], - ); -} diff --git a/packages/widgets/lib/ProxyWidget/IconTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/IconTheme/node1_base.dart deleted file mode 100644 index fe55c057..00000000 --- a/packages/widgets/lib/ProxyWidget/IconTheme/node1_base.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 325, -// "name": 'IconTheme使用', -// "priority": 1, -// "subtitle": "可以通过IconTheme.of获取图标主题数据,也可以为IconTheme【后代】的图标组件设置默认样式,包括颜色、透明度、尺寸。", -// } -class IconThemeDemo extends StatelessWidget { - const IconThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return IconTheme( - data: const IconThemeData( - color: Colors.purple, - opacity: 1.0, - size: 30 - ), - child: Wrap( - spacing: 10, - children: const[ - Icon(Icons.add), - Icon(Icons.ac_unit), - Icon(Icons.g_translate), - Icon(Icons.remove) - ], - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart deleted file mode 100644 index 2a217591..00000000 --- a/packages/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 345 InheritedTheme 传承主题 -/// 它是抽象类,有非常多的 XXXTheme 相关子类,用于定义颜色、文字样式等属性,在子树中共享这些属性。 -/// link 324,326,328,329 -/// -// { -// "widgetId": 345, -// "name": 'InheritedTheme 介绍', -// "priority": 1, -// "subtitle": -// "InheritedTheme.capture 可以抓取上层主题,获取 CapturedThemes 对象,通过该对象 wrap 方法可以跨路由使用抓到的主题。", -// } - -class InheritedThemeDemo extends StatelessWidget { - const InheritedThemeDemo({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return const DefaultTextStyle( - style: TextStyle(fontSize: 24, color: Colors.blue), - child: TestBody(), - ); - } -} - -class TestBody extends StatelessWidget { - const TestBody({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - - return GestureDetector( - onTap: () => _toNextPage(context), - child: Container( - height: 60, - margin: const EdgeInsets.only(left: 40,right: 40), - alignment: Alignment.center, - color: Theme.of(context).primaryColor.withOpacity(0.1), - child: const Text('InheritedTheme'))); - } - - void _toNextPage(BuildContext context) { - // final NavigatorState navigator = Navigator.of(context); - // final CapturedThemes themes = - // InheritedTheme.capture(from: context, to: navigator.context); - // - // Navigator.of(context).push( - // MaterialPageRoute( - // builder: (BuildContext _) { - // return themes.wrap(Container( - // alignment: Alignment.center, - // color: Colors.white, - // child: Text('Flutter Unit'), - // )); - // }, - // ), - // ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart b/packages/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart deleted file mode 100644 index 9f0350cd..00000000 --- a/packages/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 346 InheritedWidget 传承组件 -/// 该类是抽象类,作用是可以在本上下文存储数据,在其后续节点的上下文中共享该数据。有很多实现类,包括各种主题组件、MediaQuery等。 -/// link: 167,319,328,324,331 -/// -// { -// "widgetId": 346, -// "name": 'InheritedWidget 使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "下面是一个简单的自定义 InheritedWidget,实现信息的子树共享。", -// } - -class InheritedWidgetDemo extends StatelessWidget { - final String info = - 'InheritedWidget 是一个抽象类,不可以直接使用。可以自定义对应共享数据的子类,如这里的通过 InfoInheritedWidget 实现:当前这段话可以在任意子树节点上下文获取。' - '一般都会定义一个 XXX.of(context) 的方法来获取数据,如 MediaQuery.of,Theme.of 等。'; - - const InheritedWidgetDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return InfoInheritedWidget( - info: info, - child: const InfoWidget(), - ); - } -} - -class InfoWidget extends StatelessWidget { - const InfoWidget({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - String info = InfoInheritedWidget.of(context)?.info??''; - - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} - -class InfoInheritedWidget extends InheritedWidget { - final String info; - - const InfoInheritedWidget({Key? key,required this.info, required Widget child}) - : super(key: key, child: child); - - @override - bool updateShouldNotify(covariant InfoInheritedWidget oldWidget) => - info != oldWidget.info; - - static InfoInheritedWidget? of(BuildContext context) => - context.dependOnInheritedWidgetOfExactType(); -} diff --git a/packages/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart b/packages/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart deleted file mode 100644 index c302cc19..00000000 --- a/packages/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 316 KeepAlive 保活 在懒加载的列表中,孩子的状态是否需要保活。是 AutomaticKeepAlive 的底层实现,一般不单独使用。 -/// link 239 -/// -// { -// "widgetId": 316, -// "name": 'KeepAlive 介绍', -// "priority": 1, -// "subtitle": "【child】 : *子组件 【Widget】\n" -// "【keepAlive】 : *是否保活 【bool】\n" -// "在 flutter 框架层中,只用于 AutomaticKeepAlive 中,源码中也说很少单独使用它。该示例展示出 ListView 条目的状态保活。", -// } - -class KeepAliveDemo extends StatelessWidget { - KeepAliveDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: ListView.builder( - itemCount: data.length, - itemBuilder: (_, index) => ColorBox( - color: data[index], - index: index, - ), - ), - ); - } -} - -class ColorBox extends StatefulWidget { - final Color color; - final int index; - - const ColorBox({ - Key? key, - required this.color, - required this.index, - }) : super(key: key); - - @override - _ColorBoxState createState() => _ColorBoxState(); -} - -class _ColorBoxState extends State with AutomaticKeepAliveClientMixin { - bool _checked = false; - - @override - void initState() { - super.initState(); - _checked = false; - print('-----_ColorBoxState#initState---${widget.index}-------'); - } - - @override - void dispose() { - print('-----_ColorBoxState#dispose---${widget.index}-------'); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - super.build(context); - - return Container( - alignment: Alignment.center, - height: 50, - color: widget.color, - child: Row( - children: [ - const SizedBox(width: 60), - Checkbox( - value: _checked, - onChanged: (bool? v) { - setState(() { - _checked = v??false; - }); - }, - ), - Text( - "index ${widget.index}: ${colorString(widget.color)}", - style: const TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ]), - ), - ], - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - @override - bool get wantKeepAlive => true; -} diff --git a/packages/widgets/lib/ProxyWidget/LayoutId/node1_base.dart b/packages/widgets/lib/ProxyWidget/LayoutId/node1_base.dart deleted file mode 100644 index 0e9c48ca..00000000 --- a/packages/widgets/lib/ProxyWidget/LayoutId/node1_base.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/6 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 315, -// "name": 'LayoutId使用场景', -// "priority": 1, -// "subtitle": -// "【id】 : 标识id 【Object】\n" -// "【child】 : 子组件 【Widget】", -// } - - -class LayoutIdDemo extends StatelessWidget { - const LayoutIdDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: 300, - height: 150, - color: Colors.grey.withAlpha(33), - child: CustomMultiChildLayout( - delegate: CornerCustomMultiChildLayout( - padding:const EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5), - ), - children: [ - LayoutId(id: CornerType.topLeft, child: const Box50(Colors.red)), - LayoutId(id: CornerType.topRight, child: const Box50(Colors.yellow)), - LayoutId(id: CornerType.bottomLeft, child: const Box50(Colors.blue)), - LayoutId(id: CornerType.bottomRight, child: const Box50(Colors.green)), - ], - ), - ); - } -} - -// 50 颜色盒 -class Box50 extends StatelessWidget { - final Color color; - const Box50(this.color, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: 50, - height: 50, - color: color, - ); - } -} - - -enum CornerType{ - topLeft, - topRight, - bottomLeft, - bottomRight -} - - -class CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{ - final EdgeInsets padding; - - CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero}); - - @override - void performLayout(Size size) { - if (hasChild(CornerType.topLeft)) { - layoutChild(CornerType.topLeft, BoxConstraints.loose(size)); - positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top)); - } - if (hasChild(CornerType.topRight)) { - var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size)); - positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top)); - } - if (hasChild(CornerType.bottomLeft)) { - var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size)); - positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom)); - } - if (hasChild(CornerType.bottomRight)) { - var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size)); - positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom)); - } - } - - @override - bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding; -} - diff --git a/packages/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart deleted file mode 100644 index f18b56c1..00000000 --- a/packages/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 334 ListTileTheme 主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。 -// { -// "widgetId": 334, -// "name": "ListTileTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。", -// } - -class ListTileThemeDemo extends StatelessWidget { - const ListTileThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ListTileTheme( - dense: false, - style: ListTileStyle.list, - selectedColor: Colors.blue, - contentPadding: const EdgeInsets.only(left: 15,right: 15,top: 5,bottom: 5), - iconColor: Colors.purple, - textColor: Colors.orange, - child: _ListTileSimple(), - ); - } -} - -class _ListTileSimple extends StatefulWidget { - @override - _ListTileSimpleState createState() => _ListTileSimpleState(); -} - -class _ListTileSimpleState extends State<_ListTileSimple> { - bool _selected = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - selected: _selected, - title: const Text("以梦为马"), - subtitle: const Text("海子"), - trailing: const Icon(Icons.more_vert), - onTap: () => setState(() => _selected = !_selected), - ), - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart deleted file mode 100644 index a6a11a32..00000000 --- a/packages/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 327 MaterialBannerTheme 主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。 -// { -// "widgetId": 327, -// "name": "MaterialBannerTheme基本使用", -// "priority": 1, -// "subtitle": "可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。", -// } -class MaterialBannerThemeDemo extends StatelessWidget { - const MaterialBannerThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialBannerTheme( - data: MaterialBannerTheme.of(context).copyWith( - backgroundColor: Colors.purple, - padding: const EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2), - leadingPadding:const EdgeInsetsDirectional.only(end: 16.0) , - contentTextStyle: const TextStyle(color: Colors.white), - ), - child: _MaterialBannerDemo(), - ); - } -} - - -class _MaterialBannerDemo extends StatelessWidget { - final info = - 'A banner displays an important, succinct message, and provides actions for users to address. ' - 'A user action is required for itto be dismissed.'; - - @override - Widget build(BuildContext context) { - return Column( - children: [MaterialBanner( - content: Text(info), - leading: const Icon(Icons.warning, color: Colors.yellow), - actions: [ - ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.white), - onPressed: () {}, - child: const Text( - 'I KNOW', - style: TextStyle( - color: Colors.purple, - fontWeight: FontWeight.bold, - fontSize: 14), - ), - ), - ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.white), - onPressed: () {}, - child: const Text( - 'I IGNORE', - style: TextStyle( - color: Colors.purple, - fontWeight: FontWeight.bold, - fontSize: 14), - ), - ), - ], - )], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart b/packages/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart deleted file mode 100644 index eaf5474f..00000000 --- a/packages/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 167, -// "name": 'MediaQuery获取数据信息', -// "priority": 1, -// "subtitle": "MediaQuery.of(context)可以获取MediaQueryData", -// } - -class CustomMediaQuery extends StatelessWidget { - const CustomMediaQuery({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - MediaQueryData queryData = MediaQuery.of(context); - Map data = { - "size": queryData.size, - "devicePixelRatio": queryData.devicePixelRatio.toStringAsFixed(1), - "textScaleFactor": queryData.textScaleFactor.toStringAsFixed(1), - "platformBrightness": queryData.platformBrightness, - "padding": queryData.padding, - "viewInsets": queryData.viewInsets, - "systemGestureInsets": queryData.padding, - "viewPadding": queryData.padding, - "physicalDepth": queryData.padding, - "alwaysUse24HourFormat": queryData.padding, - "accessibleNavigation": queryData.alwaysUse24HourFormat, - "invertColors": queryData.invertColors, - "highContrast": queryData.highContrast, - "disableAnimations": queryData.disableAnimations, - "boldText": queryData.boldText, - }; - - return Container( - height: 200, - color: Colors.grey.withAlpha(11), - child:ListView( - children: data.keys.map((e) => buildItem(e, data)).toList(), - ), - ); - } - - Widget buildItem(String e, Map data) => Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - e, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - Text( - data[e].toString(), - style: const TextStyle(fontSize: 16, color: Colors.orange), - ) - ], - ), - ), - const Divider( - height: 1, - ) - ], - ); -} - - diff --git a/packages/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart b/packages/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart deleted file mode 100644 index 76ca7bf2..00000000 --- a/packages/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 347 ParentDataWidget 父数据组件 -/// 抽象类,用于将 ParentData 信息挂钩到 RenderObjectWidget 子组件上。其子类有 Positioned、Flexible、Expanded等,这些组件只能用于特定的组件之下。 -/// -// { -// "widgetId": 347, -// "name": 'ParentDataWidget 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } - -class ParentDataWidgetDemo extends StatelessWidget { - const ParentDataWidgetDemo({Key? key}) : super(key: key); - - final String info = - 'ParentDataWidget 是一个抽象类,不能直接使用,它拥有 ParentData 子类型的泛型,该泛型会限定该组件的适应场景。' - '如 Positioned 组件继承自 ParentDataWidget,就说明 Positioned 的上层组件必须使用 Stack 族组件。' - '如 Flexible 组件继承自 ParentDataWidget,就说明 Flexible 的上层组件必须使用 Flex 族组件。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart deleted file mode 100644 index 96f01b2f..00000000 --- a/packages/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 330 PopupMenuTheme 主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。 -// { -// "widgetId": 330, -// "name": "PopupMenuTheme基本使用", -// "priority": 1, -// "subtitle": "可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。", -// } -class PopupMenuThemeDemo extends StatelessWidget { - const PopupMenuThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return PopupMenuTheme( - data: PopupMenuTheme.of(context).copyWith( - color: Colors.orangeAccent, - elevation: 1, - textStyle: const TextStyle(color: Colors.white), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), - bottomRight: Radius.circular(20), - topRight: Radius.circular(5), - bottomLeft: Radius.circular(5), - )), - ), - child: _PopupMenuButtonSimple(), - ); - } -} - -class _PopupMenuButtonSimple extends StatefulWidget { - @override - _PopupMenuButtonSimpleState createState() => _PopupMenuButtonSimpleState(); -} - -class _PopupMenuButtonSimpleState extends State<_PopupMenuButtonSimple> { - final Map map = { - "关于": Icons.info_outline, - "帮助": Icons.help_outline, - "反馈": Icons.add_comment, - }; - - @override - Widget build(BuildContext context) { - return PopupMenuButton( - itemBuilder: (context) => buildItems(), - offset: const Offset(0, 50), - onSelected: print, - onCanceled: () => print('onCanceled'), - ); - } - - List> buildItems() { - return map.keys - .toList() - .map((e) => PopupMenuItem( - value: e, - child: Wrap( - spacing: 6, - children: [ - Icon( - map[e], - ), - Text(e), - ], - ))) - .toList(); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/Positioned/node1_base.dart b/packages/widgets/lib/ProxyWidget/Positioned/node1_base.dart deleted file mode 100644 index 99b7c853..00000000 --- a/packages/widgets/lib/ProxyWidget/Positioned/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 108, -// "name": 'Positioned基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【right】 : 到父右距离 【double】\n" -// "【left】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } -class CustomPositioned extends StatelessWidget { - const CustomPositioned({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Widget yellowBox = Container( - color: Colors.yellow, - height: 100, - width: 100, - ); - - Widget redBox = Container( - color: Colors.red, - height: 90, - width: 90, - ); - - Widget greenBox = Container( - color: Colors.green, - height: 80, - width: 80, - ); - - Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 70, - width: 70, - ); - - return Container( - width: 200, - height: 120, - color: Colors.grey.withAlpha(33), - child: Stack( - children: [ - yellowBox, - redBox, - Positioned(top: 20, left: 20, child: greenBox), - Positioned( - child: cyanBox, - bottom: 10, - right: 10, - ) - ], - )); - } -} diff --git a/packages/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart b/packages/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart deleted file mode 100644 index 02dff47f..00000000 --- a/packages/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/3/31 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 335 PrimaryScrollController 5 初始滑动控制器 它是 InheritedWidget 子类,通过 context 向子树中的可滑动视图提供默认的 ScrollController 对象。 -// { -// "widgetId": 335, -// "name": 'PrimaryScrollController 介绍', -// "priority": 1, -// "subtitle": "【controller】 : 滑动控制器 【ScrollController】\n" -// "【child】 : 子组件 【Widget】", -// } -class PrimaryScrollControllerDemo extends StatelessWidget { - const PrimaryScrollControllerDemo({Key? key}) : super(key: key); - - final String info = - 'PrimaryScrollController 是 InheritedWidget 子类,也就说明它可以为子树组件提供某些默认数据,' - '子树可以通过 context 来获取上层该组件的提供 ScrollController 对象。\n' - '对于一些可滑动组件 ScrollView、SingleChildScrollView、NestedScrollView 等,' - '在使用者未提供 ScrollController 时,且 primary 属性为 true 时(默认true) ,' - '会使用上层 PrimaryScrollController 组件提供的滑动控制器。\n' - '使用 MaterialApp 组件,其已经内置 PrimaryScrollController,'; - - @override - Widget build(BuildContext context) { - ScrollController? label = PrimaryScrollController.of(context); - - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info+"当前其持有的滑动控制器对象: $label"), - ); - } -} diff --git a/packages/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart b/packages/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart deleted file mode 100644 index e63f3f60..00000000 --- a/packages/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 180, -// "name": 'ScrollConfiguration基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【behavior】 : 滑动行为 【ScrollBehavior】\n" -// " 可以使用ScrollConfiguration让ListView无蓝色阴影", -// } -class CustomScrollConfiguration extends StatelessWidget { - CustomScrollConfiguration({Key? key}) : super(key: key); - - final List data = [ - Colors.cyan[50]!, - Colors.cyan[100]!, - Colors.cyan[200]!, - Colors.cyan[300]!, - Colors.cyan[400]!, - Colors.cyan[500]!, - Colors.cyan[600]!, - Colors.cyan[700]!, - Colors.cyan[800]!, - Colors.cyan[900]!, - ]; - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ScrollConfiguration( - behavior: NoScrollBehavior(), child: _buildListView()), - ); - } - - Widget _buildListView() => ListView( - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - )) - .toList(), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - -class NoScrollBehavior extends ScrollBehavior { - @override - Widget buildViewportChrome( - BuildContext context, Widget child, AxisDirection axisDirection) => - child; -} diff --git a/packages/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart deleted file mode 100644 index 75a7a833..00000000 --- a/packages/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 331, -// "name": 'SliderTheme使用', -// "priority": 1, -// "subtitle": "可通过SliderTheme.of获取Slider主题数据对象,其中包含大量属性用于对Slider的设定。" -// "可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。", -// } - -class SliderThemeDemo extends StatefulWidget { - const SliderThemeDemo({Key? key}) : super(key: key); - - @override - _SliderThemeDemoState createState() => _SliderThemeDemoState(); -} - -class _SliderThemeDemoState extends State { - double _bliss = 0.5; - - @override - Widget build(BuildContext context) { - return SliderTheme( - data: SliderTheme.of(context).copyWith(activeTrackColor: Colors.orange), - child: Slider( - min: 0.0, - max: 200.0, - divisions: 10, - label: _bliss.toStringAsFixed(1), - onChanged: (double value) { - setState(() { - _bliss = value; - }); - }, - value: _bliss, - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart b/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart deleted file mode 100644 index b46e66ec..00000000 --- a/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart +++ /dev/null @@ -1,182 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-12 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 331, -// "name": 'SliderTheme对Slider的样式定制', -// "priority": 2, -// "subtitle": "通过thumbShape和valueIndicatorShape可以对Slider进行样式定制。" -// "注: 本例参考flutter-gallery中的SlideDemo", -// } - -class DIYSliderTheme extends StatefulWidget { - const DIYSliderTheme({Key? key}) : super(key: key); - - @override - _DIYSliderThemeState createState() => _DIYSliderThemeState(); -} - -class _DIYSliderThemeState extends State { - double _bliss = 0.5; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - return SliderTheme( - data: theme.sliderTheme.copyWith( - activeTrackColor: Colors.deepPurple, - inactiveTrackColor: Colors.blue.withAlpha(55), - activeTickMarkColor: theme.colorScheme.onSurface.withOpacity(0.7), - inactiveTickMarkColor: theme.colorScheme.surface.withOpacity(0.7), - overlayColor: theme.colorScheme.onSurface.withOpacity(0.12), - thumbColor: Colors.deepPurple, - valueIndicatorColor: Colors.deepPurpleAccent, - thumbShape: _CustomThumbShape(), - valueIndicatorShape: _CustomValueIndicatorShape(), - valueIndicatorTextStyle: theme.accentTextTheme.bodyText2! - .copyWith(color: theme.colorScheme.onSurface), - ), - child: Slider( - min: 0.0, - max: 200.0, - divisions: 10, - label: _bliss.toStringAsFixed(1), - onChanged: (double value) { - setState(() { - _bliss = value; - }); - }, - value: _bliss, - ), - ); - } -} - -class _CustomThumbShape extends SliderComponentShape { - static const double _thumbSize = 4.0; - static const double _disabledThumbSize = 3.0; - - @override - Size getPreferredSize(bool isEnabled, bool isDiscrete) { - return isEnabled - ? const Size.fromRadius(_thumbSize) - : const Size.fromRadius(_disabledThumbSize); - } - - static final Animatable sizeTween = Tween( - begin: _disabledThumbSize, - end: _thumbSize, - ); - - @override - void paint( - PaintingContext context, - Offset center, { - required Animation activationAnimation, - required Animation enableAnimation, - required bool isDiscrete, - required TextPainter labelPainter, - required RenderBox parentBox, - required SliderThemeData sliderTheme, - required TextDirection textDirection, - required double value, - required double textScaleFactor, - required Size sizeWithOverflow, - }) { - final Canvas canvas = context.canvas; - final ColorTween colorTween = ColorTween( - begin: sliderTheme.disabledThumbColor, - end: sliderTheme.thumbColor, - ); - final double size = _thumbSize * sizeTween.evaluate(enableAnimation); - final Path thumbPath = _downTriangle(size, center); - canvas.drawPath(thumbPath, - Paint()..color = colorTween.evaluate(enableAnimation) ?? Colors.blue); - } -} - -Path _upTriangle(double size, Offset thumbCenter) => - _downTriangle(size, thumbCenter, invert: true); - -Path _downTriangle(double size, Offset thumbCenter, {bool invert = false}) { - final Path thumbPath = Path(); - final double height = sqrt(3.0) / 2.0; - final double centerHeight = size * height / 3.0; - final double halfSize = size / 2.0; - final double sign = invert ? -1.0 : 1.0; - thumbPath.moveTo( - thumbCenter.dx - halfSize, thumbCenter.dy + sign * centerHeight); - thumbPath.lineTo(thumbCenter.dx, thumbCenter.dy - 2.0 * sign * centerHeight); - thumbPath.lineTo( - thumbCenter.dx + halfSize, thumbCenter.dy + sign * centerHeight); - thumbPath.close(); - return thumbPath; -} - -class _CustomValueIndicatorShape extends SliderComponentShape { - static const double _indicatorSize = 4.0; - static const double _disabledIndicatorSize = 3.0; - static const double _slideUpHeight = 30.0; - - @override - Size getPreferredSize(bool isEnabled, bool isDiscrete) { - return Size.fromRadius(isEnabled ? _indicatorSize : _disabledIndicatorSize); - } - - static final Animatable sizeTween = Tween( - begin: _disabledIndicatorSize, - end: _indicatorSize, - ); - - @override - void paint(PaintingContext context, Offset center, - {required Animation activationAnimation, - required Animation enableAnimation, - required bool isDiscrete, - required TextPainter labelPainter, - required RenderBox parentBox, - required SliderThemeData sliderTheme, - required TextDirection textDirection, - required double value, - required double textScaleFactor, - required Size sizeWithOverflow}) { - final Canvas canvas = context.canvas; - final ColorTween enableColor = ColorTween( - begin: sliderTheme.disabledThumbColor, - end: sliderTheme.valueIndicatorColor, - ); - final Tween slideUpTween = Tween( - begin: 0.0, - end: _slideUpHeight, - ); - final double size = _indicatorSize * sizeTween.evaluate(enableAnimation); - final Offset slideUpOffset = - Offset(0.0, -slideUpTween.evaluate(activationAnimation)); - final Path thumbPath = _upTriangle(size, center + slideUpOffset); - final Color paintColor = enableColor - .evaluate(enableAnimation) - ?.withAlpha((255.0 * activationAnimation.value).round()) ?? - Colors.black; - canvas.drawPath( - thumbPath, - Paint()..color = paintColor, - ); - canvas.drawLine( - center, - center + slideUpOffset, - Paint() - ..color = paintColor - ..style = PaintingStyle.stroke - ..strokeWidth = 2.0); - labelPainter.paint( - canvas, - center + - slideUpOffset + - Offset(-labelPainter.width / 2.0, -labelPainter.height - 4.0)); - } -} diff --git a/packages/widgets/lib/ProxyWidget/TableCell/node1_base.dart b/packages/widgets/lib/ProxyWidget/TableCell/node1_base.dart deleted file mode 100644 index 3d409381..00000000 --- a/packages/widgets/lib/ProxyWidget/TableCell/node1_base.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 317 TableCell 表室 必须在 Table 组件的后代中使用,用于控制表孩子的竖直方向对齐方式,并没是什么太大的作用。 -// { -// "widgetId": 317, -// "name": 'TableCell基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【verticalAlignment】 : 竖直对齐方式 【TableCellVerticalAlignment】", -// } - -class TableCellDemo extends StatelessWidget { - const TableCellDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); - _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); - _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); - _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); - _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); - _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); - _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); - _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); - - List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; - - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Table( - columnWidths: const { - 0: FixedColumnWidth(80.0), - 1: FixedColumnWidth(80.0), - 2: FixedColumnWidth(80.0), - 3: FixedColumnWidth(80.0), - 4: FixedColumnWidth(80.0), - }, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - border: TableBorder.all( - color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), - children: data - .map((item) => TableRow(children: [ - TableCell( - verticalAlignment: TableCellVerticalAlignment.bottom, - child: Text( - item.name, - style: const TextStyle(color: Colors.blue), - )), - TableCell( - verticalAlignment: TableCellVerticalAlignment.baseline, - child: Text(item.symbol)), - TableCell( - verticalAlignment: TableCellVerticalAlignment.top, - child: Text(item.unitSymbol)), - TableCell( - verticalAlignment: TableCellVerticalAlignment.fill, - child: Text(item.unitName)), - TableCell( - verticalAlignment: TableCellVerticalAlignment.middle, - child: SizedBox(height: 30, child: Text(item.unit)), - ), - ])) - .toList(), - ), - ); - } -} - -class _ItemBean { - String name; - String symbol; - String unit; - String unitName; - String unitSymbol; - - _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); -} diff --git a/packages/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart deleted file mode 100644 index e43562d4..00000000 --- a/packages/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 332 ToggleButtonsTheme 主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。 -// { -// "widgetId": 332, -// "name": "ToggleButtonsTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。", -// } - -class ToggleButtonsThemeDemo extends StatelessWidget { - const ToggleButtonsThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ToggleButtonsTheme( - data: ToggleButtonsTheme.of(context).copyWith( - borderWidth: 1, - borderColor: Colors.orangeAccent, - selectedBorderColor: Colors.blue, - splashColor: Colors.purple.withAlpha(66), - borderRadius: BorderRadius.circular(10), - selectedColor: Colors.red, - fillColor: Colors.green.withAlpha(11), - ), - child: _ToggleButtonsSimple(), - ); - } -} - - -class _ToggleButtonsSimple extends StatefulWidget { - @override - _ToggleButtonsSimpleState createState() => _ToggleButtonsSimpleState(); -} - -class _ToggleButtonsSimpleState extends State<_ToggleButtonsSimple> { - var _isSelected = [true, false, false]; - - @override - Widget build(BuildContext context) { - return ToggleButtons( - children: const[ - Icon(Icons.skip_previous), - Icon(Icons.pause), - Icon(Icons.skip_next), - ], - isSelected: _isSelected, - onPressed: (value) => setState(() { - _isSelected = _isSelected.map((e) => false).toList(); - _isSelected[value] = true; - }), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart b/packages/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart deleted file mode 100644 index 931a1773..00000000 --- a/packages/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 333 TooltipTheme 5 主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。 -// { -// "widgetId": 333, -// "name": "TooltipTheme基本使用", -// "priority": 1, -// "subtitle": "可指定TooltipThemeData数据属性为【后代】的Tooltip组件设置默认样式,如装饰、文字样式、显示时长、边距等。也可以用TooltipTheme.of获取Tooltip的主题属性。", -// } - -class TooltipThemeDemo extends StatelessWidget { - const TooltipThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return TooltipTheme( - child: const TempTooltip(), - data: TooltipTheme.of(context).copyWith( - preferBelow: false, - padding: const EdgeInsets.all(5), - verticalOffset: 20, - margin: const EdgeInsets.all(2), - textStyle: const TextStyle(color: Colors.red, shadows: [ - Shadow(color: Colors.white, offset: Offset(1, 1)), - ]), - decoration: const BoxDecoration(boxShadow: [ - BoxShadow( - color: Colors.orangeAccent, - offset: Offset(1, 1), - blurRadius: 8) - ]))); - } -} - -class TempTooltip extends StatelessWidget { - const TempTooltip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: const [ - Tooltip(message: "天王盖地虎", child: Icon(Icons.info_outline)), - Tooltip(message: "宝塔镇河妖", child: Icon(Icons.info_outline)), - ], - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart deleted file mode 100644 index e0c7edc8..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 295, -// "name": 'AbsorbPointer基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【absorbing】 : 是否吸收事件 【bool】\n" -// "如下,Switch选中时absorbing为true,按钮事件将被吸收,无法点击。", -// } - -class CustomAbsorbPointer extends StatefulWidget { - const CustomAbsorbPointer({Key? key}) : super(key: key); - - @override - _CustomAbsorbPointerState createState() => _CustomAbsorbPointerState(); -} - -class _CustomAbsorbPointerState extends State { - bool _absorbing = false; - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - GestureDetector( - onTap: (){ - print('AbsorbPointer'); - }, - child: AbsorbPointer( - absorbing: _absorbing, - child: _buildButton(), - ), - ), - _buildSwitch(), - Text(!_absorbing ? '允许点击' : '事件已被吸收') - ], - ); - } - - Widget _buildButton() => ElevatedButton( - child: const Text( - 'To About', - style: TextStyle(color: Colors.white), - ), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); - - Widget _buildSwitch() => Switch( - value: _absorbing, - onChanged: (v) { - setState(() { - _absorbing = v; - }); - }); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart deleted file mode 100644 index a7f2e434..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 85, -// "name": 'Align基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomAlign extends StatelessWidget { - const CustomAlign({Key? key}) : super(key: key); - - final List alignments = const [ - Alignment.topLeft, - Alignment.topCenter, - Alignment.topRight, - Alignment.centerLeft, - Alignment.center, - Alignment.centerRight, - Alignment.bottomLeft, - Alignment.bottomCenter, - Alignment.bottomRight, - ]; - - final List alignmentsInfo = const [ - "topLeft", - "topCenter", - "topRight", - "centerLeft", - "center", - "centerRight", - "bottomLeft", - "bottomCenter", - "bottomRight", - ]; - - @override - Widget build(BuildContext context) { - return Wrap( - children: alignments - .toList() - .map((mode) => Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 100, - height: 60, - color: Colors.grey.withAlpha(88), - child: Align( - child: Container( - width: 30, - height: 30, - color: Colors.cyanAccent, - ), - alignment: mode)), - Text(alignmentsInfo[alignments.indexOf(mode)]) - ])) - .toList()); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart deleted file mode 100644 index 2e86f942..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 201, -// "name": 'AnimatedSize基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【vsync】 : vsync 【TickerProvider】", -// } - -class CustomAnimatedSize extends StatefulWidget { - const CustomAnimatedSize({Key? key}) : super(key: key); - - @override - _CustomAnimatedSizeState createState() => _CustomAnimatedSizeState(); -} - -class _CustomAnimatedSizeState extends State - with SingleTickerProviderStateMixin { - final double start = 100; - final double end = 200; - - late double _width; - - @override - void initState() { - _width = start; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - alignment: Alignment.center, - child: AnimatedSize( - vsync: this, - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - alignment: const Alignment(0, 0), - child: Container( - height: 40, - width: _width, - alignment: Alignment.center, - color: Colors.blue, - child: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.white), - ), - ), - ), - ), - ], - ); - } - - Widget _buildSwitch() => Switch( - value: _width == end, - onChanged: (v) { - setState(() { - _width = v ? end : start; - }); - }); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart deleted file mode 100644 index a9c5b695..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 288 AnnotatedRegion 有一个泛型,源码中仅适用该组件改变状态量、导航栏样式,泛型通常为SystemUiOverlayStyle。 -// { -// "widgetId": 288, -// "name": 'AnnotatedRegion改变状态量样式', -// "priority": 1, -// "subtitle": -// "【value】 : 值 【T】\n" -// "【sized】 : 是否提供大小 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } - - -class AnnotatedRegionDemo extends StatelessWidget { - const AnnotatedRegionDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(10), - child: ElevatedButton( - onPressed: (){ - Navigator.push(context, - MaterialPageRoute(builder: (context) => const AnnotatedRegionTestPage()), - ); - }, - child: const Text("进入 AnnotatedRegion 测试页"), - ), - ); - } -} - - -class AnnotatedRegionTestPage extends StatelessWidget{ - const AnnotatedRegionTestPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - const SystemUiOverlayStyle overlayStyle = SystemUiOverlayStyle( - systemNavigationBarColor: Colors.green, - // 导航栏颜色 - systemNavigationBarDividerColor: Colors.red, - statusBarColor: Colors.blue, - systemNavigationBarIconBrightness: Brightness.light, - statusBarIconBrightness: Brightness.light, - statusBarBrightness: Brightness.light, - ); - - return AnnotatedRegion( - value: overlayStyle, - child: Scaffold( - body: Column( - children: [ - Container(height: 56+30.0,color: Colors.blue, - alignment: const Alignment(0,0.55), - child: Row( - children: const [ - BackButton(color: Colors.white,), - Text("AnnotatedRegion测试",style: TextStyle(color: Colors.white,fontSize: 18),) - ], - ), - ), - const SizedBox(height: 30,), - const Text( - "上面标题栏背景颜色为蓝色\n" - "上面标题栏图标为亮调", - - style: TextStyle(color: Colors.black,fontSize: 18),), - const Spacer(), - const Text( - "下面导航栏背景颜色为绿色\n" - "下面导航栏图标为亮调", - - style: TextStyle(color: Colors.black,fontSize: 18),), - const SizedBox(height: 30,), - ], - ), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart deleted file mode 100644 index 44e61d9d..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 77, -// "name": 'AspectRatio基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【aspectRatio】 : 宽高比例 【double】", -// } -class CustomAspectRatio extends StatefulWidget { - const CustomAspectRatio({Key? key}) : super(key: key); - - @override - _CustomAspectRatioState createState() => _CustomAspectRatioState(); -} - -class _CustomAspectRatioState extends State { - double _ratio = 0.75; - - @override - Widget build(BuildContext context) { - Widget child = Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 50, - height: 50, - child: const Text("Static"), - ); - - Widget box = AspectRatio( - aspectRatio: _ratio, - child: Container( - color: Colors.orange, - child: const Icon( - Icons.android, - color: Colors.white, - )), - ); - - return Column( - children: [ - _buildSlider(), - Container( - color: Colors.grey.withAlpha(22), - width: 300, - height: 100, - child: Row( - children: [child, box, child], - ), - ), - ], - ); - } - - Widget _buildSlider() => Slider( - divisions: 20, - min: 0.1, - max: 2.0, - label: _ratio.toStringAsFixed(2), - value: _ratio, - onChanged: (v) => setState(() => _ratio = v), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart deleted file mode 100644 index 59154a5d..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 278, -// "name": 'BackdropFilter基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【filter】 : 过滤器 【ImageFilter】\n" -// "ImageFilter.blur可以实现高斯模糊,指定x,y模糊因子。", -// } - -class CustomBackdropFilter extends StatefulWidget { - const CustomBackdropFilter({Key? key}) : super(key: key); - - @override - _CustomBackdropFilterState createState() => _CustomBackdropFilterState(); -} - -class _CustomBackdropFilterState extends State { - double _sigmaX = 1.2; - double _sigmaY = 1.2; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Stack( - children: [ - _buildImage(), - Positioned.fill( - child: ClipRect( - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: _sigmaX, sigmaY: _sigmaY), - child: Container( - color: Colors.black.withAlpha(0), - ), - ), - ), - ) - ], - ), - _buildSliders() - ], - ); - } - - Widget _buildImage() { - return Wrap( - spacing: 20, - children: [ - SizedBox( - height: 150, - width: 150, - child: Image.asset( - 'assets/images/sabar.webp', - fit: BoxFit.cover, - ), - ), - SizedBox( - height: 150, - width: 150, - child: Image.asset( - 'assets/images/wy_200x300.webp', - fit: BoxFit.cover, - ), - ), - ], - ); - } - - Widget _buildSliders() => Column( - children: [ - Slider( - min: 0, - max: 4, - value: _sigmaX, - divisions: 360, - label: 'x:' + _sigmaX.toStringAsFixed(1), - onChanged: (v) { - setState(() { - _sigmaX = v; - }); - }), - Slider( - min: 0, - max: 4, - value: _sigmaY, - divisions: 360, - label: 'beta:' + _sigmaY.toStringAsFixed(1), - onChanged: (v) { - setState(() { - _sigmaY = v; - }); - }) - ], - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart deleted file mode 100644 index 202321f6..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 75, -// "name": 'Baseline基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【baseline】 : 基线位置 【double】\n" -// "【baselineType】 : 基线类型 【TextBaseline】", -// } -class CustomBaseline extends StatefulWidget { - const CustomBaseline({Key? key}) : super(key: key); - - @override - _CustomBaselineState createState() => _CustomBaselineState(); -} - -class _CustomBaselineState extends State { - double _baseline=20; - - @override - Widget build(BuildContext context) { - Widget childBox = const Text( - '你好,Flutter', - style: TextStyle(fontSize: 20, fontFamily: "Menlo"), - ); - - - Widget baseline = Baseline( - child: childBox, - baseline: _baseline, - baselineType: TextBaseline.alphabetic); - - return Column( - children: [ - _buildSlider(), - Container( - width: 100/0.618, - height: 100, - color: Colors.grey.withAlpha(22), - child: baseline, - ), - ], - ); - } - - Widget _buildSlider() => Slider( - divisions: 20, - min: 0, - max: 60, - label: _baseline.toString(), - value: _baseline, - onChanged: (v) => setState(() => _baseline = v), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart deleted file mode 100644 index ff9fbfa6..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart +++ /dev/null @@ -1,31 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 86, -// "name": 'Center基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】", -// } -class CustomCenter extends StatelessWidget { - const CustomCenter({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(5), - width: 200, - height: 100, - color: Colors.grey.withAlpha(88), - child: Center( - child: Container( - width: 80, - height: 60, - color: Colors.cyanAccent, - ))); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart deleted file mode 100644 index 83b9626f..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 66, -// "name": 'ClipOval基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } -class CustomClipOval extends StatelessWidget { - const CustomClipOval({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - ClipOval( - child: Image.asset( - "assets/images/wy_300x200.webp", - width: 150, - height: 100, - ), - ), - ClipOval( - child: Image.asset( - "assets/images/wy_300x200.webp", - width: 100, - height: 100, - fit: BoxFit.cover, - ), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart deleted file mode 100644 index f8362740..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 69, -// "name": 'ClipPath基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } -class CustomClipPath extends StatelessWidget { - const CustomClipPath({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ClipPath( - clipper: ShapeBorderClipper(shape: _StarShapeBorder()), - child: Image.asset( - "assets/images/wy_300x200.webp", - width: 150, - height: 100, - fit: BoxFit.cover, - ), - ); - } -} - -class _StarShapeBorder extends ShapeBorder { - final Path _path = Path(); - - @override - EdgeInsetsGeometry get dimensions => EdgeInsets.zero; - - @override - Path getInnerPath(Rect rect, {TextDirection? textDirection}) { - return Path(); - } - - @override - Path getOuterPath(Rect rect, {TextDirection? textDirection}) => - nStarPath(20, rect.height / 2, rect.height / 2 * 0.85, - dx: rect.width / 2, dy: rect.height / 2); - - @override - void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {} - - Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) { - double perRad = 2 * pi / num; - double radA = perRad / 2 / 2; - double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA; - _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; - } - - @override - ShapeBorder scale(double t) { - return this; - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart deleted file mode 100644 index 7ec3a067..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 68, -// "name": 'ClipRRect基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【borderRadius】 : 边线半径 【BorderRadius】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } -class CustomClipRRect extends StatelessWidget { - const CustomClipRRect({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ClipRRect( - borderRadius: const BorderRadius.all(Radius.elliptical(35, 30)), - child: Image.asset( - "assets/images/wy_300x200.webp", - width: 150, - height: 100, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart deleted file mode 100644 index b4bfe95f..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 67, -// "name": 'ClipRect基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } -class CustomClipRect extends StatelessWidget { - const CustomClipRect({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ClipRect( - child: SizedBox( - height: 100, - width: 100, - child: Image.asset( - "assets/images/wy_300x200.webp", - fit: BoxFit.cover, - ), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart deleted file mode 100644 index c6f758f4..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:widgets/utils/color_utils.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 88, -// "name": 'ColorFiltered基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【colorFilter】 : 滤色器 【ColorFilter】", -// } -class CustomColorFiltered extends StatefulWidget { - const CustomColorFiltered({Key? key}) : super(key: key); - - @override - _CustomColorFilteredState createState() => _CustomColorFilteredState(); -} - -class _CustomColorFilteredState extends State { - Color _color = Colors.blue.withAlpha(88); - - @override - Widget build(BuildContext context) { - _color = ColorUtils.randomColor(); - return Column( - children: [ - Wrap(spacing: 10, runSpacing: 10, children: [ - _buildRandomColor(), - ...BlendMode.values - .map((mode) => Column( - children: [ - _buildChild(mode), - const SizedBox(height: 10), - Text( - mode.toString().split('.')[1], - style: const TextStyle(fontSize: 10), - ) - ], - )) - .toList() - ]), - ], - ); - } - - Widget _buildChild(m) => SizedBox( - width: 58, - height: 58, - child: ColorFiltered( - child: - const Image(image: AssetImage("assets/images/icon_head.webp")), - colorFilter: ColorFilter.mode(_color, m)), - ); - - Widget _buildRandomColor() => GestureDetector( - onTap: () => setState(() {}), - child: Container( - alignment: Alignment.center, - width: 60, - height: 60, - decoration: BoxDecoration(color: _color, shape: BoxShape.circle), - child: const Text('点我'), - ), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart deleted file mode 100644 index ea3c4d3b..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 267 ColoredBox 在子组件的布局区域上绘制颜色,然后子组件绘制在背景色上。 -// { -// "widgetId": 267, -// "name": 'ColoredBox基本使用', -// "priority": 1, -// "subtitle": "【color】 : 组件 【Color】\n" -// "【child】 : 组件 【Widget】", -// } - -class ColoredBoxDemo extends StatelessWidget { - const ColoredBoxDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ColoredBox( - color: Colors.red, - child: Container( - margin: const EdgeInsets.all(20), - padding: const EdgeInsets.all(20), - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(10)), - color: Colors.blue - ), - alignment: Alignment.center, - width: 250, - height: 100, - child: const Text( - "蓝色是加了 margin 和圆角的 Container,外层包裹红色的 ColoredBox,注意作用范围。", - style: TextStyle(color: Colors.white), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart deleted file mode 100644 index 81da1614..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/3/31 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 265 CompositedTransformFollower 2 合成变换跟随者,一般与 CompositedTransformTarget 组件联合使用,可以使 Overlay 伴随目标变换。 -// { -// "widgetId": 265, -// "name": "基本使用", -// "name": "CompositedTransformFollower 使用", -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【link】 : 链接 【LayerLink】\n" -// "【offset】 : 偏移 【Offset】\n" -// "【targetAnchor】 : 目标锚点 【Alignment】\n" -// "【followerAnchor】 : 伴随者锚点 【Alignment】\n" -// "【showWhenUnlinked】 : 为链接是否显示 【bool】", -// } - -class CompositedTransformFollowerDemo extends StatelessWidget { - - const CompositedTransformFollowerDemo({Key? key}) : super(key: key); - - static const List colors =[Colors.red,Colors.yellow,Colors.blue,Colors.green]; - - - @override - Widget build(BuildContext context) { - return Container( - transform: Matrix4.rotationZ(-15/180*pi), - height: 250, - padding: const EdgeInsets.all(50.0), - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [_LogoTips(), const Text('点击图标\n显隐弹框')], - ), - ...colors.map((color) => Container(width: 80, color: color)) - ], - ), - ); - } - - -} - -class _LogoTips extends StatefulWidget { - @override - _LogoTipsState createState() => _LogoTipsState(); -} - -class _LogoTipsState extends State<_LogoTips> { - OverlayEntry? _overlayEntry; - - final LayerLink _layerLink = LayerLink(); - - bool show = false; - - OverlayEntry _createOverlayEntry() { - return OverlayEntry( - builder: (context) => Positioned( - width: 150, - child: CompositedTransformFollower( - link: _layerLink, - showWhenUnlinked: false, - offset: const Offset(0,-10), - targetAnchor: Alignment.topRight, - child: const Card( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text('我是一个 Overlay,目标组件为图标,当它变换时,我会伴随变换。'), - ), - ), - ), - )); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: _toggleOverlay, - child: CompositedTransformTarget( - link: _layerLink, - child: - const FlutterLogo( - size: 80, - ), - )); - } - - void _toggleOverlay() { - if (!show) { - _showOverlay(); - } else { - _hideOverlay(); - } - show = !show; - } - - void _showOverlay() { - _overlayEntry = _createOverlayEntry(); - Overlay.of(context)?.insert(_overlayEntry!); - } - - void _hideOverlay() { - _overlayEntry?.remove(); - } - - @override - void dispose() { - _hideOverlay(); - super.dispose(); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart deleted file mode 100644 index 78c31169..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/3/31 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 266 CompositedTransformTarget 2 合成变换目标,一般与 CompositedTransformFollower 组件联合使用,可以使 Overlay 伴随目标变换。 -// { -// "widgetId": 266, -// "name": "CompositedTransformTarget 使用", -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【link】 : 链接 【LayerLink】", -// } - -class CompositedTransformTargetDemo extends StatelessWidget { - - const CompositedTransformTargetDemo({Key? key}) : super(key: key); - - static const List colors =[Colors.red,Colors.yellow,Colors.blue,Colors.green]; - - @override - Widget build(BuildContext context) { - return Container( - transform: Matrix4.rotationZ(-15/180*pi), - height: 250, - padding: const EdgeInsets.all(50.0), - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [_LogoTips(), const Text('点击图标\n显隐弹框')], - ), - ...colors.map((color) => Container(width: 80, color: color)) - ], - ), - ); - } - -} - -class _LogoTips extends StatefulWidget { - @override - _LogoTipsState createState() => _LogoTipsState(); -} - -class _LogoTipsState extends State<_LogoTips> { - OverlayEntry? _overlayEntry; - - final LayerLink _layerLink = LayerLink(); - - bool show = false; - - OverlayEntry _createOverlayEntry() { - return OverlayEntry( - builder: (context) => Positioned( - width: 150, - child: CompositedTransformFollower( - link: _layerLink, - showWhenUnlinked: false, - targetAnchor: Alignment.topRight, - child: const Card( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text('我是一个 Overlay,目标组件为图标,当它变换时,我会伴随变换。'), - ), - ), - ), - )); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: _toggleOverlay, - child: CompositedTransformTarget( - link: _layerLink, - child: - const FlutterLogo( - size: 80, - ), - )); - } - - void _toggleOverlay() { - if (!show) { - _showOverlay(); - } else { - _hideOverlay(); - } - show = !show; - } - - void _showOverlay() { - _overlayEntry = _createOverlayEntry(); - Overlay.of(context)?.insert(_overlayEntry!); - } - - void _hideOverlay() { - _overlayEntry?.remove(); - } - - @override - void dispose() { - _hideOverlay(); - super.dispose(); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart deleted file mode 100644 index e0be072e..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 80, -// "name": 'BoxConstraints基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【minWidth】 : 最小宽 【double】\n" -// "【minHeight】 : 最小高 【double】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】", -// } -class CustomConstrainedBox extends StatefulWidget { - const CustomConstrainedBox({Key? key}) : super(key: key); - - @override - _CustomConstrainedBoxState createState() => _CustomConstrainedBoxState(); -} - -class _CustomConstrainedBoxState extends State { - String _text = ''; - - @override - Widget build(BuildContext context) { - Widget child = Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 40, - height: 40, - child: const Text("Static"), - ); - - Widget box = ConstrainedBox( - constraints: const BoxConstraints( - minHeight: 50, - minWidth: 20, - maxHeight: 80, - maxWidth: 150, - ), - child: Container(color: Colors.orange, child: Text(_text)), - ); - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(22), - width: 300, - height: 100, - child: Row( - children: [child, UnconstrainedBox(child: box), child], - ), - ), - _buildInput(), - ], - ); - } - - Widget _buildInput() { - return Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - hintText: '请输入', - ), - onChanged: (v) { - setState(() { - _text = v; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart deleted file mode 100644 index d2c648f3..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 299 CupertinoTextSelectionToolbar 对文本选择做出响应的 ios 风格的工具栏。 -// { -// "widgetId": 299, -// "name": '该组件无法使用', -// "priority": 1, -// "subtitle": -// "【-】 : - 【-】", -// } - -class CupertinoTextSelectionToolbarDemo extends StatelessWidget { - const CupertinoTextSelectionToolbarDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - padding: const EdgeInsets.all(10), - width: 300, - child: const Text( - "注:此组件私有构造器,外部无法使用,并没有使用价值。", - style: TextStyle(color: Colors.red, fontSize: 18), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart deleted file mode 100644 index 4f612fd0..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 285, -// "name": 'CustomSingleChildLayout基本使用', -// "priority": 1, -// "subtitle": -// "【delegate】 : 代理 【SingleChildLayoutDelegate】", -// } - -class CustomSingleChildLayoutDemo extends StatelessWidget { - const CustomSingleChildLayoutDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - print('-------CustomSingleChildLayoutDemo------'); - return Container( - width: 300, - height: 200, - color: Colors.grey.withAlpha(11), - child: CustomSingleChildLayout( - delegate: _TolySingleChildLayoutDelegate(), - child: Container( - color: Colors.orange, - ), - ), - ); - } -} - -class _TolySingleChildLayoutDelegate extends SingleChildLayoutDelegate { - @override - bool shouldRelayout(SingleChildLayoutDelegate oldDelegate) { - return true; - } - - @override - Size getSize(BoxConstraints constraints) { - print('----getSize:----constraints:$constraints----'); - return super.getSize(constraints); - } - - @override - Offset getPositionForChild(Size size, Size childSize) { - print('----getPositionForChild: size:$size----childSize:$childSize----'); - return Offset(size.width / 2, 0); - } - - @override - BoxConstraints getConstraintsForChild(BoxConstraints constraints) { - print('----getConstraintsForChild:----constraints:$constraints----'); - return BoxConstraints( - maxWidth: constraints.maxWidth / 2, - maxHeight: constraints.maxHeight / 2, - minHeight: constraints.maxHeight / 4, - minWidth: constraints.maxWidth / 4, - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart deleted file mode 100644 index 180c3f95..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 70, -// "name": 'DecoratedBox基本使用', -// "priority": 1, -// "subtitle": -// "【decoration】 : 装饰对象 【Decoration】\n" -// "【position】 : 前景色(左)/后景色(右) 【DecorationPosition】", -// } -class BoxDecorationDemo extends StatelessWidget { - const BoxDecorationDemo({Key? key}) : super(key: key); - - final List rainbow = const [ - 0xffff0000, - 0xffFF7F00, - 0xffFFFF00, - 0xff00FF00, - 0xff00FFFF, - 0xff0000FF, - 0xff8B00FF - ]; - - @override - Widget build(BuildContext context) { - return DecoratedBox( - position: DecorationPosition.background, - decoration: BoxDecoration( - gradient: LinearGradient( - stops: const [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], - colors: rainbow.map((e) => Color(e)).toList()), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20), - bottomRight: Radius.circular(20), - ), - boxShadow: const [ - BoxShadow( - color: Colors.orangeAccent, - offset: Offset(1, 1), - blurRadius: 10, - spreadRadius: 1), - ]), - child: Icon( - Icons.android, - size: 80, - color: Colors.black.withAlpha(123), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart deleted file mode 100644 index 0170ed81..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 70, -// "name": 'DecoratedBox形状和图片装饰', -// "priority": 2, -// "subtitle": -// "【shape】 : 形状 【BoxShape】\n" -// "【image】 : 背景图片 【DecorationImage】\n", -// } -class ShapeImageDemo extends StatelessWidget { - const ShapeImageDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const DecoratedBox( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage( - 'assets/images/wy_200x300.webp', - ))), - child: SizedBox( - height: 80, - width: 80, - child: Icon( - Icons.ac_unit, - color: Colors.white, - size: 40, - ), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart deleted file mode 100644 index 665dd42a..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'FlutterLogoDecoration装饰', -// "priority": 6, -// "subtitle": "通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用)\n", -// } - -class FlutterLogoDecorationDemo extends StatelessWidget { - const FlutterLogoDecorationDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const DecoratedBox( - decoration: FlutterLogoDecoration( -// darkColor: Colors.orange, -// lightColor: Colors.deepPurpleAccent, - margin: EdgeInsets.all(8), - style: FlutterLogoStyle.stacked), - child: SizedBox( - width: 100, - height: 100, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart deleted file mode 100644 index eacfaad2..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 89, -// "name": 'FadeTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【opacity】 : 动画 【Animation】", -// } -class CustomFadeTransition extends StatefulWidget { - const CustomFadeTransition({Key? key}) : super(key: key); - - @override - _CustomFadeTransitionState createState() => _CustomFadeTransitionState(); -} - -class _CustomFadeTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - ); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - color: Colors.grey.withAlpha(22), - width: 100, - height: 100, - child: FadeTransition( - opacity: CurvedAnimation(parent: _ctrl, curve: Curves.linear), - child: const Icon(Icons.android, color: Colors.green, size: 60), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart deleted file mode 100644 index b5b3ab73..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart +++ /dev/null @@ -1,96 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 87, -// "name": 'FittedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【fit】 : 适应模式 【BoxFit】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomFittedBox extends StatefulWidget { - const CustomFittedBox({Key? key}) : super(key: key); - - @override - _CustomFittedBoxState createState() => _CustomFittedBoxState(); -} - -class _CustomFittedBoxState extends State { - double _childW = 20; - double _childH = 30; - - final List rainbow = const [ - 0xffff0000, - 0xffFF7F00, - 0xffFFFF00, - 0xff00FF00, - 0xff00FFFF, - 0xff0000FF, - 0xff8B00FF - ]; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Wrap( - spacing: 10, - runSpacing: 10, - children: BoxFit.values - .map((mode) => Column( - children: [ - _buildChild(mode), - const SizedBox(height: 10), - Text(mode.toString().split('.')[1]) - ], - )) - .toList()), - _buildSlider() - ], - ); - } - - Widget _buildChild(BoxFit m) { - return Container( - color: Colors.grey.withAlpha(44), - width: 80, - height: 60, - child: FittedBox( - fit: m, - child: Container( - width: _childW, - height: _childH, - decoration: BoxDecoration( - //添加渐变色 - gradient: LinearGradient( - stops: const[0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], - colors: rainbow.map((e) => Color(e)).toList()), - ), - ), - ), - ); - } - - Widget _buildSlider() => Column( - children: [ - Slider( - min: 10, - max: 150, - divisions: 100, - label: '子宽度:' + _childW.toStringAsFixed(1), - value: _childW, - onChanged: (v) => setState(() => _childW = v)), - Slider( - min: 10, - max: 150, - divisions: 100, - label: '子高度:' + _childH.toStringAsFixed(1), - value: _childH, - onChanged: (v) => setState(() => _childH = v)), - ], - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart deleted file mode 100644 index 997bf1a1..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 263 FractionalTranslation 通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。 -// { -// "widgetId": 263, -// "name": "FractionalTranslation基本使用", -// "priority": 1, -// "subtitle": "【translation】 : 偏移分度值 【Offset】\n" -// "【child】: 子组件 【Widget】", -// } - -class FractionalTranslationDemo extends StatefulWidget { - const FractionalTranslationDemo({Key? key}) : super(key: key); - - @override - _FractionalTranslationDemoState createState() => - _FractionalTranslationDemoState(); -} - -class _FractionalTranslationDemoState extends State { - double dx = 0.0; - double dy = 0.0; - - @override - Widget build(BuildContext context) { - print(dx); - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 200, - height: 100, - alignment: Alignment.topLeft, - color: Colors.grey.withAlpha(33), - child: FractionalTranslation( - translation: Offset(dx, dy), - child: const Icon( - Icons.android, - color: Colors.green, - ), - ), - ), - _buildSliderX(), - _buildSliderY() - ], - ); - } - - Widget _buildSliderX() => Slider( - min: -2.0, - max: 10.0, - value: dx, - divisions: 100, - label: 'dx:${dx.toStringAsFixed(1)}', - onChanged: (v) => setState(() => dx = v), - ); - - - Widget _buildSliderY() => Slider( - min: -2.0, - max: 6.0, - value: dy, - divisions: 100, - label: 'dy:${dy.toStringAsFixed(1)}', - onChanged: (v) => setState(() => dy = v), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart deleted file mode 100644 index 0485ab65..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 82, -// "name": 'FractionallySizedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【widthFactor】 : 宽分率 【double】\n" -// "【heightFactor】 : 高分率 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomFractionallySizedBox extends StatefulWidget { - const CustomFractionallySizedBox({Key? key}) : super(key: key); - - @override - _CustomFractionallySizedBoxState createState() => - _CustomFractionallySizedBoxState(); -} - -class _CustomFractionallySizedBoxState - extends State { - double _hf = 0.5; - double _wf = 0.4; - - @override - Widget build(BuildContext context) { - Widget box = FractionallySizedBox( - widthFactor: _wf, - heightFactor: _hf, - alignment: Alignment.center, - child: Container(color: Colors.orange), - ); - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - child: box), - _buildSlider() - ], - ); - } - - Widget _buildSlider() => Column( - children: [ - Slider( - divisions: 20, - min: 0.0, - max: 2, - label: '宽分率:' + _wf.toStringAsFixed(1), - value: _wf, - onChanged: (v) => setState(() => _wf = v)), - Slider( - divisions: 20, - min: 0.0, - max: 2, - label: '高分率:' + _hf.toStringAsFixed(1), - value: _hf, - onChanged: (v) => setState(() => _hf = v)), - ], - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart deleted file mode 100644 index b819a2be..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 292, -// "name": 'IgnorePointer基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【ignoring】 : 是否忽视事件 【bool】\n" -// "如下,Switch选中时ignoring为true,按钮事件将被锁定,无法点击。", -// } - -class CustomIgnorePointer extends StatefulWidget { - const CustomIgnorePointer({Key? key}) : super(key: key); - - @override - _CustomIgnorePointerState createState() => _CustomIgnorePointerState(); -} - -class _CustomIgnorePointerState extends State { - bool _ignore = false; - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - GestureDetector( - onTap: (){ - print('IgnorePointer'); - }, - child: IgnorePointer( - ignoring: _ignore, - child: _buildButton(), - ), - ), - _buildSwitch(), - Text(!_ignore ? '允许点击' : '点击已锁定') - ], - ); - } - - Widget _buildButton() => ElevatedButton( - child: const Text( - 'To About', - style: TextStyle(color: Colors.white), - ), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); - - Widget _buildSwitch() => Switch( - value: _ignore, - onChanged: (v) { - setState(() { - _ignore = v; - }); - }); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart deleted file mode 100644 index d4b11d7a..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart +++ /dev/null @@ -1,144 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2022/04/23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 滤色效果', -// "priority": 2, -// "subtitle": "通过 ColorFilter 对象实现颜色滤镜。", -// } -class ImageFilteredColor extends StatefulWidget { - const ImageFilteredColor({Key? key}) : super(key: key); - - @override - State createState() => _ImageFilteredColorState(); -} - -class _ImageFilteredColorState extends State { - - String _currentFilter = 'srgbToLinear'; - - ColorFilter greyscale = const ColorFilter.matrix([ - 0.2126, 0.7152, 0.0722, 0, 0, - 0.2126, 0.7152, 0.0722, 0, 0, - 0.2126, 0.7152, 0.0722, 0, 0, - 0, 0, 0, 1, 0, - ]); - ColorFilter sepia = const ColorFilter.matrix([ - 0.393, 0.769, 0.189, 0, 0, - 0.349, 0.686, 0.168, 0, 0, - 0.272, 0.534, 0.131, 0, 0, - 0, 0, 0, 1, 0, - ]); - ColorFilter invert = const ColorFilter.matrix([ - -1, 0, 0, 0, 255, - 0, -1, 0, 0, 255, - 0, 0, -1, 0, 255, - 0, 0, 0, 1, 0, - ]); - ColorFilter identity = const ColorFilter.matrix([ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0, - ]); - - - ColorFilter darken = const ColorFilter.matrix([ - 1,0,0,0,-126.0, - 0,1,0,0,-126.0, - 0,0,1,0,-126.0, - 0,0,0,1,0 - ]); - - ColorFilter light = const ColorFilter.matrix([ - 1,0,0,0,90, - 0,1,0,0,90, - 0,0,1,0,90, - 0,0,0,1,0 - ]); - - late Map filterMap={ - '原图': identity, - 'light': light, - 'darken': darken, - 'greyscale': greyscale, - 'sepia': sepia, - 'invert': invert, - 'srgbToLinear':const ColorFilter.srgbToLinearGamma(), - 'linearToSrgb':const ColorFilter.linearToSrgbGamma(), - }; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - ImageFiltered( - imageFilter: filterMap[_currentFilter]??identity, - child: const _TargetContent(), - ), - buildTileModeCheck() - ], - ); - } - - - Widget buildTileModeCheck() => Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Wrap( - children: filterMap.keys.map((e) { - TextStyle style; - if (e == _currentFilter) { - Color color = Theme.of(context).primaryColor; - style = TextStyle(fontWeight: FontWeight.bold, color: color); - } else { - style = const TextStyle( - fontWeight: FontWeight.bold, color: Colors.grey); - } - return GestureDetector( - onTap: () => setState(() => _currentFilter = e), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8,vertical: 2), - child: Text( - e, - style: style, - ), - ), - ); - }).toList(), - ), - ); -} - -class _TargetContent extends StatelessWidget { - const _TargetContent({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - SizedBox( - height: 150, - width: 150, - child: Image.asset( - 'assets/images/sabar.webp', - fit: BoxFit.cover, - ), - ), - SizedBox( - height: 150, - width: 150, - child: Image.asset( - 'assets/images/wy_200x300.webp', - fit: BoxFit.cover, - ), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart deleted file mode 100644 index d429de38..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/21 -/// contact me by email 1981462002@qq.com -/// 说明: 298 IntrinsicHeight 根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。 - -// { -// "widgetId": 298, -// "name": 'IntrinsicHeight基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。", -// } - -class IntrinsicHeightDemo extends StatefulWidget { - const IntrinsicHeightDemo({Key? key}) : super(key: key); - - @override - _IntrinsicHeightDemoState createState() => _IntrinsicHeightDemoState(); -} - -class _IntrinsicHeightDemoState extends State { - double _height =120.0; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - buildChild(_height), - const SizedBox(height: 10), - _buildSlider() - ], - ); - } - - Widget buildChild(double leftHeight) { - return IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: leftHeight, - width: 120, - color: Colors.yellow, - alignment: Alignment.center, - child: Text("height:${leftHeight.toStringAsFixed(1)}"), - ), - Container( - color: Colors.blue, - width: 150, - height: 80, - alignment: Alignment.center, - child: const Text("固定高"), - ), - Container( - color: Colors.red, - width: 60, - alignment: Alignment.center, - child: const Text("最高"), - ) - ], - ), - ); - } - - Widget _buildSlider() =>Slider( - value: _height, - max: 200.0, - min: 30.0, - divisions: 17, - onChanged: (v)=> setState(() => _height= v), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart deleted file mode 100644 index 1a3e5130..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/21 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 297, -// "name": 'IntrinsicWidth基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。", -// } - -class IntrinsicWidthDemo extends StatefulWidget { - const IntrinsicWidthDemo({Key? key}) : super(key: key); - - @override - _IntrinsicWidthDemoState createState() => _IntrinsicWidthDemoState(); -} - -class _IntrinsicWidthDemoState extends State { - double _height =120.0; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - buildChild(_height), - const SizedBox(height: 10), - _buildSlider() - ], - ); - } - - Widget buildChild(double leftWidth) { - return IntrinsicWidth( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 50, - width: leftWidth, - color: Colors.yellow, - alignment: Alignment.center, - child: Text("width:${leftWidth.toStringAsFixed(1)}"), - ), - Container( - color: Colors.blue, - width: 150, - height: 60, - alignment: Alignment.center, - child: const Text("固定宽"), - ), - Container( - color: Colors.red, - height: 40, - alignment: Alignment.center, - child: const Text("最宽"), - ) - ], - ), - ); - } - - Widget _buildSlider() =>Slider( - value: _height, - max: 200.0, - min: 80.0, - divisions: 17, - onChanged: (v)=> setState(() => _height= v), - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart deleted file mode 100644 index 4fb1a7da..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 287, -// "name": 'LayoutBuilder基本认识', -// "priority": 1, -// "subtitle": "【builder】 : 布局构造器 【LayoutWidgetBuilder】", -// } -class CustomLayoutBuilder extends StatelessWidget { - const CustomLayoutBuilder({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - print('CustomLayoutBuild'); - return Container( - alignment: Alignment.center, - height: 80, - width: 150, - color: Colors.green, - child: LayoutBuilder( - builder: (_, zone) { - return Text( - '父容器宽:${zone.maxWidth}\n' - '父容器高:${zone.maxHeight}', - style: const TextStyle(color: Colors.white, fontSize: 16), - ); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart deleted file mode 100644 index 4ee2ab4d..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 287, -// "name": 'LayoutBuilder的适应布局', -// "priority": 2, -// "subtitle": "可以根据区域的大小进行组件展示设计。" -// "比如在不同的宽度区域显示不同的布局结构。" -// "毕竟很多地方不容易获取父组件区域,使用LayoutBuilder就会非常爽口。", -// } - -class FitByLayoutBuilder extends StatefulWidget { - const FitByLayoutBuilder({Key? key}) : super(key: key); - - @override - _FitByLayoutBuilderState createState() => _FitByLayoutBuilderState(); -} - -class _FitByLayoutBuilderState extends State { - double _width = 100; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - SizedBox( - width: _width, - child: LayoutBuilder( - builder: (_, zone) { - if (zone.maxWidth <= 150) { - return _buildType1(); - } else { - return _buildType2(zone); - } - }, - ), - ), - _buildSlider(), - ], - ); - } - - Widget _buildSlider() => Slider( - min: 50, - max: 300, - label: "父宽:${_width.toStringAsFixed(1)}", - value: _width, - onChanged: (v) => setState(() { - _width = v; - })); - - Widget _buildType1() => Container( - color: Colors.blue, - child: Column( - children: [ - _buildTitle(), - Padding( - padding: const EdgeInsets.all(8.0), - child: _buildContent(), - ), - ], - ), - ); - - Widget _buildType2(BoxConstraints zone) => Container( - height: 100, - width: zone.maxWidth, - color: Colors.orange, - child: Row( - children: [ - Container( - margin: const EdgeInsets.all(10), - height: 80, - width: 30, - color: Colors.grey, - ), - Expanded(child: _buildContent()) - ], - ), - ); - - Widget _buildTitle() => Container( - margin: const EdgeInsets.only(left: 10, right: 10, top: 10), - color: Colors.grey, - height: 30, - ); - - Widget _buildContent() => Wrap( - runSpacing: 3, - children: [ - Container( - color: Colors.red, - height: 30, - ), - Container( - color: Colors.yellow, - height: 30, - ), - Container( - color: Colors.green, - height: 30, - ), - ], - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart deleted file mode 100644 index f2889afc..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.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 -/// 说明: - -// { -// "widgetId": 79, -// "name": 'LimitedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】", -// } -class CustomLimitedBox extends StatefulWidget { - const CustomLimitedBox({Key? key}) : super(key: key); - - @override - _CustomLimitedBoxState createState() => _CustomLimitedBoxState(); -} - -class _CustomLimitedBoxState extends State { - String _text = ''; - - @override - Widget build(BuildContext context) { - Widget child = Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 50, - height: 50, - child: const Text("Static"), - ); - - Widget box = LimitedBox( - maxHeight: 60, - maxWidth: 100, - child: Container(color: Colors.orange, child: Text(_text)), - ); - - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(22), - width: 300, - height: 100, - child: Row( - children: [child, UnconstrainedBox(child: box), child], - ), - ), - _buildInput() - ], - ); - } - - Widget _buildInput() { - return Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - hintText: '请输入', - ), - onChanged: (v) { - setState(() { - _text = v; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart deleted file mode 100644 index 7565ecb6..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 71, -// "name": 'Offstage基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【offstage】 : 是否消失 【bool】", -// } -class CustomOffstage extends StatefulWidget { - const CustomOffstage({Key? key}) : super(key: key); - - @override - _CustomOffstageState createState() => _CustomOffstageState(); -} - -class _CustomOffstageState extends State { - bool _off = false; - - @override - Widget build(BuildContext context) { - Widget radBox = Container( - height: 50, - width: 60, - color: Colors.red, - child: Switch( - value: _off, - onChanged: (v) => setState(() => _off = v)), - ); - - return SizedBox( - width: 250, - height: 200, - child: Row( - children: [radBox, _buildOffStage(), radBox], - ), - ); - } - - Widget _buildOffStage() => Offstage( - offstage: _off, - child: Container( - alignment: Alignment.center, - height: 100, - width: 100, - color: Colors.blue, - child: const Text( - "Offstage", - style: TextStyle(fontSize: 20), - ), - )); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart deleted file mode 100644 index 41baec52..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 73, -// "name": 'Opacity基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【opacity】 : 透明度0~1 【double】", -// } -class CustomOpacity extends StatefulWidget { - const CustomOpacity({Key? key}) : super(key: key); - - @override - _CustomOpacityState createState() => _CustomOpacityState(); -} - -class _CustomOpacityState extends State { - double _opacity = 0.2; - - @override - Widget build(BuildContext context) { - return Column( - children: [_buildSlider(), _buildOpacity()], - ); - } - - // 创建Opacity - Widget _buildOpacity() => Opacity( - opacity: _opacity, - child: Image.asset(// 图片 - 'assets/images/icon_head.webp', - width: 100, - ), - ); - Widget _buildSlider() => Slider( - divisions: 20, - label: _opacity.toString(), - value: _opacity, - onChanged: (v) => setState(() => _opacity = v)); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart deleted file mode 100644 index 145f001e..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 83, -// "name": 'OverflowBox基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【minWidth】 : 最小宽 【double】\n" -// "【minHeight】 : 最小高 【double】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomOverflowBox extends StatefulWidget { - const CustomOverflowBox({Key? key}) : super(key: key); - - @override - _CustomOverflowBoxState createState() => _CustomOverflowBoxState(); -} - -class _CustomOverflowBoxState extends State { - String _text = ''; - - @override - Widget build(BuildContext context) { - Widget box = OverflowBox( - alignment: Alignment.center, - minHeight: 50, - minWidth: 50, - maxWidth: 200, - maxHeight: 120, - child: Container( - color: Colors.orange, - child: Text(_text), - ), - ); - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(33), - width: 100, - height: 100, - child: box), - _buildInput() - ], - ); - } - - Widget _buildInput() { - return Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - hintText: '请输入', - ), - onChanged: (v) { - setState(() { - _text = v; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart deleted file mode 100644 index aee7c3e9..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/5/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 74, -// "name": 'Padding四面等边距', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【padding】 : 内四边距 【EdgeInsetsGeometry】" -// "EdgeInsets.all用来限定相同的四边边距", -// } -class PaddingAll extends StatelessWidget { - const PaddingAll({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 150, - child: Padding( - padding: const EdgeInsets.all(20), - child: _buildChild(), - ), - ); - } - - Widget _buildChild() => Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 100, - height: 100, - child: const Text("孩子"), - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart deleted file mode 100644 index 9e91a181..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: 296 PhysicalModel 物理模块 可以让子组件按照圆形、方行进行剪裁,并且可以指定背景色、圆角、影深、阴影颜色、剪切行为。 -// { -// "widgetId": 296, -// "name": "PhysicalModel基本使用", -// "priority": 1, -// "subtitle": "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【borderRadius】 : 圆角 【BorderRadius】\n" -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 阴影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【shape】 : 形状 【BoxShape】\n" -// "【color】: 颜色 【Color】", -// } -class PhysicalModelDemo extends StatelessWidget{ - const PhysicalModelDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox( - width: 150, - height: 150, - child: PhysicalModel( - shadowColor: Colors.orange, - elevation: 3, - child: Image.asset( - 'assets/images/caver.webp', - fit: BoxFit.cover, - ), - clipBehavior: Clip.hardEdge, - shape: BoxShape.circle, - color: Colors.deepPurpleAccent), - ), - - SizedBox( - width: 150, - height: 150, - child: PhysicalModel( - shadowColor: Colors.orange, - elevation: 3, - child: Image.asset( - 'assets/images/caver.webp', - fit: BoxFit.cover, - ), - borderRadius: const BorderRadius.all(Radius.circular(20)), - clipBehavior: Clip.hardEdge, - shape: BoxShape.rectangle, - color: Colors.deepPurpleAccent), - ), - ], - ); - } - -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart deleted file mode 100644 index ee4e255b..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart +++ /dev/null @@ -1,41 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 279 PhysicalShape 物理形状 可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。 -// { -// "widgetId": 279, -// "name": "PhysicalShape基本使用", -// "priority": 1, -// "subtitle": "【clipper】 : 裁剪器 【CustomClipper】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 阴影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【color】: 颜色 【Color】", -// } - -class PhysicalShapeDemo extends StatelessWidget { - const PhysicalShapeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 200, - child: PhysicalShape( - shadowColor: Colors.orange, - elevation: 3, - child: Image.asset( - 'assets/images/caver.webp', - fit: BoxFit.cover, - ), - clipBehavior: Clip.hardEdge, - clipper: const ShapeBorderClipper( - shape: CircleBorder(side: BorderSide.none), - ), - color: Colors.deepPurpleAccent), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart deleted file mode 100644 index 3bb29b5d..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart +++ /dev/null @@ -1,185 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 264 RepaintBoundary 重绘边界 为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用。 -// { -// "widgetId": 264, -// "name": "RepaintBoundary基本使用", -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "比如上面的绘制视图,即使shouldRepaint为false,在滑动中会也会不断执行paint方法,使用RepaintBoundary可以避免不必要的绘制。", -// } - -class RepaintBoundaryDemo extends StatelessWidget{ - const RepaintBoundaryDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const RepaintBoundary( - child: TempPlayBezier3Page(), - ); - } -} - -class TempPlayBezier3Page extends StatefulWidget { - const TempPlayBezier3Page({Key? key}) : super(key: key); - - @override - _TempPlayBezier3PageState createState() => _TempPlayBezier3PageState(); -} - -class _TempPlayBezier3PageState extends State { - List _pos = []; - int? selectPos; - - @override - void initState() { - _initPoints(); - super.initState(); - } - - void _initPoints() { - _pos = []; - _pos.add(const Offset(0, 0)); - _pos.add(const Offset(60, -60)); - _pos.add(const Offset(-90, -90)); - _pos.add(const Offset(-120, -40)); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - width: MediaQuery.of(context).size.width, - child: CustomPaint( - painter: TempBezierPainter(pos: _pos, selectPos: selectPos), - ), - ); - } -} - -class TempBezierPainter extends CustomPainter { - late Paint _gridPaint; - late Path _gridPath; - - late Paint _mainPaint; - late Path _mainPath; - int? selectPos; - late Paint _helpPaint; - - List pos; - - TempBezierPainter({this.pos=const [], this.selectPos}) { - _gridPaint = Paint()..style = PaintingStyle.stroke; - _gridPath = Path(); - - _mainPaint = Paint() - ..color = Colors.orange - ..style = PaintingStyle.stroke - ..strokeWidth = 2; - _mainPath = Path(); - - _helpPaint = Paint() - ..color = Colors.purple - ..style = PaintingStyle.stroke - ..strokeWidth = 2 - ..strokeCap = StrokeCap.round; - } - - @override - void paint(Canvas canvas, Size size) { - print('----------Paint-------'); - canvas.clipRect(Offset.zero & size); - canvas.translate(size.width / 2, size.height / 2); - _drawGrid(canvas, size); //绘制格线 - _drawAxis(canvas, size); //绘制轴线 - - _mainPath.moveTo(pos[0].dx, pos[0].dy); - _mainPath.cubicTo( - pos[1].dx, pos[1].dy, pos[2].dx, pos[2].dy, pos[3].dx, pos[3].dy); - canvas.drawPath(_mainPath, _mainPaint); - _drawHelp(canvas); - _drawSelectPos(canvas); - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; - - void _drawGrid(Canvas canvas, Size size) { - _gridPaint - ..color = Colors.grey - ..strokeWidth = 0.5; - _gridPath = _buildGridPath(_gridPath, size); - canvas.drawPath(_buildGridPath(_gridPath, size), _gridPaint); - - canvas.save(); - canvas.scale(1, -1); //沿x轴镜像 - canvas.drawPath(_gridPath, _gridPaint); - canvas.restore(); - - canvas.save(); - canvas.scale(-1, 1); //沿y轴镜像 - canvas.drawPath(_gridPath, _gridPaint); - canvas.restore(); - - canvas.save(); - canvas.scale(-1, -1); //沿原点镜像 - canvas.drawPath(_gridPath, _gridPaint); - canvas.restore(); - } - - void _drawAxis(Canvas canvas, Size size) { - canvas.drawPoints( - PointMode.lines, - [ - Offset(-size.width / 2, 0), - Offset(size.width / 2, 0), - Offset(0, -size.height / 2), - Offset(0, size.height / 2), - Offset(0, size.height / 2), - Offset(0 - 7.0, size.height / 2 - 10), - Offset(0, size.height / 2), - Offset(0 + 7.0, size.height / 2 - 10), - Offset(size.width / 2, 0), - Offset(size.width / 2 - 10, 7), - Offset(size.width / 2, 0), - Offset(size.width / 2 - 10, -7), - ], - _gridPaint - ..color = Colors.blue - ..strokeWidth = 1.5); - } - - Path _buildGridPath(Path path, Size size, {step = 20.0}) { - for (int i = 0; i < size.height / 2 / step; i++) { - path.moveTo(0, step * i); - path.relativeLineTo(size.width / 2, 0); - } - for (int i = 0; i < size.width / 2 / step; i++) { - path.moveTo(step * i, 0); - path.relativeLineTo( - 0, - size.height / 2, - ); - } - return path; - } - - void _drawHelp(Canvas canvas) { - canvas.drawPoints(PointMode.lines, pos, _helpPaint..strokeWidth = 1); - canvas.drawPoints(PointMode.points, pos, _helpPaint..strokeWidth = 8); - } - - void _drawSelectPos(Canvas canvas) { - if (selectPos == null) return; - canvas.drawCircle( - pos[selectPos!], - 10, - _helpPaint - ..color = Colors.green - ..strokeWidth = 2); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart deleted file mode 100644 index 14a53292..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 72, -// "name": 'RotatedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【quarterTurns】 : 旋转多少个90° 【int】", -// } -class CustomRotatedBox extends StatefulWidget { - const CustomRotatedBox({Key? key}) : super(key: key); - - @override - _CustomRotatedBoxState createState() => _CustomRotatedBoxState(); -} - -class _CustomRotatedBoxState extends State { - int _quarterTurns = 0; - - @override - Widget build(BuildContext context) { - return RotatedBox( - quarterTurns: _quarterTurns, - child: GestureDetector( - onTap: () => setState(() => _quarterTurns++), - child: const Icon( - Icons.android, - size: 60, - color: Colors.blue, - )), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart deleted file mode 100644 index 3e5c2d14..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 294 SizeChangedLayoutNotifier 尺寸变化通告 使用 SizeChangedLayoutNotifier 可以在子组件布局区域发生变化后,发出通知。使用NotificationListener可以进行监听。 -// { -// "widgetId": 294, -// "name": '基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 组件 【Widget】", -// } - -class SizeChangedLayoutNotifierDemo extends StatefulWidget { - const SizeChangedLayoutNotifierDemo({Key? key}) : super(key: key); - - @override - _SizeChangedLayoutNotifierDemoState createState() => _SizeChangedLayoutNotifierDemoState(); -} - -class _SizeChangedLayoutNotifierDemoState extends State { - @override - Widget build(BuildContext context) { - return NotificationListener( - onNotification: _onNotification, - child: const ChangeableBox(), - ); - } - - bool _onNotification(SizeChangedLayoutNotification notification) { - print('---------SizeChangedLayoutNotification------'); - return false; - } -} - -class ChangeableBox extends StatefulWidget { - const ChangeableBox({Key? key}) : super(key: key); - - @override - _ChangeableBoxState createState() => _ChangeableBoxState(); -} - -class _ChangeableBoxState extends State { - double width = 40; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizeChangedLayoutNotifier( - child: Container( - width: width, - height: 100, - color: Colors.blue, - ), - ), - Slider( - max: 200, - min: 20, - divisions: 10, - value: width, - onChanged: _changeWidth, - ) - ], - ); - } - - void _changeWidth(double value) { - setState(() { - width = value; - }); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart deleted file mode 100644 index 09f29525..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 76, -// "name": 'SizedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】", -// } -class CustomSizedBox extends StatelessWidget { - const CustomSizedBox({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Widget child = Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 50, - height: 50, - child: const Text("Static"), - ); - - Widget box = SizedBox( - width: 80, - height: 40, - child: Container( - color: Colors.orange, - child: const Icon( - Icons.android, - color: Colors.white, - )), - ); - - return Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - child: Row( - children: [child, box, child], - ), - ); - } -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart deleted file mode 100644 index 6cd73dab..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 84, -// "name": 'SizedOverflowBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【size】 : 尺寸偏移 【Size】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomSizedOverflowBox extends StatefulWidget { - const CustomSizedOverflowBox({Key? key}) : super(key: key); - - @override - _CustomSizedOverflowBoxState createState() => _CustomSizedOverflowBoxState(); -} - -class _CustomSizedOverflowBoxState extends State { - double _x = 50; - double _y = 44; - - @override - Widget build(BuildContext context) { - Widget box = SizedOverflowBox( - alignment: Alignment.bottomRight, - size: Size(_x, _y), - child: Container(width: 30, height: 50, color: Colors.orange), - ); - return Column( - children: [ - Container( - alignment: Alignment.topLeft, - color: Colors.grey.withAlpha(88), - width: 250, - height: 60, - child: box), - _buildSlider() - ], - ); - } - - Widget _buildSlider() => - Column( - children: [ - Slider( - divisions: 100, - min: 0, - max: 250, - label: 'x:' + _x.toStringAsFixed(1), - value: _x, - onChanged: (v) => setState(() => _x = v)), - Slider( - divisions: 100, - min: 0, - max: 100, - label: 'y:' + _y.toStringAsFixed(1), - value: _y, - onChanged: (v) => setState(() => _y = v)), - - ], - ); -} diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart deleted file mode 100644 index b92505bf..00000000 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 81, -// "name": 'UnConstrainedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【constrainedAxis】 : 仍受约束的轴*2 【Axis】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } -class CustomUnConstrainedBox extends StatefulWidget { - const CustomUnConstrainedBox({Key? key}) : super(key: key); - - @override - _CustomUnConstrainedBoxState createState() => _CustomUnConstrainedBoxState(); -} - -class _CustomUnConstrainedBoxState extends State { - bool _value = false; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [_buildUnconstrainedBox(), _buildConstrainedAxis()], - ); - } - - Widget _buildUnconstrainedBox() { - Widget child = Container( - color: Colors.cyanAccent, - width: 60, - height: 60, - child: Switch( - value: _value, - onChanged: (v) { - setState(() { - _value = v; - }); - }, - ), - ); - - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(22), - width: 150, - height: 100, - child: _value - ? UnconstrainedBox(alignment: Alignment.center, child: child) - : child, - ), - Text(_value ? "已解除约束" : "子组件受约束") - ], - ); - } - - Widget _buildConstrainedAxis() { - return Column( - children: [ - Container( - color: Colors.grey.withAlpha(22), - width: 150, - height: 100, - child: UnconstrainedBox( - alignment: Alignment.center, - constrainedAxis: Axis.vertical, - child: Container( - color: Colors.cyanAccent, - width: 60, - height: 60, - )), - ), - const Text("竖直方向仍约束") - ], - ); - } -} diff --git a/packages/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart b/packages/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart deleted file mode 100644 index bd419ea8..00000000 --- a/packages/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 302 CupertinoSliverNavigationBar Sliver导航条 iOS11中导航条效果,展开时largeTitle显示,列表上滑后不显示,如果middle为空,largeTitle会以小字号作为middle。 -// { -// "widgetId": 302, -// "name": '导航条基本使用', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【middle】 : 中间组件 【Widget】\n" -// "【trailing】 : 尾部组件 【Widget】\n" -// "【largeTitle】 : 底部折展组件 【Widget】\n" -// "【border】 : 边线 【Border】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsDirectional】", -// } -class CupertinoSliverNavigationBarDemo extends StatelessWidget { - CupertinoSliverNavigationBarDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - CupertinoSliverNavigationBar( - trailing: const Icon( - CupertinoIcons.share, - size: 25, - ), - leading: _buildLeading(), - backgroundColor: Colors.white, - // middle: Text('张风捷特烈'), - largeTitle: Row( - mainAxisSize: MainAxisSize.min, - children: const [ - Icon( - Icons.ac_unit, - size: 20, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: Text('张风捷特烈'), - ), - Icon(Icons.ac_unit, size: 20), - ], - ), - ), - _buildSliverList() - ], - ), - ); - } - - Widget _buildSliverList() => SliverPrototypeExtentList( - prototypeItem: Container( - height: 40, - ), - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart b/packages/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart deleted file mode 100644 index edf3fb4d..00000000 --- a/packages/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart +++ /dev/null @@ -1,130 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 303 CupertinoSliverRefreshControl Sliver刷新控制器 iOS风格的下拉刷新控制器,可执行异步刷新方法、自定义控制器组件、指示器停留高度和触发加载的滑动高度。 -// { -// "widgetId": 303, -// "name": '刷新控制器基本使用', -// "priority": 1, -// "subtitle": -// "【refreshIndicatorExtent】 : 加载中指示器高度 【double】\n" -// "【refreshTriggerPullDistance】 : 触发加载的滑动高度 【double】\n" -// "【onRefresh】 : 下拉事件 【RefreshCallback】\n" -// "【builder】 : 指示器构造器 【RefreshControlIndicatorBuilder】", -// } -class CupertinoSliverRefreshControlDemo extends StatefulWidget { - const CupertinoSliverRefreshControlDemo({Key? key}) : super(key: key); - - @override - _CupertinoSliverRefreshControlDemoState createState() => - _CupertinoSliverRefreshControlDemoState(); -} - -class _CupertinoSliverRefreshControlDemoState - extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - final Random r = Random(); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics()), - slivers: [ - _buildSliverAppBar(), - CupertinoSliverRefreshControl( - refreshIndicatorExtent: 60, - refreshTriggerPullDistance: 80, - onRefresh: _doRefresh, - ), - _buildSliverList() - ], - ), - ); - } - - Widget _buildSliverList() => SliverFixedExtentList( - itemExtent: 50, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 120.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - Color randomColor() => Color.fromARGB( - r.nextInt(255), r.nextInt(255), r.nextInt(255), r.nextInt(255)); - - Future _doRefresh() async { - await Future.delayed(const Duration(seconds: 2)); - setState(() { - data.insertAll(0, [randomColor()]); - }); - } -} diff --git a/packages/widgets/lib/Sliver/CustomScrollView/node1_base.dart b/packages/widgets/lib/Sliver/CustomScrollView/node1_base.dart deleted file mode 100644 index 8c1ec6d2..00000000 --- a/packages/widgets/lib/Sliver/CustomScrollView/node1_base.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 183, -// "name": 'CustomScrollView基本使用', -// "priority": 1, -// "subtitle": "【slivers】 : 子组件列表 【List】\n" -// "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【controller】 : 控制器 【ScrollController】", -// } -class CustomScrollViewDemo extends StatelessWidget { - CustomScrollViewDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - anchor: 0, - scrollDirection: Axis.vertical, - reverse: false, - slivers: [_buildSliverAppBar(), _buildSliverFixedExtentList()], - ), - ); - } - - TextStyle get textStyle => const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]); - - Widget _buildSliverFixedExtentList() => SliverFixedExtentList( - itemExtent: 60, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: data[index], - child: Text( - colorString(data[index]), - style: textStyle, - ), - ), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - title: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.black, //标题 - shadows: [ - Shadow( - color: Colors.blue, - offset: Offset(1, 1), - blurRadius: 2, - ) - ]), - ), - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } -} diff --git a/packages/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart b/packages/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart deleted file mode 100644 index 4e459881..00000000 --- a/packages/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 196, -// "name": 'FlexibleSpaceBar基本使用', -// "priority": 1, -// "subtitle": "【title】 : 标题组件 【Widget】\n" -// "【titlePadding】 : 标题间距 【EdgeInsetsGeometry】\n" -// "【collapseMode】 : 折叠模式 【CollapseMode】\n" -// "【stretchModes】 : 延伸模式 【List】\n" -// "【background】 : 背景组件 【Widget】\n" -// "【centerTitle】 : 是否居中 【bool】", -// } - -class FlexibleSpaceBarDemo extends StatelessWidget { - FlexibleSpaceBarDemo({Key? key}) : super(key: key); - - final List data =[ - Colors.blue[50]!, - Colors.blue[100]!, - Colors.blue[200]!, - Colors.blue[300]!, - Colors.blue[400]!, - Colors.blue[500]!, - Colors.blue[600]!, - Colors.blue[700]!, - Colors.blue[800]!, - Colors.blue[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverFixedExtentList()], - ), - ); - } - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - actions: _buildActions(), - pinned: true, - backgroundColor: Colors.blue, - flexibleSpace: FlexibleSpaceBar(//伸展处布局 - centerTitle: false, - title: const Text( - '张风捷特烈', - style: TextStyle(shadows: [ - Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2) - ]), - ), - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), - //标题边距 - collapseMode: CollapseMode.parallax, - //视差效果 - stretchModes: const [StretchMode.blurBackground, StretchMode.zoomBackground], - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - Widget _buildSliverFixedExtentList() => SliverFixedExtentList( - itemExtent: 60, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart b/packages/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart deleted file mode 100644 index a039aec7..00000000 --- a/packages/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart +++ /dev/null @@ -1,199 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 301 SliverAnimatedList Sliver动画列表 在插入或删除项目时使其有动画效果的sliver组件。 -// { -// "widgetId": 301, -// "name": 'SliverAnimatedList基本使用', -// "priority": 1, -// "subtitle": "【itemBuilder】 : item构造器 【AnimatedListItemBuilder】\n" -// "【initialItemCount】 : 初始item个数 【int】", -// } -class SliverAnimatedListDemo extends StatefulWidget { - const SliverAnimatedListDemo({Key? key}) : super(key: key); - - @override - _SliverAnimatedListDemoState createState() => - _SliverAnimatedListDemoState(); -} - -class _SliverAnimatedListDemoState extends State { - - final GlobalKey _listKey = GlobalKey(); - late ListModel _list; - int? _selectedItem; - int _nextItem=0; - - @override - void initState() { - super.initState(); - _list = ListModel( - listKey: _listKey, - initialItems: [0, 1, 2], - removedItemBuilder: _buildRemovedItem, - ); - _nextItem = 3; - } - - Widget _buildItem(BuildContext context, int index, Animation animation) { - return CardItem( - animation: animation, - item: _list[index], - selected: _selectedItem == _list[index], - onTap: () { - setState(() { - _selectedItem = _selectedItem == _list[index] ? null : _list[index]; - }); - }, - ); - } - - Widget _buildRemovedItem(int item, BuildContext context, Animation animation) { - return CardItem( - animation: animation, - item: item, - selected: false, - ); - } - - void _insert() { - final int index = _selectedItem == null ? _list.length : _list.indexOf(_selectedItem!); - _list.insert(index, _nextItem++); - } - - void _remove() { - if (_selectedItem != null) { - _list.removeAt(_list.indexOf(_selectedItem!)); - setState(() { - _selectedItem = null; - }); - } else { - if(_list.length>0){ - _list.removeAt(0); - setState(() { - _selectedItem = null; - }); - } - } - } - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - SliverAppBar( - title: const Text( - 'SliverAnimatedList', - style: TextStyle(fontSize: 20), - ), - expandedHeight: 60, - centerTitle: true, - leading: IconButton( - icon: const Icon(Icons.add_circle), - onPressed: _insert, - tooltip: '插入一个item', - iconSize: 32, - ), - actions: [ - IconButton( - icon: const Icon(Icons.remove_circle), - onPressed: _remove, - tooltip: '删除选中的item', - iconSize: 32, - ), - ], - ), - SliverAnimatedList( - key: _listKey, - initialItemCount: _list.length, - itemBuilder: _buildItem, - ), - ], - ), - ); - } - - -} - -class ListModel { - ListModel({ - required this.listKey, - required this.removedItemBuilder, - required Iterable? initialItems, - }) : assert(removedItemBuilder != null), - _items = List.from(initialItems ?? []); - final GlobalKey listKey; - final dynamic removedItemBuilder; - final List _items; - SliverAnimatedListState? get _animatedList => listKey.currentState; - void insert(int index, E item) { - _items.insert(index, item); - _animatedList?.insertItem(index); - } - E removeAt(int index) { - final E removedItem = _items.removeAt(index); - if (removedItem != null) { - _animatedList?.removeItem( - index, - (BuildContext context, Animation animation) => removedItemBuilder(removedItem, context, animation), - ); - } - return removedItem; - } - int get length => _items.length; - E operator [](int index) => _items[index]; - int indexOf(E item) => _items.indexOf(item); -} - - -class CardItem extends StatelessWidget { - const CardItem({ - Key? key, - required this.animation, - required this.item, - this.onTap, - this.selected = false, - }) :super(key: key); - final Animation animation; - final VoidCallback? onTap; - final int item; - final bool selected; - @override - Widget build(BuildContext context) { - return Padding( - padding: - const EdgeInsets.only( - left: 2.0, - right: 2.0, - top: 2.0, - bottom: 0.0, - ), - child: SizeTransition( - axis: Axis.vertical, - sizeFactor: animation, - child: GestureDetector( - onTap: onTap, - child: SizedBox( - height: 60.0, - child: Card( - color: selected - ? Colors.black12 - : Colors.primaries[item % Colors.primaries.length], - child: Center( - child: Text( - 'Item $item', - style: const TextStyle(color: Colors.white,fontSize: 16), - ), - ), - ), - ), - ), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverAppBar/node1_base.dart b/packages/widgets/lib/Sliver/SliverAppBar/node1_base.dart deleted file mode 100644 index ffe8d780..00000000 --- a/packages/widgets/lib/Sliver/SliverAppBar/node1_base.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 184, -// "name": 'SliverAppBar基本使用', -// "priority": 1, -// "subtitle": "【leading】 : 左侧组件 【Widget】\n" -// "【title】 : 中间组件 【Widget】\n" -// "【actions】 : 尾部组件列表 【List】\n" -// "【floating】 : 是否浮动 【bool】\n" -// "【pinned】 : 是否顶部停留 【bool】\n" -// "【snap】 : 是否半收展 【bool】\n" -// "【bottom】 : 底部组件 【PreferredSizeWidget】\n" -// "【expandedHeight】 : 延展高度 【double】\n" -// "【elevation】 : 影深 【double】\n" -// "【flexibleSpace】 : 延展空间 【FlexibleSpaceBar】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【controller】 : 控制器 【ScrollController】\n" -// " snap为true时必需floating为true", -// } -class SliverAppBarDemo extends StatefulWidget { - const SliverAppBarDemo({Key? key}) : super(key: key); - - @override - _SliverAppBarDemoState createState() => _SliverAppBarDemoState(); -} - -class _SliverAppBarDemoState extends State { - bool _floating = false; - bool _pinned = false; - bool _snap = false; - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildTool(), - SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - _buildSliverFixedExtentList() - ], - ), - ), - ], - ); - } - - Widget _buildSliverAppBar() { - print(_floating); - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - floating: _floating, - pinned: _pinned, - snap: _snap, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar(//伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - Widget _buildSliverFixedExtentList() => SliverFixedExtentList( - itemExtent: 60, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - Widget _buildTool() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Wrap( - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text('floating'), - Switch( - value: _floating, - onChanged: (v) { - if(_snap&&!v){ - _snap =false; - } - setState(() => _floating = v); - }), - ], - ), - Wrap( - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text('pinned'), - Switch( - value: _pinned, - onChanged: (v) => setState(() => _pinned = v)), - ], - ) ,Wrap( - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text('snap'), - Switch( - value: _snap, - onChanged: (v) { - if(_floating){ - setState(() => _snap = v); - } - }), - ], - ) - ], - ); - } -} diff --git a/packages/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart b/packages/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart deleted file mode 100644 index f4428881..00000000 --- a/packages/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart +++ /dev/null @@ -1,158 +0,0 @@ -import 'dart:math'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 306 SliverFillRemaining Sliver填补剩余 一个包含单个box子元素的sliver,它填充了视窗中的剩余空间。 -// { -// "widgetId": 306, -// "name": 'SliverFillRemaining基本使用', -// "priority": 1, -// "subtitle": "【hasScrollBody】 : 是否具有滚动主体 【bool】\n" -// "【fillOverscroll】 : 是否可填充滚动区域 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } -class SliverFillRemainingDemo extends StatefulWidget { - const SliverFillRemainingDemo({Key? key}) : super(key: key); - - @override - _SliverFillRemainingDemoState createState() => - _SliverFillRemainingDemoState(); -} - -class _SliverFillRemainingDemoState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - final Random r = Random(); - - bool hasScrollBody = false; - bool fillOverscroll = true; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), - slivers: [ - _buildSliverAppBar(), - _buildSliverList(), - SliverFillRemaining( - hasScrollBody: hasScrollBody, - fillOverscroll: fillOverscroll, - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage("assets/images/sabar_bar.webp"))), - // // color: Colors.teal[100], - child: _buildBottomChild(), - ), - ), - ], - ), - ); - } - - Widget _buildBottomChild() => Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Wrap( - spacing: 10, - children: [ - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - ), - onPressed: () { - setState(() { - hasScrollBody = !hasScrollBody; - }); - }, - child: Text('hasScrollBody:$hasScrollBody',style: const TextStyle(color: Colors.white),), - ), - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - ), - onPressed: () { - setState(() { - fillOverscroll = !fillOverscroll; - }); - }, - child: Text('fillOverscroll:$fillOverscroll',style: const TextStyle(color: Colors.white)), - ), - ], - ), - ), - ); - - Widget _buildSliverList() => SliverFixedExtentList( - itemExtent: 50, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 120.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - -} diff --git a/packages/widgets/lib/Sliver/SliverFillViewport/node1_base.dart b/packages/widgets/lib/Sliver/SliverFillViewport/node1_base.dart deleted file mode 100644 index a609de57..00000000 --- a/packages/widgets/lib/Sliver/SliverFillViewport/node1_base.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 187, -// "name": 'SliverFillViewport基本使用', -// "priority": 1, -// "subtitle": "【viewportFraction】 : 视口分率 【double】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } -class SliverFillViewportDemo extends StatefulWidget { - const SliverFillViewportDemo({Key? key}) : super(key: key); - - @override - _SliverFillViewportDemoState createState() => _SliverFillViewportDemoState(); -} - -class _SliverFillViewportDemoState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - double _viewportFraction = 0.5; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildTool(), - SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverList()], - ), - ), - ], - ); - } - - Widget _buildSliverList() => SliverFillViewport( - viewportFraction: _viewportFraction, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - _buildTool() { - return Slider( - value: _viewportFraction, - min: 0.01, - divisions: 20, - label: _viewportFraction.toStringAsFixed(1), - max: 2.0, - onChanged: (v) => setState(() => _viewportFraction = v)); - } -} diff --git a/packages/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart b/packages/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart deleted file mode 100644 index ebcf3bbf..00000000 --- a/packages/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 186, -// "name": 'SliverFixedExtentList基本使用', -// "priority": 1, -// "subtitle": "【itemExtent】 : 主轴方向强迫长度 【double】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } -class SliverFixedExtentListDemo extends StatefulWidget { - const SliverFixedExtentListDemo({Key? key}) : super(key: key); - - @override - _SliverFixedExtentListDemoState createState() => _SliverFixedExtentListDemoState(); -} - -class _SliverFixedExtentListDemoState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverList()], - ), - ); - } - - Widget _buildSliverList() => SliverFixedExtentList( - itemExtent: 50, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverGrid/node1_base.dart b/packages/widgets/lib/Sliver/SliverGrid/node1_base.dart deleted file mode 100644 index a6cb09d1..00000000 --- a/packages/widgets/lib/Sliver/SliverGrid/node1_base.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 188, -// "name": 'SliverList基本使用', -// "priority": 1, -// "subtitle": "SliverGrid.count 指定轴向数量构造\n" -// "SliverGrid.extent 指定轴向长度构造\n" -// "属性特征同GridView,可详见之", -// } -class SliverGirdDemo extends StatelessWidget { - SliverGirdDemo({Key? key}) : super(key: key); - - final List data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverList()], - ), - ); - } - - Widget _buildSliverList() => SliverGrid.extent( - childAspectRatio: 1 / 0.618, - maxCrossAxisExtent: 180, - crossAxisSpacing: 5, - mainAxisSpacing: 5, - children: data - .map((e) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: e, - child: Text( - colorString(e), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - )) - .toList(), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart b/packages/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart deleted file mode 100644 index 0efb5c3f..00000000 --- a/packages/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart +++ /dev/null @@ -1,158 +0,0 @@ -import 'dart:math'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 305 SliverIgnorePointer Sliver忽略事件 可以包裹一个sliver组件,通过ignoring来控制该sliver组件是否可以响应事件。 -// { -// "widgetId": 305, -// "name": 'SliverIgnorePointer基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : sliver组件 【Widget】\n" -// "【ignoring】 : 是否忽略事件 【bool】\n", -// } -class SliverIgnorePointerDemo extends StatefulWidget { - const SliverIgnorePointerDemo({Key? key}) : super(key: key); - - @override - _SliverIgnorePointerDemoState createState() => - _SliverIgnorePointerDemoState(); -} - -class _SliverIgnorePointerDemoState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - final Random r = Random(); - bool hasScrollBody = false; - bool fillOverscroll = true; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), - slivers: [ - _buildSliverAppBar(), - _buildSliverList(), - SliverIgnorePointer( - ignoring: true, - sliver: SliverFillRemaining( - hasScrollBody: hasScrollBody, - fillOverscroll: fillOverscroll, - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage("assets/images/sabar_bar.webp"))), - // // color: Colors.teal[100], - child: _buildBottomChild(), - ), - ), - ), - ], - ), - ); - } - - Widget _buildBottomChild() => Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Wrap( - spacing: 10, - children: [ - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - ), - onPressed: () { - setState(() { - hasScrollBody = !hasScrollBody; - }); - }, - child: Text('hasScrollBody:$hasScrollBody',style: const TextStyle(color: Colors.white),), - ), - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - ), - onPressed: () { - setState(() { - fillOverscroll = !fillOverscroll; - }); - }, - child: Text('fillOverscroll:$fillOverscroll',style: const TextStyle(color: Colors.white)), - ), - ], - ), - ), - ); - - Widget _buildSliverList() => SliverFixedExtentList( - itemExtent: 50, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 120.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - -} diff --git a/packages/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart b/packages/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart deleted file mode 100644 index 7e36248d..00000000 --- a/packages/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; - - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 304 SliverLayoutBuilder Sliver布局构造器 Sliver家族一员,在滑动过程中可以通过回调出的 SliverConstraints 对象进行子组件的构造。 -// { -// "widgetId": 304, -// "name": 'SliverLayoutBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】 : 组件构造器 【SliverLayoutWidgetBuilder】", -// } -class SliverLayoutBuilderDemo extends StatefulWidget { - const SliverLayoutBuilderDemo({Key? key}) : super(key: key); - - @override - _SliverLayoutBuilderDemoState createState() => - _SliverLayoutBuilderDemoState(); -} - -class _SliverLayoutBuilderDemoState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), - slivers: [ - _buildSliverAppBar(), - SliverLayoutBuilder( - builder: _buildSliver, - ), - _buildSliverList(), - ], - ), - ); - } - - Widget _buildSliverList() => SliverFixedExtentList( - itemExtent: 50, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 120.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - Widget _buildSliver(BuildContext context, SliverConstraints constraints) { - return SliverToBoxAdapter( - child: Container( - alignment: Alignment.center, - height: constraints.remainingPaintExtent / 3, - color: Colors.red, - child: const Text( - "SliverLayoutBuilder", - style: TextStyle(color: Colors.white, fontSize: 20), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/Sliver/SliverList/node1_base.dart b/packages/widgets/lib/Sliver/SliverList/node1_base.dart deleted file mode 100644 index 1be3ef68..00000000 --- a/packages/widgets/lib/Sliver/SliverList/node1_base.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 185, -// "name": 'SliverList基本使用', -// "priority": 1, -// "subtitle": "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } -class SliverListDemo extends StatelessWidget { - SliverListDemo({Key? key}) : super(key: key); - - final List data =[ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverList()], - ), - ); - } - - Widget _buildSliverList() => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverOpacity/node1_base.dart b/packages/widgets/lib/Sliver/SliverOpacity/node1_base.dart deleted file mode 100644 index 0bd0136f..00000000 --- a/packages/widgets/lib/Sliver/SliverOpacity/node1_base.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 192, -// "name": 'SliverOpacity基本使用', -// "priority": 1, -// "subtitle": "【opacity】 : 透明度 【double】\n" -// "【sliver】 : 子组件 【Function()】", -// } -class SliverOpacityDemo extends StatelessWidget { - SliverOpacityDemo({Key? key}) : super(key: key); - - final List data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - SliverPadding( - padding: const EdgeInsets.only(top: 10), - sliver: SliverOpacity(opacity: 0.2, sliver: _buildSliverGrid())) - ], - ), - ); - } - - Widget _buildSliverGrid() => SliverGrid.extent( - childAspectRatio: 1 / 0.618, - maxCrossAxisExtent: 180, - crossAxisSpacing: 5, - mainAxisSpacing: 5, - children: data - .map((e) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: e, - child: Text( - colorString(e), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - )) - .toList(), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart b/packages/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart deleted file mode 100644 index 8b1ea2c0..00000000 --- a/packages/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 307, -// "name": 'SliverOverlapAbsorber基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。", -// } - -class SliverOverlapAbsorberDemo extends StatelessWidget { - const SliverOverlapAbsorberDemo({Key? key}) : super(key: key); - - final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 200, - child: Scaffold( - body: DefaultTabController( - length: _tabs.length, - child: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) { - return [ - SliverOverlapAbsorber( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - sliver: SliverAppBar( - title: const Text('旷古奇书'), - pinned: true, - elevation: 6, //影深 - expandedHeight: 220.0, - forceElevated: innerBoxIsScrolled, //为true时展开有阴影 - flexibleSpace: FlexibleSpaceBar( - background: Image.asset( - "assets/images/wy_300x200_filter.webp", - fit: BoxFit.cover, - ), - ), - bottom: TabBar( - tabs: _tabs - .map((String name) => Tab(text: name,)) - .toList(), - ), - ), - ), - ]; - }, - body: _buildTabBarView(), - ), - ), - )); - } - - Widget _buildTabBarView() { - return TabBarView( - children: _tabs.map((String name) { - return SafeArea( - top: false, - bottom: false, - child: Builder( - builder: (BuildContext context) { - return CustomScrollView( - key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context), - ), - buildContent(name), - ], - ); - }, - ), - ); - }).toList(), - ); - } - - Widget buildContent(String name) => SliverPadding( - padding: const EdgeInsets.all(8.0), - sliver: SliverFixedExtentList( - itemExtent: 48.0, - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return ListTile( - title: Text('《$name》 第 $index章'), - ); - }, - childCount: 50, - ), - ), - ); -} diff --git a/packages/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart b/packages/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart deleted file mode 100644 index 4bd83083..00000000 --- a/packages/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 308, -// "name": 'SliverOverlapInjector基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。", -// } - -class SliverOverlapInjectorDemo extends StatelessWidget { - const SliverOverlapInjectorDemo({Key? key}) : super(key: key); - - final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 200, - child: Scaffold( - body: DefaultTabController( - length: _tabs.length, - child: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) { - return [ - SliverOverlapAbsorber( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - sliver: SliverAppBar( - title: const Text('旷古奇书'), - pinned: true, - elevation: 6, //影深 - expandedHeight: 220.0, - forceElevated: innerBoxIsScrolled, //为true时展开有阴影 - flexibleSpace: FlexibleSpaceBar( - background: Image.asset( - "assets/images/wy_300x200_filter.webp", - fit: BoxFit.cover, - ), - ), - bottom: TabBar( - tabs: _tabs - .map((String name) => Tab(text: name,)) - .toList(), - ), - ), - ), - ]; - }, - body: _buildTabBarView(), - ), - ), - )); - } - - Widget _buildTabBarView() { - return TabBarView( - children: _tabs.map((String name) { - return SafeArea( - top: false, - bottom: false, - child: Builder( - builder: (BuildContext context) { - return CustomScrollView( - key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context), - ), - buildContent(name), - ], - ); - }, - ), - ); - }).toList(), - ); - } - - Widget buildContent(String name) => SliverPadding( - padding: const EdgeInsets.all(8.0), - sliver: SliverFixedExtentList( - itemExtent: 48.0, - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return ListTile( - title: Text('《$name》 第 $index章'), - ); - }, - childCount: 50, - ), - ), - ); -} diff --git a/packages/widgets/lib/Sliver/SliverPadding/node1_base.dart b/packages/widgets/lib/Sliver/SliverPadding/node1_base.dart deleted file mode 100644 index 88343772..00000000 --- a/packages/widgets/lib/Sliver/SliverPadding/node1_base.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 191, -// "name": 'SliverPadding基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class SliverPaddingDemo extends StatelessWidget { - SliverPaddingDemo({Key? key}) : super(key: key); - - final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - SliverPadding( - padding: const EdgeInsets.only(top: 10), - sliver: _buildSliverGrid()) - ], - ), - ); - } - - Widget _buildSliverGrid() => SliverGrid.extent( - childAspectRatio: 1 / 0.618, - maxCrossAxisExtent: 180, - crossAxisSpacing: 5, - mainAxisSpacing: 5, - children: data - .map((e) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: e, - child: Text( - colorString(e), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - )) - .toList(), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart b/packages/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart deleted file mode 100644 index bed043a1..00000000 --- a/packages/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart +++ /dev/null @@ -1,167 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 190, -// "name": 'SliverPersistentHeader基本使用', -// "priority": 1, -// "subtitle": -// "【delegate】 : 代理 【SliverPersistentHeaderDelegate】\n" -// "【floating】 : 是否浮动 【bool】\n" -// "【pinned】 : 是否顶部停留 【bool】", -// } -class SliverPersistentHeaderDemo extends StatelessWidget { - SliverPersistentHeaderDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 500, - child: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - _buildPersistentHeader('袅缈岁月,青丝银发',const Color(0xffe7fcc9)), - _buildCommonWidget(), - _buildPersistentHeader('以梦为马,不负韶华',const Color(0xffcca4ff)), - _buildSliverList() - ], - ), - ); - } - - Widget _buildCommonWidget() => SliverToBoxAdapter( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - title: const Text("以梦为马"), - subtitle: const Text("海子"), - selected: true, - contentPadding: const EdgeInsets.all(5), - trailing: const Icon(Icons.more_vert), - ), - ), - ); - Widget _buildPersistentHeader(String text,Color color) => SliverPersistentHeader( - pinned: true, - delegate: _SliverDelegate( - minHeight: 40.0, - maxHeight: 100.0, - child: Container( - color: color, - child: Center( - child: Text(text, style: const TextStyle( - fontSize: 18, - shadows: [Shadow(color: Colors.white, offset: Offset(1, 1))]), - ), - )), - )); - - Widget _buildSliverList() => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 2, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - - -class _SliverDelegate extends SliverPersistentHeaderDelegate { - _SliverDelegate({ - required this.minHeight, - required this.maxHeight, - required this.child, - }); - - final double minHeight; //最小高度 - final double maxHeight; //最大高度 - final Widget child; //孩子 - - @override - double get minExtent => minHeight; - - @override - double get maxExtent => max(maxHeight, minHeight); - - @override - Widget build( - BuildContext context, double shrinkOffset, bool overlapsContent) { - return SizedBox.expand(child: child); - } - - @override //是否需要重建 - bool shouldRebuild(_SliverDelegate oldDelegate) { - return maxHeight != oldDelegate.maxHeight || - minHeight != oldDelegate.minHeight || - child != oldDelegate.child; - } -} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart b/packages/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart deleted file mode 100644 index c2879864..00000000 --- a/packages/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 314 SliverPrototypeExtentList Sliver原型延伸列表 其中prototypeItem属性是一个Widget,该Widget负责在主轴方向上约束item尺寸,但会不显示出来。delegate接受一个SliverChildDelegate完成item的创建。 -// { -// "widgetId": 314, -// "name": 'SliverPrototypeExtentList基本使用', -// "priority": 1, -// "subtitle": -// "【prototypeItem】 : 主轴方向尺寸组件 【Widget】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } -class SliverPrototypeExtentListDemo extends StatefulWidget { - const SliverPrototypeExtentListDemo({Key? key}) : super(key: key); - - @override - _SliverPrototypeExtentListDemoState createState() => - _SliverPrototypeExtentListDemoState(); -} - -class _SliverPrototypeExtentListDemoState - extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [_buildSliverAppBar(), _buildSliverList()], - ), - ); - } - - Widget _buildSliverList() => SliverPrototypeExtentList( - prototypeItem: Container( - height: 80, - ), - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 150.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart b/packages/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart deleted file mode 100644 index ea283965..00000000 --- a/packages/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 189, -// "name": 'SliverToBoxAdapter基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } -class SliverToBoxAdapterDemo extends StatelessWidget { - SliverToBoxAdapterDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - _buildCommonWidget(), - _buildSliverList() - ], - ), - ); - } - - Widget _buildCommonWidget() => SliverToBoxAdapter( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - title: const Text("以梦为马"), - subtitle: const Text("海子"), - selected: true, - contentPadding: const EdgeInsets.all(5), - trailing: const Icon(Icons.more_vert), - ), - ), - ); - - Widget _buildSliverList() => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - Widget _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: _buildLeading(), - title: const Text('张风捷特烈'), - actions: _buildActions(), - elevation: 2, - pinned: true, - backgroundColor: Colors.orange, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildLeading() => Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')); - - List _buildActions() => [ - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.star_border, - color: Colors.white, - ), - ) - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart b/packages/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart deleted file mode 100644 index 1e2ddc30..00000000 --- a/packages/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 348 SliverWithKeepAliveWidget Sliver保活容器 -/// 它是抽象类,不能单独使用。只有其子类才可以容纳 KeepAlive 的孩子。 -/// link 316,239,188,185,314,186 -/// -// { -// "widgetId": 348, -// "name": 'SliverWithKeepAliveWidget 介绍', -// "priority": 1, -// "subtitle": -// "【key】 : 键 【Key】", -// } - - -class SliverWithKeepAliveWidgetDemo extends StatelessWidget { - const SliverWithKeepAliveWidgetDemo({Key? key}) : super(key: key); - - final String info = - '只有 SliverWithKeepAliveWidget 之下才可以包含 KeepAlive 组件, 由于其为抽象类,不能直接使用。其子类 SliverMultiBoxAdaptorWidget 也说抽象类,' - '用于容纳多个孩子,帮助它的子类使用 SliverChildDelegate 构建懒加载 children。' - '最终实现类为 SliverGrid、SliverList、SliverPrototypeExtentList、SliverFixedExtentList,表示他们都可以支持 item 的状态保持。' - '除此之外还有 _SliverFillViewportRenderObjectWidget 的私有实现类,这是 PageView 的底层实现,这也是为什么 PageView 也支持保活的原因。'; - - @override - Widget build(BuildContext context) { - - return Container( - color: Theme.of(context).primaryColor.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart deleted file mode 100644 index 6a692e58..00000000 --- a/packages/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart +++ /dev/null @@ -1,62 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 111, -// "name": 'AlignTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【alignment】 : 对齐动画 【Animation】", -// } -class CustomAlignTransition extends StatefulWidget { - const CustomAlignTransition({Key? key}) : super(key: key); - - @override - _CustomAlignTransitionState createState() => _CustomAlignTransitionState(); -} - -class _CustomAlignTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 1), - ); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - width: MediaQuery.of(context).size.width, - color: Colors.grey.withAlpha(33), - height: 100, - child: AlignTransition( - alignment: AlignmentTween( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ).animate(_ctrl), - child: const Icon( - Icons.android, - color: Colors.green, - size: 60, - ), - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart deleted file mode 100644 index b51d8614..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 120, -// "name": 'AnimatedAlign基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomAnimatedAlign extends StatefulWidget { - const CustomAnimatedAlign({Key? key}) : super(key: key); - - @override - _CustomAnimatedAlignState createState() => _CustomAnimatedAlignState(); -} - -class _CustomAnimatedAlignState extends State { - final Alignment start = const Alignment(0, 0); - final Alignment end = Alignment.bottomRight; - - late Alignment _alignment; - - @override - void initState() { - _alignment = start; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - child: AnimatedAlign( - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - alignment: _alignment, - onEnd: () => print('End'), - child: Container( - height: 40, - width: 80, - alignment: Alignment.center, - color: Colors.blue, - child: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.white), - ), - ), - ), - ), - ], - ); - } - - Widget _buildSwitch() => Switch( - value: _alignment == end, - onChanged: (v) { - setState(() { - _alignment = v ? end : start; - }); - }); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart deleted file mode 100644 index 2f616934..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ - -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 228 AnimatedBuilder 动画构造器 -/// 通过 builder 使动画对应的节点变为局部更新,并且可避免子组件刷新,减少构建的时间,提高动画性能。 -/// -// { -// "widgetId": 228, -// "name": 'AnimatedBuilder 使用案例', -// "priority": 1, -// "subtitle": -// "【animation】 : *可监听对象 【Listenable】\n" -// "【builder】 : *组件构造器 【TransitionBuilder】\n" -// "【child】 : 子组件 【Widget】", -// } - -class AnimatedBuilderDemo extends StatefulWidget { - const AnimatedBuilderDemo({Key? key}) : super(key: key); - - @override - _AnimatedBuilderDemoState createState() => _AnimatedBuilderDemoState(); -} - -class _AnimatedBuilderDemoState extends State - with SingleTickerProviderStateMixin { - late AnimationController controller; - - @override - void initState() { - super.initState(); - controller = AnimationController( - vsync: this, - lowerBound: 0.3, - upperBound: 1.0, - duration: const Duration(milliseconds: 500)) - ..forward(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () { - controller.forward(from: 0); - }, - child: AnimatedBuilder( - animation: controller, - builder: (ctx, child) { - return Transform.scale( - scale: controller.value, - child: Opacity(opacity: controller.value, child: child), - ); - }, - child: buildChild()), - ); - } - - Widget buildChild() => Container( - height: 100, - width: 100, - decoration: const BoxDecoration( - color: Colors.orange, - shape: BoxShape.circle, - ), - alignment: Alignment.center, - child: const Text( - 'Toly', - style: TextStyle(fontSize: 40, color: Colors.white), - ), - ); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart deleted file mode 100644 index 274cb01f..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 123, -// "name": 'AnimatedContainer基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【color】 : 颜色 【Color】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】\n" -// "【alignment】 : 对齐 【AlignmentGeometry】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【constraints】 : 约束 【BoxConstraints】\n" -// "【transform】 : 变化 【Matrix4】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomAnimatedContainer extends StatefulWidget { - const CustomAnimatedContainer({Key? key}) : super(key: key); - - @override - _CustomAnimatedContainerState createState() => - _CustomAnimatedContainerState(); -} - -class _CustomAnimatedContainerState extends State { - final Decoration startDecoration = const BoxDecoration( - color: Colors.deepPurple, - borderRadius: BorderRadius.all(Radius.circular(30)), - boxShadow: [ - BoxShadow( - offset: Offset(1, 1), - color: Colors.purple, - blurRadius: 5, - spreadRadius: 2) - ]); - final Decoration endDecoration = const BoxDecoration( - color: Colors.blue, - borderRadius: BorderRadius.all(Radius.circular(10)), - boxShadow: [ - BoxShadow( - offset: Offset(1, 1), - color: Colors.blue, - blurRadius: 10, - spreadRadius: 0) - ]); - - final Alignment startAlignment = Alignment.topLeft + const Alignment(0.2, 0.2); - final Alignment endAlignment = Alignment.center; - - final double startHeight = 150.0; - final double endHeight = 100.0; - - late Decoration _decoration; - late double _height; - late Alignment _alignment; - - @override - void initState() { - super.initState(); - _decoration = startDecoration; - _height = startHeight; - _alignment = startAlignment; - } - - bool get selected => _height == endHeight; - @override - Widget build(BuildContext context) { - return Wrap( - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Switch( - value: selected, - onChanged: onChanged, - ), - buildAnim() - ], - ); - } - Widget _buildChild() => const Icon( - Icons.camera_outlined, - size: 30, - color: Colors.white, - ); - Widget buildAnim() => AnimatedContainer( - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - decoration: _decoration, - alignment: _alignment, - onEnd: onEnd, - height: _height, - width: _height, - child: _buildChild(), - ); - void onChanged(bool value) { - setState(() { - _height = value ? endHeight : startHeight; - _decoration = value ? endDecoration : startDecoration; - _alignment = value ? endAlignment : startAlignment; - }); - } - void onEnd() { - print('End'); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart deleted file mode 100644 index 766d12fa..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-20 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 100, -// "name": 'AnimatedCrossFade基本使用', -// "priority": 1, -// "subtitle": -// "【firstChild】 : 第一孩子 【Widget】\n" -// "【secondChild】 : 第二孩子 【Widget】\n" -// "【crossFadeState】 : 显示第几个 【CrossFadeState】\n" -// "【duration】 : 时长 【Duration】", -// } -class CustomAnimatedCrossFade extends StatefulWidget { - const CustomAnimatedCrossFade({Key? key}) : super(key: key); - - @override - _CustomAnimatedCrossFadeState createState() => - _CustomAnimatedCrossFadeState(); -} - -class _CustomAnimatedCrossFadeState extends State { - CrossFadeState _crossFadeState = CrossFadeState.showFirst; - - bool get isFirst => _crossFadeState == CrossFadeState.showFirst; - - @override - Widget build(BuildContext context) { - return Wrap( - children: [ - AnimatedCrossFade( - firstChild: Container( - alignment: Alignment.center, - width: 200, - height: 150, - color: Colors.orange, - child: const FlutterLogo(textColor: Colors.blue, size: 100,), - ), - secondChild: Container( - width: 200, - height: 150, - alignment: Alignment.center, - color: Colors.blue, - child: const FlutterLogo( - textColor: Colors.white, -// colors: Colors.orange, - size: 100, - style: FlutterLogoStyle.stacked,), - ), - duration: const Duration(milliseconds: 600), - crossFadeState: _crossFadeState, - ), - _buildSwitch(), - ], - - ); - } - - Widget _buildSwitch() => - Switch(value: isFirst, onChanged: (v) { - setState(() { - _crossFadeState = - v ? CrossFadeState.showFirst : CrossFadeState.showSecond; - }); - }); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart deleted file mode 100644 index 71ccd188..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 124, -// "name": 'AnimatedDefaultTextStyle基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【softWrap】 : 是否包裹 【bool】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【overflow】 : 溢出模式 【TextOverflow】\n" -// "【style】 : 文字样式 【TextStyle】", -// } -class CustomAnimatedDefaultTextStyle extends StatefulWidget { - const CustomAnimatedDefaultTextStyle({Key? key}) : super(key: key); - - @override - _CustomAnimatedDefaultTextStyleState createState() => - _CustomAnimatedDefaultTextStyleState(); -} - -class _CustomAnimatedDefaultTextStyleState - extends State { - final TextStyle start = const TextStyle( - color: Colors.blue, - fontSize: 50, - shadows: [ - Shadow(offset: Offset(1, 1), color: Colors.black, blurRadius: 3) - ]); - final TextStyle end = const TextStyle( - color: Colors.white, - fontSize: 20, - shadows: [ - Shadow(offset: Offset(1, 1), color: Colors.purple, blurRadius: 3) - ]); - - late TextStyle _style; - - @override - void initState() { - _style = start; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - alignment: Alignment.center, - color: Colors.grey.withAlpha(22), - width: 300, - height: 100, - child: AnimatedDefaultTextStyle( - textAlign: TextAlign.start, - softWrap: true, - maxLines: 1, - overflow: TextOverflow.ellipsis, - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - style: _style, - onEnd: () => print('End'), - child: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.white), - ), - ), - ), - ], - ); - } - - Widget _buildSwitch() => Switch( - value: _style == end, - onChanged: (v) { - setState(() { - _style = v ? end : start; - }); - }); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart deleted file mode 100644 index 05730467..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart +++ /dev/null @@ -1,192 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 117, -// "name": 'AnimatedList基本使用', -// "priority": 1, -// "subtitle": "【itemBuilder】 : 组件构造器 【AnimatedListItemBuilder】\n" -// "【initialItemCount】 : 子组件数量 【int】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【controller】 : 滑动控制器 【ScrollController】\n" -// "【reverse】 : 数据是否反向 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomAnimatedList extends StatefulWidget { - const CustomAnimatedList({Key? key}) : super(key: key); - - @override - _CustomAnimatedListState createState() => _CustomAnimatedListState(); -} - -class _CustomAnimatedListState extends State { - final GlobalKey _listKey = GlobalKey(); - late ListModel _list; - int? _selectedItem; - int _nextItem = 0; - - @override - void initState() { - super.initState(); - _list = ListModel( - listKey: _listKey, - initialItems: [0, 1, 2, 3], - removedItemBuilder: _buildRemovedItem, - ); - _nextItem = 4; - } - - Widget _buildItem( - BuildContext context, int index, Animation animation) { - return CardItem( - animation: animation, - item: _list[index], - selected: _selectedItem == _list[index], - onTap: () { - setState(() { - _selectedItem = _selectedItem == _list[index] ? null : _list[index]; - }); - }, - ); - } - - Widget _buildRemovedItem( - int item, BuildContext context, Animation animation) { - return CardItem( - animation: animation, - item: item, - selected: false, - ); - } - - void _insert() { - final int index = - _selectedItem == null ? _list.length : _list.indexOf(_selectedItem!); - _list.insert(index, _nextItem++); - } - - void _remove() { - if (_selectedItem != null) { - _list.removeAt(_list.indexOf(_selectedItem!)); - setState(() { - _selectedItem = null; - }); - } - } - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.grey.withAlpha(33), - width: MediaQuery.of(context).size.width/2, - child: Column( - children: [ - _buildBtn(), - SizedBox( - width: MediaQuery.of(context).size.width/2, - height: 300, - child: AnimatedList( - padding: const EdgeInsets.all(10.0), - key: _listKey, - initialItemCount: _list.length, - itemBuilder: _buildItem, - ), - ) - ], - )); - } - - Widget _buildBtn() => Row( - children: [ - IconButton( - icon: const Icon( - Icons.add_circle, - color: Colors.blue, - ), - onPressed: _insert, - ), - IconButton( - icon: const Icon(Icons.remove_circle, color: Colors.blue), - onPressed: _remove, - ), - ], - ); -} - -class ListModel { - ListModel({ - required this.listKey, - required this.removedItemBuilder, - required Iterable initialItems, - }) : assert(removedItemBuilder != null), - _items = List.from(initialItems); - final GlobalKey listKey; - final dynamic removedItemBuilder; - final List _items; - - AnimatedListState? get _animatedList => listKey.currentState; - - void insert(int index, E item) { - _items.insert(index, item); - _animatedList?.insertItem(index); - } - - E removeAt(int index) { - final E removedItem = _items.removeAt(index); - if (removedItem != null) { - _animatedList?.removeItem( - index, - (BuildContext context, Animation animation) => - removedItemBuilder(removedItem, context, animation), - ); - } - return removedItem; - } - - int get length => _items.length; - - E operator [](int index) => _items[index]; - - int indexOf(E item) => _items.indexOf(item); -} - -class CardItem extends StatelessWidget { - const CardItem( - {Key? key, - required this.animation, - this.onTap, - required this.item, - this.selected = false}) - : assert(item >= 0), - super(key: key); - final Animation animation; - final VoidCallback? onTap; - final int item; - final bool selected; - - @override - Widget build(BuildContext context) { - return SizeTransition( - axis: Axis.vertical, - sizeFactor: animation, - child: Card( - child: Container( - color: Colors.primaries[item % Colors.primaries.length], - child: CheckboxListTile( - dense: true, - title: Text( - 'Item $item', - style: const TextStyle(color: Colors.white, fontSize: 18), - ), - value: selected, - onChanged: (v) { - onTap?.call(); - }), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart deleted file mode 100644 index 99289c48..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: 227 AnimatedModalBarrier 动画屏障模 -/// 内部依赖 ModalBarrier 实现,功能一致,只不过该组件可以传入一个颜色动画,进行过渡展现。 -/// link: 212 -// { -// "widgetId": 227, -// "name": 'AnimatedModalBarrier 介绍', -// "priority": 1, -// "subtitle": -// "【dismissible】 : 点击是否返回 【bool】\n" -// "【color】 : 颜色 【Animation】", -// } -class AnimatedModalBarrierDemo extends StatefulWidget { - const AnimatedModalBarrierDemo({Key? key}) : super(key: key); - - @override - _AnimatedModalBarrierDemoState createState() => - _AnimatedModalBarrierDemoState(); -} - -class _AnimatedModalBarrierDemoState extends State - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _color; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - )..forward(); - _color = ColorTween( - begin: Colors.blue, - end: Colors.purple, - ).animate(_controller); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 100, - child: Stack(alignment: Alignment.center, children: [ - AnimatedModalBarrier( - dismissible: true, - color: _color, - ), - const Text( - '点击背景返回', - style: TextStyle(color: Colors.white), - ) - ]), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart deleted file mode 100644 index f22efe95..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 118, -// "name": 'AnimatedOpacity基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【opacity】 : 透明度 【double】", -// } -class CustomAnimatedOpacity extends StatefulWidget { - const CustomAnimatedOpacity({Key? key}) : super(key: key); - - @override - _CustomAnimatedOpacityState createState() => _CustomAnimatedOpacityState(); -} - -class _CustomAnimatedOpacityState extends State { - double _opacity = 1.0; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Switch( - value: _opacity == 0, - onChanged: (v) { - setState(() { - _opacity = v ? 0 : 1.0; - }); - }), - Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - child: AnimatedOpacity( - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - opacity: _opacity, - onEnd: () => print('End'), - child: const Icon(Icons.android, color: Colors.green, size: 60), - ), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart deleted file mode 100644 index 0fb58e3e..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 119, -// "name": 'AnimatedPadding基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomAnimatedPadding extends StatefulWidget { - const CustomAnimatedPadding({Key? key}) : super(key: key); - - @override - _CustomAnimatedPaddingState createState() => _CustomAnimatedPaddingState(); -} - -class _CustomAnimatedPaddingState extends State { - final EdgeInsets startPadding = const EdgeInsets.all(10); - final EdgeInsets endPadding = const EdgeInsets.all(30); - - late EdgeInsets _padding; - - @override - void initState() { - _padding = startPadding; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Switch( - value: _padding == endPadding, - onChanged: (v) { - setState(() { - _padding = v ? endPadding : startPadding; - }); - }), - Container( - color: Colors.grey.withAlpha(22), - width: 200, - height: 100, - child: AnimatedPadding( - duration: const Duration(seconds: 1), - curve: Curves.fastOutSlowIn, - padding: _padding, - onEnd: () => print('End'), - child: Container( - alignment: Alignment.center, - color: Colors.blue, - child: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.white), - ), - ), - ), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart deleted file mode 100644 index f9e67124..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: 225 相关属性变化时具有动画效果的PhysicalModel组件,本质是PhysicalModel和动画结合的产物。可指定阴影、影深、圆角、动画时长、结束回调等属性。 -// { -// "widgetId": 225 , -// "name": 'AnimatedPhysicalModel基本使用', -// "priority": 1, -// "subtitle": -// "【color】 : 背景色 【Color】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【shape】 : 形状 【BoxShape】\n" -// "【elevation】 : 影深 【double】\n" -// "【borderRadius】 : 圆角 【BorderRadius】\n" -// "【shadowColor】 : 阴影色 【Color】\n" -// "【child】 : 子组件 【Widget】", -// } -class AnimatedPhysicalModelDemo extends StatefulWidget { - const AnimatedPhysicalModelDemo({Key? key}) : super(key: key); - - @override - _AnimatedPhysicalModelDemoState createState() => - _AnimatedPhysicalModelDemoState(); -} - -class _AnimatedPhysicalModelDemoState extends State { - bool flag = false; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - SizedBox( - width: 150, - height: 150, - child: AnimatedPhysicalModel( - duration: const Duration(seconds: 2), - curve: Curves.fastOutSlowIn, - shadowColor: flag?Colors.orange:Colors.purple, - elevation: flag?10:5, - child: Image.asset( - 'assets/images/caver.webp', - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.all(Radius.circular(flag? 10:75)), - clipBehavior: Clip.hardEdge, - shape: BoxShape.rectangle, - color: Colors.deepPurpleAccent, - onEnd: () => print('----onEnd---'), - ), - ), - ], - ); - } - - Widget _buildSwitch() => Switch( - value: flag, - onChanged: (v) { - setState(() { - flag = v; - }); - }); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart deleted file mode 100644 index 3e1f4343..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 121, -// "name": 'AnimatedPositioned基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【right】 : 到父右距离 【double】\n" -// "【left】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } -class CustomAnimatedPositioned extends StatefulWidget { - const CustomAnimatedPositioned({Key? key}) : super(key: key); - - @override - _CustomAnimatedPositionedState createState() => - _CustomAnimatedPositionedState(); -} - -class _CustomAnimatedPositionedState extends State { - final double startTop = 0.0; - final double endTop = 30.0; - - double _top = 0.0; - - @override - void initState() { - _top = startTop; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - color: Colors.grey.withAlpha(33), - width: 200, - height: 100, - child: Stack( - children: _buildChildren(), - ), - ), - ], - ); - } - - List _buildChildren() => [ - AnimatedPositioned( - duration: const Duration(seconds: 1), - top: _top, - left: _top * 4, - child: const Icon( - Icons.android, - color: Colors.green, - size: 50, - ), - ), - AnimatedPositioned( - duration: const Duration(seconds: 1), - top: 50 - _top, - left: 150 - _top * 4, - child: const Icon( - Icons.android, - color: Colors.red, - size: 50, - ), - ) - ]; - - Widget _buildSwitch() => Switch( - value: _top == endTop, - onChanged: (v) { - setState(() { - _top = v ? endTop : startTop; - }); - }); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart deleted file mode 100644 index 9b9f320b..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 122, -// "name": 'AnimatedPositionedDirectional基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【end】 : 到父右距离 【double】\n" -// "【start】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } -class CustomAnimatedPositionedDirectional extends StatefulWidget { - const CustomAnimatedPositionedDirectional({Key? key}) : super(key: key); - - @override - _CustomAnimatedPositionedDirectionalState createState() => - _CustomAnimatedPositionedDirectionalState(); -} - -class _CustomAnimatedPositionedDirectionalState - extends State { - final double startTop = 0.0; - final double endTop = 30.0; - - double _top = 0.0; - - @override - void initState() { - _top = startTop; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - Container( - color: Colors.grey.withAlpha(33), - width: 200, - height: 100, - child: Stack( - children: _buildChildren(), - ), - ), - ], - ); - } - - List _buildChildren() => [ - AnimatedPositionedDirectional( - duration: const Duration(seconds: 1), - top: _top, - start: _top * 4, - child: const Icon( - Icons.android, - color: Colors.green, - size: 50, - ), - ), - AnimatedPositionedDirectional( - duration: const Duration(seconds: 1), - top: 50 - _top, - start: 150 - _top * 4, - child: const Icon( - Icons.android, - color: Colors.red, - size: 50, - ), - ) - ]; - - Widget _buildSwitch() => Switch( - value: _top == endTop, - onChanged: (v) { - setState(() { - _top = v ? endTop : startTop; - }); - }); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart deleted file mode 100644 index 6e7eca93..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 116, -// "name": 'AnimatedSwitcher基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【switchOutCurve】 : 切出曲线 【Curves】\n" -// "【switchInCurve】 : 切入曲线 【Curves】\n" -// "【switchInCurve】 : 切入曲线 【Curves】\n" -// "【transitionBuilder】 : 动画构造器 【Widget Function(Widget, Animation)】", -// } - -class CustomAnimatedSwitcher extends StatefulWidget { - const CustomAnimatedSwitcher({Key? key}) : super(key: key); - - @override - _CustomAnimatedSwitcherState createState() => _CustomAnimatedSwitcherState(); -} - -class _CustomAnimatedSwitcherState extends State { - int _count = 0; - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - _buildMinusBtn(), - SizedBox(width:80,child: _buildAnimatedSwitcher(context)), - _buildAddBtn() - ], - ); - } - - Widget _buildAnimatedSwitcher(BuildContext context) => - AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - transitionBuilder: (Widget child, Animation animation) => - ScaleTransition( - child: RotationTransition(turns: animation, child: child), - scale: animation), - child: Text( - '$_count', - key: ValueKey(_count), - style: Theme.of(context).textTheme.headline3, - ), - ); - - Widget _buildMinusBtn() { - return MaterialButton( - padding: const EdgeInsets.all(0), - textColor: const Color(0xffFfffff), - elevation: 3, - color: Colors.red, - highlightColor: const Color(0xffF88B0A), - splashColor: Colors.red, - child: const Icon( - Icons.remove, - color: Colors.white, - ), - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onPressed: () => setState(() => _count -= 1)); - } - - Widget _buildAddBtn() => MaterialButton( - padding: const EdgeInsets.all(0), - textColor: const Color(0xffFfffff), - elevation: 3, - color: Colors.blue, - highlightColor: const Color(0xffF88B0A), - splashColor: Colors.red, - child: const Icon( - Icons.add, - color: Colors.white, - ), - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onPressed: () => setState(() => _count += 1)); -} diff --git a/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart deleted file mode 100644 index d6aee269..00000000 --- a/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: 224 主题变化时具有动画效果的组件,本质是Theme组件和动画结合的产物。可指定ThemeData、动画时长、曲线、结束回调等。相当于增强版的Theme组件。 -// { -// "widgetId": 224 , -// "name": 'AnimatedTheme基本使用', -// "priority": 1, -// "subtitle": "【data】 : 主题数据 【ThemeData】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【child】 : 子组件 【Widget】", -// } -class AnimatedThemeDemo extends StatefulWidget { - const AnimatedThemeDemo({Key? key}) : super(key: key); - - @override - _AnimatedThemeDemoState createState() => _AnimatedThemeDemoState(); -} - -class _AnimatedThemeDemoState extends State { - ThemeData startThem = ThemeData( - primaryColor: Colors.blue, - textTheme: const TextTheme( - headline1: TextStyle( - color: Colors.white, - fontSize: 24, - fontWeight: FontWeight.bold, - ), - )); - - ThemeData endThem = ThemeData( - primaryColor: Colors.red, - textTheme: const TextTheme( - headline1: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.normal, - ))); - - late ThemeData them; - - @override - void initState() { - super.initState(); - them = startThem; - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildSwitch(), - AnimatedTheme( - data: them, - duration: const Duration(seconds: 2), - curve: Curves.fastOutSlowIn, - onEnd: () { - print('----onEnd---'); - }, - child: const ChildContent(), - ), - ], - ); - } - - Widget _buildSwitch() { - print(them == endThem); - return Switch( - value: them == endThem, - onChanged: (v) { - setState(() { - them = v ? endThem : startThem; - }); - }); - } -} - -class ChildContent extends StatelessWidget { - const ChildContent({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: 250, - height: 60, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(5)), - color: Theme.of(context).primaryColor, - ), - padding: const EdgeInsets.all(10), - child: Text( - 'Flutter Unit', - style: Theme.of(context).textTheme.headline1, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AppBar/node1_base.dart b/packages/widgets/lib/StatefulWidget/AppBar/node1_base.dart deleted file mode 100644 index 35e450fe..00000000 --- a/packages/widgets/lib/StatefulWidget/AppBar/node1_base.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../PopupMenuButton/node1_base.dart'; - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 57, -// "name": 'AppBar基本使用', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【title】 : 中间组件 【Widget】\n" -// "【actions】 : 右侧组件 【List】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【backgroundColor】 : 影深 【背景色】\n" -// "【centerTitle】 : 中间是否居中 【bool】", -// } - -class CustomAppBar extends StatelessWidget { - const CustomAppBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return AppBar( - title: const Text('风雅六社'), - leading: const BackButton(), - backgroundColor: Colors.amber[500], - elevation: 2, - centerTitle: true, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), - bottomRight: Radius.circular(20), - topRight: Radius.circular(5), - bottomLeft: Radius.circular(5), - )), - actions: [ - IconButton( - icon: const Icon(Icons.star), - tooltip: 'liked_widget_bloc', - onPressed: () { - // do nothing - }), - const CustomPopupMenuButton() - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart b/packages/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart deleted file mode 100644 index 2af44f57..00000000 --- a/packages/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart +++ /dev/null @@ -1,125 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 239 AutomaticKeepAlive 自动保活 在懒加载的列表中,允许子树请求保持状态,单独使用无效果,需要配合 KeepAliveNotification 使用。 -/// link 59,162,163,165,185,188 -/// -// { -// "widgetId": 239, -// "name": 'AutomaticKeepAlive 介绍', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "在 ListView、SliverList、GridView、SliverGrid、PageView、TabBarView 等列表、切页组件源码中都有使用到 AutomaticKeepAlive 组件。在保活某个 State 时,可以使用 AutomaticKeepAliveClientMixin 进行操作,它是对 KeepAliveNotification 使用的一个简易封装。该示例展示出 ListView 条目的状态保活。", -// } - -class AutomaticKeepAliveDemo extends StatelessWidget { - AutomaticKeepAliveDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: ListView.builder( - itemCount: data.length, - itemBuilder: (_, index) => ColorBox( - color: data[index], - index: index, - ), - ), - ); - } -} - -class ColorBox extends StatefulWidget { - final Color color; - final int index; - - const ColorBox({Key? key, required this.color, required this.index}) - : super(key: key); - - @override - _ColorBoxState createState() => _ColorBoxState(); -} - -class _ColorBoxState extends State with AutomaticKeepAliveClientMixin { - bool _checked = false; - - @override - void initState() { - super.initState(); - _checked = false; - print('-----_ColorBoxState#initState---${widget.index}-------'); - } - - @override - void dispose() { - print('-----_ColorBoxState#dispose---${widget.index}-------'); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Container( - alignment: Alignment.center, - height: 50, - color: widget.color, - child: Row( - children: [ - const SizedBox( - width: 60, - ), - Checkbox( - value: _checked, - onChanged: (bool? v) { - setState(() { - _checked = v ?? false; - }); - }, - ), - Text( - "index ${widget.index}: ${colorString(widget.color)}", - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ], - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - @override - bool get wantKeepAlive => true; -} diff --git a/packages/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart b/packages/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart deleted file mode 100644 index c65adf68..00000000 --- a/packages/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 61, -// "name": 'BottomAppBar基本用法', -// "priority": 1, -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【NotchedShape】\n" -// "【notchMargin】 : 间隔距离 【double】\n" -// "【color】 : 颜色 【Color】\n" -// "【child】 : 孩子 【Widget】", -// } -class CustomBottomAppBar extends StatefulWidget { - const CustomBottomAppBar({Key? key}) : super(key: key); - - @override - _CustomBottomAppBarState createState() => _CustomBottomAppBarState(); -} - -class _CustomBottomAppBarState extends State { - int _position = 0; - FloatingActionButtonLocation _location = - FloatingActionButtonLocation.centerDocked; - final Map iconsMap = { - "图鉴": Icons.home, - "动态": Icons.toys, - "喜欢": Icons.favorite, - "手册": Icons.class_, - }; - Color activeColor = Colors.blue.withAlpha(240); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: 180, - child: Scaffold( - backgroundColor: Colors.purple.withAlpha(22), - floatingActionButton: FloatingActionButton( - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - child: const Icon(Icons.add), - ), - bottomNavigationBar: _buildBottomAppBar(), - floatingActionButtonLocation: _location, - body: _buildContent(), - ), - ); - } - - Widget _buildBottomAppBar() { - return BottomAppBar( - elevation: 1, - shape: const CircularNotchedRectangle(), - notchMargin: 5, - color: Colors.red, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: info.asMap().keys.map((i) => _buildChild(i)).toList() - ..insertAll(isCenter ? 2 : 4, [const SizedBox(width: 30)])), - ); - } - - Container _buildContent() { - return Container( - alignment: Alignment.center, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text( - '当前页索引:$_position', - style: const TextStyle(color: Colors.blue, fontSize: 18), - ), - Switch( - value: isCenter, - onChanged: (v) { - setState(() { - _location = v - ? FloatingActionButtonLocation.centerDocked - : FloatingActionButtonLocation.endDocked; - }); - }), - ], - ), - ); - } - - List get info => iconsMap.keys.toList(); - - bool get isCenter => _location == FloatingActionButtonLocation.centerDocked; - - Widget _buildChild(int i) { - bool active = i == _position; - return Padding( - padding: const EdgeInsets.all(8.0), - child: GestureDetector( - onTap: () => setState(() => _position = i), - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - children: [ - Icon( - iconsMap[info[i]], - color: active ? activeColor : Colors.white, - size: 30, - ), - Text(info[i], - style: TextStyle( - color: active ? activeColor : Colors.white, fontSize: 14)), - ], - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart b/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart deleted file mode 100644 index 4d706211..00000000 --- a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-23 -/// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 60, -// "name": 'BottomNavigationBar基本使用', -// "priority": 1, -// "subtitle": -// "【currentIndex】 : 当前索引 【int】\n" -// "【elevation】 : 影深 【double】\n" -// "【type】 : 类型*2 【BottomNavigationBarType】\n" -// "【fixedColor】 : type为fix的颜色 【Color】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【selectedLabelStyle】 : 选中文字样式 【TextStyle】\n" -// "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n" -// "【showUnselectedLabels】 : 显示未选中标签 【bool】\n" -// "【showSelectedLabels】 : 显示选中标签 【bool】\n" -// "【items】 : 条目 【List】\n" -// "【onTap】 : 点击事件 【Function(int)】", -// } -class CustomBottomNavigationBar extends StatefulWidget { - const CustomBottomNavigationBar({Key? key}) : super(key: key); - - @override - _CustomBottomNavigationBarState createState() => - _CustomBottomNavigationBarState(); -} - -class _CustomBottomNavigationBarState extends State { - int _position = 0; - BottomNavigationBarType _type = BottomNavigationBarType.shifting; - final Map iconsMap = { //底栏图标 - "图鉴": Icons.home, "动态": Icons.toys, - "喜欢": Icons.favorite, "手册": Icons.class_, - "我的": Icons.account_circle, - }; - final List _colors = [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green, - Colors.purple, - ]; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - _buildOp(), - _buildBottomNavigationBar(), - ], - ); - } - - bool get isShifting => _type == BottomNavigationBarType.shifting; - - BottomNavigationBar _buildBottomNavigationBar() { - return BottomNavigationBar( - onTap: (position) => setState(() => _position = position), - currentIndex: _position, - elevation: 1, - type: _type, - fixedColor: isShifting ? Colors.white : _colors[_position], - backgroundColor: Colors.white, - iconSize: 25, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), - showUnselectedLabels: false, - showSelectedLabels: true, - items: iconsMap.keys - .map((key) => BottomNavigationBarItem( - label:key, - icon: Icon(iconsMap[key]), - backgroundColor: _colors[_position])) - .toList(), - ); - } - - Widget _buildOp() { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text( - _type.toString(), - style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.blue), - ), - Switch( - value: _type == BottomNavigationBarType.shifting, - onChanged: (b) { - setState(() => _type = b - ? BottomNavigationBarType.shifting - : BottomNavigationBarType.fixed); - }), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Checkbox/node1_base.dart b/packages/widgets/lib/StatefulWidget/Checkbox/node1_base.dart deleted file mode 100644 index 9ef6fab7..00000000 --- a/packages/widgets/lib/StatefulWidget/Checkbox/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 39, -// "name": 'Checkbox基础用法', -// "priority": 1, -// "subtitle": -// "【value】 : 是否选中 【double】\n" -// "【checkColor】: 选中时✔️gou颜色 【Color】\n" -// "【activeColor】: 选中时框内颜色 【Color】\n" -// "【onChanged】: 状态改变事件 【Function(bool)】\n", -// } - -class CustomCheckbox extends StatefulWidget { - const CustomCheckbox({Key? key}) : super(key: key); - - @override - _CustomCheckboxState createState() => _CustomCheckboxState(); -} - -class _CustomCheckboxState extends State { - bool _checked = false; - final List colors = [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: colors - .map((e) => Checkbox( - value: _checked, - checkColor: Colors.white, - activeColor: e, - onChanged: (bool? value) => - setState(() => _checked = value??false))) - .toList(), - ); - } -} - - diff --git a/packages/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart b/packages/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart deleted file mode 100644 index 5ed15472..00000000 --- a/packages/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart +++ /dev/null @@ -1,46 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -/// { -// "widgetId": 39, -// "name": 'Checkbox的三态', -// "priority": 2, -// "subtitle": -// "【tristate】 : 是否是三态 【double】\n" -// " onChanged时,回调true、null、false三种状态" -// } -class TristateCheckBok extends StatefulWidget { - const TristateCheckBok({Key? key}) : super(key: key); - - @override - _TristateCheckBokState createState() => _TristateCheckBokState(); -} - -class _TristateCheckBokState extends State { - bool _checked = false; - final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green]; - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: colors - .map((e) => - Checkbox( - value: _checked, - tristate: true, - checkColor: Colors.white, - activeColor: e, - onChanged: (bool? value) { - print(value); - setState(() => _checked = value??false); - })) - .toList(), - ); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart b/packages/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart deleted file mode 100644 index 302ffe7c..00000000 --- a/packages/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 46, -// "name": 'CircularProgressIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 进度 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【valueColor】 : 进度颜色 【Animation】\n" -// "【strokeWidth】 : 线宽 【double】", -// } -class CustomCircularProgressIndicator extends StatefulWidget { - const CustomCircularProgressIndicator({Key? key}) : super(key: key); - - @override - _CustomCircularProgressIndicatorState createState() => - _CustomCircularProgressIndicatorState(); -} - -class _CustomCircularProgressIndicatorState - extends State { - - List data = [0.2,0.4,0.6,0.8,null]; - - @override - Widget build(BuildContext context) { - - return Wrap( - spacing: 10, - children:data.map((e)=>SizedBox( - width: 50, - height: 50, - child: CircularProgressIndicator( - value: e, - backgroundColor: Colors.grey.withAlpha(33), - valueColor: const AlwaysStoppedAnimation(Colors.orange), - strokeWidth: 5, - ), - )).toList(), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart deleted file mode 100644 index a3061e0e..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/cupertino.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 48, -// "name": 'CupertinoActivityIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【animating】 : 是否loading动画 【bool】\n" -// "【radius】 : 半径 【double】", -// } -class CustomCupertinoActivityIndicator extends StatelessWidget { - const CustomCupertinoActivityIndicator({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - - return Wrap( - spacing: 20, - children: const [ - CupertinoActivityIndicator( - animating: true, - radius: 25, - ), - CupertinoActivityIndicator( - animating: false, - radius: 25, - ) - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart deleted file mode 100644 index eb710ee7..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020-03-17 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 156, -// "name": 'CupertinoApp基本用法', -// "priority": 1, -// "subtitle": "【theme】 : 主题 【ThemeData】\n" -// "【title】 : 任务栏标题 【String】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【home】 : 主页 【Widget】", -// } -class CustomCupertinoApp extends StatelessWidget { - const CustomCupertinoApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 200, - child: const CupertinoApp( - title: 'Flutter Demo', - theme: CupertinoThemeData( - primaryColor: CupertinoColors.white, - ), - home: CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - leading: Icon( - CupertinoIcons.reply, - color: CupertinoColors.black, - ), - trailing: Icon( - CupertinoIcons.share, - color: CupertinoColors.black, - ), - middle: Text('Flutter Unit'), - ), - backgroundColor: CupertinoColors.systemBackground, - child: Center( - child: Text('Hello, World!'), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart deleted file mode 100644 index 0958538a..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 24, -// "priority": 1, -// "name": "CupertinoButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【pressedOpacity】: 按下时透明度 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【borderRadius】: 圆角半径 【BorderRadius】\n" -// "【onPressed】: 点击事件 【Function】", -// } -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class CustomCupertinoButton extends StatelessWidget { - CustomCupertinoButton({Key? key}) : super(key: key); - - final Map data = { - CupertinoColors.activeBlue:4.0, - Colors.blue:6.0, - CupertinoColors.activeOrange:8.0, - }; - - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children:data.keys.map((e)=> CupertinoButton( - padding: EdgeInsets.zero, - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - color: e, - pressedOpacity: 0.4, - borderRadius: BorderRadius.all(Radius.circular(data[e]!)), - child: const Text("iOS"), - )).toList() - ); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart deleted file mode 100644 index c4c99809..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 143, -// "name": 'CupertinoContextMenu基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【actions】 : 行为组件集 【List】\n" -// "【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】", -// } -class CustomCupertinoContextMenu extends StatelessWidget { - const CustomCupertinoContextMenu({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 100, - height: 100, - child: DecoratedBox( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/sabar_bar.webp'), - fit: BoxFit.cover), - borderRadius: BorderRadius.all(Radius.circular(50))), - child: _buildCupertinoContextMenu(context)), - ); - } - - final List info = const ['保存图片', '立刻呼叫', '添加到收藏夹']; - - Widget _buildCupertinoContextMenu(context) => CupertinoContextMenu( - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/sabar_bar.webp'), - fit: BoxFit.cover), - borderRadius: BorderRadius.all(Radius.circular(50))), - ), - actions: info - .map((e) => CupertinoContextMenuAction( - child: Center(child: Text(e)), - onPressed: () => Navigator.pop(context), - )) - .toList()); -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart deleted file mode 100644 index f8cdf6eb..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 144, -// "name": 'CupertinoContextMenuAction基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【trailingIcon】 : 尾部 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -import 'package:flutter/cupertino.dart'; - -class CustomCupertinoContextMenuAction extends StatelessWidget { - const CustomCupertinoContextMenuAction({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - width: 200, - margin: const EdgeInsets.all(5), - child: CupertinoContextMenuAction( - trailingIcon: CupertinoIcons.settings, - isDefaultAction: true, - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - child: const Text('张风捷特烈')), - ), - Container( - width: 200, - margin: const EdgeInsets.all(5), - child: CupertinoContextMenuAction( - trailingIcon: CupertinoIcons.home, - isDefaultAction: false, - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - child: const Text('百里·巫缨')), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart deleted file mode 100644 index bcad7d5e..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 137, -// "name": 'CupertinoDatePicker基本使用', -// "priority": 1, -// "subtitle": -// "【initialDateTime】 : 初始日期 【DateTime】\n" -// "【minimumYear】 : 最小年份 【int】\n" -// "【maximumYear】 : 最大年份 【int】\n" -// "【onDateTimeChanged】 : 点击回调 【Function(DateTime)】\n" -// "【minuteInterval】 : 分钟间隔 【int】\n" -// "【use24hFormat】 : 是否是24小时制 【bool】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【mode】 : 模式*3 【CupertinoDatePickerMode】", -// } -class CustomCupertinoDatePicker extends StatefulWidget { - const CustomCupertinoDatePicker({Key? key}) : super(key: key); - - @override - _CustomCupertinoDatePickerState createState() => - _CustomCupertinoDatePickerState(); -} - -class _CustomCupertinoDatePickerState extends State { - DateTime _date = DateTime.now(); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text( - '当前日期:${_date.toIso8601String()}', - style: const TextStyle(color: Colors.grey, fontSize: 16), - ), - _buildInfoTitle('CupertinoDatePickerMode.dateAndTime'), - buildPicker(CupertinoDatePickerMode.dateAndTime), - _buildInfoTitle('CupertinoDatePickerMode.date'), - buildPicker(CupertinoDatePickerMode.date), - _buildInfoTitle('CupertinoDatePickerMode.time'), - buildPicker(CupertinoDatePickerMode.time), - ], - ); - } - - Container buildPicker(CupertinoDatePickerMode mode) { - return Container( - margin: const EdgeInsets.all(10), - height: 150, - child: CupertinoDatePicker( - mode: mode, - initialDateTime: DateTime.now(), -// maximumDate: DateTime(2018,8,8), -// minimumDate: DateTime(2030,8,8), - minimumYear: 2018, - maximumYear: 2030, - use24hFormat: false, - minuteInterval: 1, - backgroundColor: CupertinoColors.white, - onDateTimeChanged: (date) { - print(date); - setState(() => _date = date); - }, - ), - ); - } - - Widget _buildInfoTitle(info){ - return Padding( - padding: const EdgeInsets.only(left: 20,top: 20,bottom: 5), - child: Text( - info, - style: const TextStyle(color: Colors.blue, fontSize: 16,fontWeight: FontWeight.bold), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart deleted file mode 100644 index ee39ef3e..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 62, -// "name": 'CupertinoNavigationBar基本用法', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【middle】 : 中间组件 【Widget】\n" -// "【trailing】 : 尾部组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsDirectional】\n" -// "【border】 : 边线 【Border】", -// } -class CustomCupertinoNavigationBar extends StatelessWidget { - const CustomCupertinoNavigationBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return CupertinoNavigationBar( - leading: const Icon( - CupertinoIcons.back, - size: 25, - color: Colors.blue, - ), - middle: const Text("风雪雅舍"), - trailing: Image.asset( - "assets/images/icon_head.webp", - width: 25.0, - height: 25.0, - ), - backgroundColor: const Color(0xfff1f1f1), - padding: const EdgeInsetsDirectional.only(start: 10,end: 20), - border: Border.all(color: Colors.transparent), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart deleted file mode 100644 index 54ad2ec1..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 157, -// "name": 'CupertinoPageScaffold基本用法', -// "priority": 1, -// "subtitle": -// "【child】 : 内容 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【navigationBar】 : 头部 【ObstructingPreferredSizeWidget】", -// } -class CustomCupertinoPageScaffold extends StatelessWidget { - const CustomCupertinoPageScaffold({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 300, - child: const CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - leading: Icon(CupertinoIcons.reply), - trailing: Icon(CupertinoIcons.share), - middle: Text('Flutter Unit'), - ), - backgroundColor: CupertinoColors.systemBackground, - child: Center( - child: Text('Hello, World!'), - ), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart deleted file mode 100644 index 20bcb53e..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 139, -// "name": 'CupertinoPicker基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【offAxisFraction】 : 轴偏移率 【double】\n" -// "【squeeze】 : 挤压率 【double】\n" -// "【diameterRatio】 : 高与圆柱直径比率 【double】\n" -// "【itemExtent】 : 间距 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【onSelectedItemChanged】 : 选中事件 【Function(int)】", -// } -class CustomCupertinoPicker extends StatelessWidget { - const CustomCupertinoPicker({Key? key}) : super(key: key); - - final List names = const[ - 'Java', - 'Kotlin', - 'Dart', - 'Swift', - 'C++', - 'Python', - "JavaScript", - "PHP", - "Go", - "Object-c" - ]; - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 150, - child: CupertinoPicker( - backgroundColor: CupertinoColors.systemGrey.withAlpha(33), - diameterRatio: 1, - offAxisFraction: 0.4, - squeeze: 1.5, - itemExtent: 40, - onSelectedItemChanged: (position) { - print('当前条目 ${names[position]}'); - }, - children: names.map((e) => Center(child: Text(e))).toList()), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart deleted file mode 100644 index e5a33283..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 195, -// "name": 'CupertinoScrollbar基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【controller】 : 控制器 【ScrollController】", -// } -class CustomCupertinoScrollbar extends StatelessWidget { - CustomCupertinoScrollbar({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - TextStyle get textStyle => const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: CupertinoScrollbar( - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart deleted file mode 100644 index e2cd73a6..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020/6/30 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 262, -// "name": 'iOS页签基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件Map 【Map】\n" -// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" -// "【groupValue】 : 选中值 【T】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CupertinoSegmentedControlDemo extends StatefulWidget { - const CupertinoSegmentedControlDemo({Key? key}) : super(key: key); - - @override - _CupertinoSegmentedControlDemoState createState() => - _CupertinoSegmentedControlDemoState(); -} - -class _CupertinoSegmentedControlDemoState - extends State { - int _value = 1; - - @override - Widget build(BuildContext context) { - return CupertinoSegmentedControl( - groupValue: _value, - onValueChanged: _onValueChanged, - padding: const EdgeInsets.only(top: 20), - children: const { - 1: Padding( - padding: EdgeInsets.only(left: 20, right: 20), - child: Text("混沌战士"), - ), - 2: Text("青眼白龙"), - 3: Text("黑魔术士"), - }, - ); - } - - void _onValueChanged(int value) { - setState(() { - _value=value; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart b/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart deleted file mode 100644 index db59addf..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/30 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 262, -// "name": 'CupertinoSegmentedControl的颜色', -// "priority": 2, -// "subtitle": -// "【unselectedColor】 : 未选中色 【Color】\n" -// "【selectedColor】 : 选中色 【Color】\n" -// "【pressedColor】 : 按下色 【Color】\n" -// "【borderColor】 : 边线色 【Color】", -// } -class CupertinoSegmentedControlColor extends StatefulWidget { - const CupertinoSegmentedControlColor({Key? key}) : super(key: key); - - @override - _CupertinoSegmentedControlColorState createState() => - _CupertinoSegmentedControlColorState(); -} - -class _CupertinoSegmentedControlColorState - extends State { - int _value = 1; - - @override - Widget build(BuildContext context) { - return CupertinoSegmentedControl( - unselectedColor: Colors.yellow, - selectedColor: Colors.green, - pressedColor: Colors.blue, - borderColor: Colors.red, - groupValue: _value, - onValueChanged: _onValueChanged, - padding: const EdgeInsets.only(top: 20), - children: const { - 1: Padding( - padding: EdgeInsets.only(left: 20, right: 20), - child: Text("混沌战士"), - ), - 2: Text("青眼白龙"), - 3: Text("黑魔术士"), - }, - ); - } - - void _onValueChanged(int value) { - setState(() { - _value=value; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart deleted file mode 100644 index fc08892c..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 43, -// "name": 'CupertinoSlider基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 数值 【double】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【thumbColor】 : 圆形颜色 【Color】\n" -// "【divisions】 : 分段数 【int】\n" -// "【onChangeStart】 : 开始滑动回调 【Function(double)】\n" -// "【onChangeEnd】 : 滑动结束回调 【Function(double)】\n" -// "【onChanged】 : 改变时回调 【Function(double)】", -// } -class CustomCupertinoSlider extends StatefulWidget { - const CustomCupertinoSlider({Key? key}) : super(key: key); - - @override - _CustomCupertinoSliderState createState() => _CustomCupertinoSliderState(); -} - -class _CustomCupertinoSliderState extends State { - double _value = 0.0; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('当前值:${_value.toStringAsFixed(1)}'), - CupertinoSlider( - value: _value, - divisions: 180, - min: 0.0, - max: 360.0, - activeColor: Colors.green, - thumbColor: Colors.white, - onChangeStart: (value) => print('开始滑动:$value'), - onChangeEnd: (value) => print('滑动结束:$value'), - onChanged: (value) { - setState(() { - _value = value; - }); - }), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart deleted file mode 100644 index ca98d299..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 256 CupertinoSlidingSegmentedControl iOS滑动页签 iOS风格的滑动页签,支持点击、滑动切换。可指定页签颜色、背景色、边距等属性。 -// { -// "widgetId": 256, -// "name": 'iOS滑动页签基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件Map 【Map】\n" -// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" -// "【groupValue】 : 选中值 【T】\n" -// "【thumbColor】 : 选中色 【Color】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CupertinoSlidingSegmentedControlDemo extends StatefulWidget { - const CupertinoSlidingSegmentedControlDemo({Key? key}) : super(key: key); - - @override - _CupertinoSlidingSegmentedControlDemoState createState() => - _CupertinoSlidingSegmentedControlDemoState(); -} - -class _CupertinoSlidingSegmentedControlDemoState - extends State { - int _value = 1; - - @override - Widget build(BuildContext context) { - return CupertinoSlidingSegmentedControl( - groupValue: _value, - onValueChanged: _onValueChanged, - thumbColor: Colors.amberAccent, - backgroundColor: Colors.green.withAlpha(99), - padding: const EdgeInsets.all(5), - children: const { - 1: Padding( - padding: EdgeInsets.only(left: 20, right: 20), - child: Text("混沌战士"), - ), - 2: Text("青眼白龙"), - 3: Text("黑魔导"), - }, - ); - } - - void _onValueChanged(int? value) { - if(value==null) return; - setState(() { - _value=value; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart deleted file mode 100644 index 2a72e9c4..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -/// { -// "widgetId": 41, -// "name": 'CupertinoSwitch基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 是否选中 【double】\n" -// "【activeColor】 : 激活态颜色 【Color】\n" -// "【onChanged】 : 切换回调 【Function(double)】", -// } -class CustomCupertinoSwitch extends StatefulWidget { - const CustomCupertinoSwitch({Key? key}) : super(key: key); - - @override - _CustomCupertinoSwitchState createState() => _CustomCupertinoSwitchState(); -} - -class _CustomCupertinoSwitchState extends State { - final List colors = [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - - bool _checked = false; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: colors - .map((e) => CupertinoSwitch( - value: _checked, - activeColor: e, - onChanged: (v) { - setState(() => _checked = v); - })).toList(), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart deleted file mode 100644 index 218c5c74..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 63, -// "name": 'CupertinoTabBar基本用法', -// "priority": 1, -// "subtitle": -// "【currentIndex】 : 当前激活索引 【Widget】\n" -// "【items】 : 条目组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【inactiveColor】 : 非激活色 【Color】\n" -// "【activeColor】 : 激活色 【Color】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【border】 : 边线 【Border】\n" -// "【onTap】 : 点击事件 【Function(int)】", -// } -class CustomCupertinoTabBar extends StatefulWidget { - const CustomCupertinoTabBar({Key? key}) : super(key: key); - - @override - _CustomCupertinoTabBarState createState() => _CustomCupertinoTabBarState(); -} - -class _CustomCupertinoTabBarState extends State { - int _position = 0; - final Map iconsMap = { - //底栏图标 - "图鉴": Icons.home, "动态": Icons.toys, - "喜欢": Icons.favorite, "手册": Icons.class_, - "我的": Icons.account_circle, - }; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildContent(context), - _buildTabBar(), - ], - ); - } - - Widget _buildTabBar() { - return CupertinoTabBar( - currentIndex: _position, - onTap: (value) => setState(() => _position = value), - items: iconsMap.keys - .map((e) => BottomNavigationBarItem( - icon: Icon( - iconsMap[e], - ), - label: e, - )) - .toList(), - activeColor: Colors.blue, - inactiveColor: const Color(0xff333333), - backgroundColor: const Color(0xfff1f1f1), - iconSize: 25.0, - ); - } - - Widget _buildContent(BuildContext context) { - return Container( - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: 150, - color: const Color(0xffE7F3FC), - child: Text( - iconsMap.keys.toList()[_position], - style: const TextStyle(color: Colors.blue, fontSize: 24), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart deleted file mode 100644 index 715b0fd5..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 158, -// "name": 'CupertinoTabScaffold基本用法', -// "priority": 1, -// "subtitle": -// "【tabBar】 : 页签条 【CupertinoTabBar】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【controller】 : 控制器 【CupertinoTabController】\n" -// "【tabBuilder】 : 页面构造器 【IndexedWidgetBuilder】", -// } -class CustomCupertinoTabScaffold extends StatefulWidget { - const CustomCupertinoTabScaffold({Key? key}) : super(key: key); - - @override - _CustomCupertinoTabScaffoldState createState() => - _CustomCupertinoTabScaffoldState(); -} - -class _CustomCupertinoTabScaffoldState - extends State { - int _position = 0; - final Map iconsMap = { - //底栏图标 - "图鉴": Icons.home, "动态": Icons.toys, - "喜欢": Icons.favorite, "手册": Icons.class_, - "我的": Icons.account_circle, - }; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 300, - child: CupertinoTabScaffold( - backgroundColor: Colors.grey.withAlpha(11), - tabBar: _buildTabBar(), - tabBuilder: (_, index) => _buildContent(index)), - ); - } - - CupertinoTabBar _buildTabBar() => CupertinoTabBar( - currentIndex: _position, - onTap: (value) => setState(() => _position = value), - items: iconsMap.keys - .map((e) => BottomNavigationBarItem( - icon: Icon( - iconsMap[e], - ), - label: e, - )) - .toList(), - activeColor: Colors.blue, - inactiveColor: const Color(0xff333333), - backgroundColor: const Color(0xfff1f1f1), - iconSize: 25.0, - ); - - _buildContent(int index) => Container( - alignment: Alignment.center, - child: Text(iconsMap.keys.toList()[index]), - ); -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart deleted file mode 100644 index 5ecde41f..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 229 CupertinoTabView Cupertino页面 CupertinoTabView 可以像 MaterialApp 一样维护一个路由栈。通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。 -// { -// "widgetId": 229, -// "name": 'CupertinoTabView基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 主页构造器 【WidgetBuilder】\n" -// "【navigatorObservers】 : 路由监听器 【List】\n" -// "【routes】 : 路由映射 【Map】\n" -// "【onGenerateRoute】 : 路由工厂 【RouteFactory】", -// } - -class CupertinoTabViewDemo extends StatelessWidget { - const CupertinoTabViewDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(10), - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const CupertinoTabViewPage()), - ); - }, - child: const Text("进入 CupertinoTabView 测试页"), - ), - ); - } -} - - -class CupertinoTabViewPage extends StatelessWidget { - const CupertinoTabViewPage({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: CupertinoTabView( - routes: { - '/': (context) => _HomePage(), - '/test_detail': (context) => const DetailPage(), - }, - ), - ); - } -} - -class DetailPage extends StatelessWidget { - const DetailPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return CupertinoPageScaffold( - navigationBar: const CupertinoNavigationBar( - middle: Text('我是详情页'), - ), - child: Center( - child: Container( - width: 200, - height: 200, - color: Colors.blue, - ), - ), - ); - } -} - -class _HomePage extends StatelessWidget { - - final String info = "CupertinoTabView 可以像 MaterialApp 一样维护一个路由栈。" - "通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。" - "在这个路由栈中可以进行指定名称跳转,如下通过 /test_detail 跳到详情页。"; - - @override - Widget build(BuildContext context) { - return CupertinoPageScaffold( - navigationBar: const CupertinoNavigationBar( - middle: Text('我是主页'), - ), - child: Center(child: Column( - - children: [ - const Spacer(), - Material(child: Padding( - padding: const EdgeInsets.only(left:18.0,right: 18,bottom: 20), - child: Text(info), - )), - CupertinoButton( - padding: const EdgeInsets.only(left: 10,right: 10), - color: Colors.blue, - onPressed: () { - Navigator.pushNamed( - context, "/test_detail" - ); - }, - child: const Text("进入详情页"), - ), - const Spacer(), - ], - )), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart deleted file mode 100644 index 2b8eba39..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 -// { -// "widgetId": 245, -// "name": "CupertinoTextField基础使用", -// "priority": 1, -// "subtitle": "【placeholder】 : 提示文字 【String】\n" -// "【showCursor】 : 是否显示游标 【bool】\n" -// "【minLines】 : 最小行数 【int】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【onChanged】 : 变化监听 【ValueChanged】\n" -// "【onTap】: 点击监听 【GestureTapCallback】\n" -// "【onSubmitted】: 提交监听 【ValueChanged】", -// } -class CupertinoTextFieldDemo extends StatefulWidget { - const CupertinoTextFieldDemo({Key? key}) : super(key: key); - - @override - _CupertinoTextFieldDemoState createState() => _CupertinoTextFieldDemoState(); -} - -class _CupertinoTextFieldDemoState extends State { - String _value = ''; - Color _color =Colors.black; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text('输入了:$_value',style: TextStyle(color: _color),), - CupertinoTextField( - placeholder: 'Input Name', - showCursor: true, - minLines: 1, - maxLines: 4, - padding: const EdgeInsets.all(8), - onChanged: _onChanged, - onTap: _onTap, - onSubmitted: _onSubmitted, - ), - ], - ); - } - - void _onChanged(String value) { - setState(() { - _value = value; - }); - } - - void _onTap() { - print('----_onTap----'); - setState(() { - _color=Colors.blue; - }); - } - - void _onSubmitted(String value) { - print('----_onSubmitted:$value}----'); - setState(() { - _color=Colors.black; - }); - } - -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart b/packages/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart deleted file mode 100644 index 4d30c68e..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 -// { -// "widgetId": 245, -// "name": 'CupertinoTextField常用样式属性', -// "priority": 2, -// "subtitle": "【style】 : 输入文字样式 【TextStyle】\n" -// "【prefix】: 前缀组件 【Widget】\n" -// "【prefixMode】: 前缀模式 【OverlayVisibilityMode】\n" -// "【suffix】: 后缀组件 【Widget】\n" -// "【suffixMode】: 后缀模式 【OverlayVisibilityMode】\n" -// "【cursorColor】: 游标颜色 【Color】\n" -// "【cursorWidth】: 游标宽度 【double】\n" -// "【cursorRadius】: 游标圆角 【Radius】\n" -// "【readOnly】: 是否只读 【bool】", -// } -class CupertinoTextFieldStyle extends StatelessWidget { - const CupertinoTextFieldStyle({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return const CupertinoTextField( - style: TextStyle(color: Colors.blue), - prefix: Icon(CupertinoIcons.add), - prefixMode: OverlayVisibilityMode.notEditing, - suffix: Icon(CupertinoIcons.clear), - suffixMode: OverlayVisibilityMode.editing, - cursorColor: Colors.purple, - cursorWidth: 4, - cursorRadius: Radius.circular(2), - readOnly: false, - placeholder: '输入用户名', - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart b/packages/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart deleted file mode 100644 index c6f39da1..00000000 --- a/packages/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 138, -// "name": 'CupertinoTimerPicker基本使用', -// "priority": 1, -// "subtitle": -// "【initialTimerDuration】 : 初始时间 【Duration】\n" -// "【minuteInterval】 : 分钟间隔数 【double】\n" -// "【secondInterval】 : 秒间隔数 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【mode】 : 模式*3 【CupertinoTimerPickerMode】", -// } -class CustomCupertinoTimerPicker extends StatefulWidget { - const CustomCupertinoTimerPicker({Key? key}) : super(key: key); - - @override - _CustomCupertinoTimerPickerState createState() => - _CustomCupertinoTimerPickerState(); -} - -class _CustomCupertinoTimerPickerState - extends State { - Duration _date = const Duration(seconds: 30); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text( - '当前时间:${_date.toString()}', - style: const TextStyle(color: Colors.grey, fontSize: 16), - ), - _buildInfoTitle('CupertinoTimerPickerMode.hms'), - buildPicker(CupertinoTimerPickerMode.hms), - _buildInfoTitle('CupertinoTimerPickerMode.hm'), - buildPicker(CupertinoTimerPickerMode.hm), - _buildInfoTitle('CupertinoTimerPickerMode.ms'), - buildPicker(CupertinoTimerPickerMode.ms), - ], - ); - } - - Widget _buildInfoTitle(info) { - return Padding( - padding: const EdgeInsets.only(left: 20, top: 20, bottom: 5), - child: Text( - info, - style: const TextStyle( - color: Colors.blue, fontSize: 16, fontWeight: FontWeight.bold), - ), - ); - } - - Widget buildPicker(CupertinoTimerPickerMode mode) { - return Container( - margin: const EdgeInsets.all(10), - height: 150, - child: CupertinoTimerPicker( - mode: mode, - initialTimerDuration: const Duration(seconds: 30), - onTimerDurationChanged: (date) { - print(date); - setState(() => _date = date); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart b/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart deleted file mode 100644 index 70ff91d8..00000000 --- a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 339, -// "name": 'DateRangePickerDialog 基本使用', -// "priority": 1, -// "subtitle": -// "【firstDate】 : 最早日期 【DateTime】\n" -// "【lastDate】 : 最晚日期 【DateTime】\n" -// "【initialDateRange】 : 初始范围 【DateTimeRange?】\n" -// "【saveText】 : 保存文字 【String?】", -// } -class DateRangePickerDialogDemo extends StatefulWidget { - const DateRangePickerDialogDemo({Key? key}) : super(key: key); - - @override - _DateRangePickerDialogDemoState createState() => - _DateRangePickerDialogDemoState(); -} - -class _DateRangePickerDialogDemoState - extends State { - String _dateRange = ''; - - // 需要 intl 包 - final DateFormat format = DateFormat('yyyy-MM-dd'); - - @override - Widget build(BuildContext context) { - String info = _dateRange.isEmpty ? '选择日期范围' : _dateRange; - - return Center( - child: Wrap( - alignment: WrapAlignment.center, - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - ElevatedButton( - onPressed: _show, - child: const Text('选择'), - ), - Text( - info, - style: const TextStyle(color: Colors.grey), - ) - ], - ), - ); - } - - void _show() async { - DateTime firstDate = DateTime(2021, 1, 1); - DateTime lastDate = DateTime.now(); - DateTime start = lastDate.add(const Duration(days: -8)); - DateTime end = lastDate.add(const Duration(days: -2)); - DateTimeRange? range = await showDateRangePicker( - context: context, - firstDate: firstDate, - lastDate: lastDate, - initialDateRange: DateTimeRange( - start: start, - end: end, - ), - saveText: "确定", - ); - if (range != null) { - setState(() { - _dateRange = - "${format.format(range.start)} ~ ${format.format(range.end)}"; - }); - } - } -} diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart b/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart deleted file mode 100644 index 1bbd1c87..00000000 --- a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'toly_date_picker.dart' as toly; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 339, -// "name": '魔改 DateRangePickerDialog', -// "priority": 2, -// "subtitle": "修改 DateRangePickerDialog 源码,使得月份条目显示数值背景。", -// } -class DiyDateRangePickerDialogDemo extends StatefulWidget { - const DiyDateRangePickerDialogDemo({Key? key}) : super(key: key); - - @override - _DiyDateRangePickerDialogDemoState createState() => - _DiyDateRangePickerDialogDemoState(); -} - -class _DiyDateRangePickerDialogDemoState - extends State { - String _dateRange = ''; - - // 需要 intl 包 - final DateFormat format = DateFormat('yyyy-MM-dd'); - - @override - Widget build(BuildContext context) { - String info = _dateRange.isEmpty ? '选择日期范围' : _dateRange; - - return Center( - child: Wrap( - alignment: WrapAlignment.center, - direction: Axis.vertical, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - ElevatedButton( - onPressed: _show, - child: const Text('选择'), - ), - Text( - info, - style: const TextStyle(color: Colors.grey), - ) - ], - ), - ); - } - - void _show() async { - DateTime firstDate = DateTime(2021, 1, 1); - DateTime lastDate = DateTime.now(); - DateTime start = lastDate.add(const Duration(days: -8)); - DateTime end = lastDate.add(const Duration(days: -2)); - DateTimeRange? range = await toly.showDateRangePicker( - context: context, - firstDate: firstDate, - lastDate: lastDate, - initialDateRange: DateTimeRange( - start: start, - end: end, - ), - saveText: "确定", - ); - if (range != null) { - setState(() { - _dateRange = - "${format.format(range.start)} ~ ${format.format(range.end)}"; - }); - } - } -} diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart b/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart deleted file mode 100644 index fd3dfd2d..00000000 --- a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart +++ /dev/null @@ -1,2910 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:math' as math; - -import 'package:flutter/gestures.dart' show DragStartBehavior; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; - -const Size _calendarPortraitDialogSize = Size(330.0, 518.0); -const Size _calendarLandscapeDialogSize = Size(496.0, 346.0); -const Size _inputPortraitDialogSize = Size(330.0, 270.0); -const Size _inputLandscapeDialogSize = Size(496, 160.0); -const Size _inputRangeLandscapeDialogSize = Size(496, 164.0); -const Duration _dialogSizeAnimationDuration = Duration(milliseconds: 200); -const double _inputFormPortraitHeight = 98.0; -const double _inputFormLandscapeHeight = 108.0; - -/// Shows a dialog containing a Material Design date picker. -/// -/// The returned [Future] resolves to the date selected by the user when the -/// user confirms the dialog. If the user cancels the dialog, null is returned. -/// -/// When the date picker is first displayed, it will show the month of -/// [initialDate], with [initialDate] selected. -/// -/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest -/// allowable date. [initialDate] must either fall between these dates, -/// or be equal to one of them. For each of these [DateTime] parameters, only -/// their dates are considered. Their time fields are ignored. They must all -/// be non-null. -/// -/// The [currentDate] represents the current day (i.e. today). This -/// date will be highlighted in the day grid. If null, the date of -/// `DateTime.now()` will be used. -/// -/// An optional [initialEntryMode] argument can be used to display the date -/// picker in the [DatePickerEntryMode.calendar] (a calendar month grid) -/// or [DatePickerEntryMode.input] (a text input field) mode. -/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. -/// -/// An optional [selectableDayPredicate] function can be passed in to only allow -/// certain days for selection. If provided, only the days that -/// [selectableDayPredicate] returns true for will be selectable. For example, -/// this can be used to only allow weekdays for selection. If provided, it must -/// return true for [initialDate]. -/// -/// The following optional string parameters allow you to override the default -/// text used for various parts of the dialog: -/// -/// * [helpText], label displayed at the top of the dialog. -/// * [cancelText], label on the cancel button. -/// * [confirmText], label on the ok button. -/// * [errorFormatText], message used when the input text isn't in a proper date format. -/// * [errorInvalidText], message used when the input text isn't a selectable date. -/// * [fieldHintText], text used to prompt the user when no text has been entered in the field. -/// * [fieldLabelText], label for the date text input field. -/// -/// An optional [locale] argument can be used to set the locale for the date -/// picker. It defaults to the ambient locale provided by [Localizations]. -/// -/// An optional [textDirection] argument can be used to set the text direction -/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It -/// defaults to the ambient text direction provided by [Directionality]. If both -/// [locale] and [textDirection] are non-null, [textDirection] overrides the -/// direction chosen for the [locale]. -/// -/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to -/// [showDialog], the documentation for which discusses how it is used. [context] -/// and [useRootNavigator] must be non-null. -/// -/// The [builder] parameter can be used to wrap the dialog widget -/// to add inherited widgets like [Theme]. -/// -/// An optional [initialDatePickerMode] argument can be used to have the -/// calendar date picker initially appear in the [DatePickerMode.year] or -/// [DatePickerMode.day] mode. It defaults to [DatePickerMode.day], and -/// must be non-null. -/// -/// {@macro flutter.widgets.RawDialogRoute} -/// -/// ### State Restoration -/// -/// Using this method will not enable state restoration for the date picker. -/// In order to enable state restoration for a date picker, use -/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with -/// [DatePickerDialog]. -/// -/// For more information about state restoration, see [RestorationManager]. -/// -/// {@macro flutter.widgets.RestorationManager} -/// -/// {@tool dartpad} -/// This sample demonstrates how to create a restorable Material date picker. -/// This is accomplished by enabling state restoration by specifying -/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to -/// push [DatePickerDialog] when the button is tapped. -/// -/// ** See code in examples/api/lib/material/date_picker/show_date_picker.0.dart ** -/// {@end-tool} -/// -/// See also: -/// -/// * [showDateRangePicker], which shows a Material Design date range picker -/// used to select a range of dates. -/// * [CalendarDatePicker], which provides the calendar grid used by the date picker dialog. -/// * [InputDatePickerFormField], which provides a text input field for entering dates. -/// * [DisplayFeatureSubScreen], which documents the specifics of how -/// [DisplayFeature]s can split the screen into sub-screens. -/// * [showTimePicker], which shows a dialog that contains a Material Design time picker. -/// -Future showDatePicker({ - required BuildContext context, - required DateTime initialDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, - SelectableDayPredicate? selectableDayPredicate, - String? helpText, - String? cancelText, - String? confirmText, - Locale? locale, - bool useRootNavigator = true, - RouteSettings? routeSettings, - TextDirection? textDirection, - TransitionBuilder? builder, - DatePickerMode initialDatePickerMode = DatePickerMode.day, - String? errorFormatText, - String? errorInvalidText, - String? fieldHintText, - String? fieldLabelText, - TextInputType? keyboardType, - Offset? anchorPoint, -}) async { - assert(context != null); - assert(initialDate != null); - assert(firstDate != null); - assert(lastDate != null); - initialDate = DateUtils.dateOnly(initialDate); - firstDate = DateUtils.dateOnly(firstDate); - lastDate = DateUtils.dateOnly(lastDate); - assert( - !lastDate.isBefore(firstDate), - 'lastDate $lastDate must be on or after firstDate $firstDate.', - ); - assert( - !initialDate.isBefore(firstDate), - 'initialDate $initialDate must be on or after firstDate $firstDate.', - ); - assert( - !initialDate.isAfter(lastDate), - 'initialDate $initialDate must be on or before lastDate $lastDate.', - ); - assert( - selectableDayPredicate == null || selectableDayPredicate(initialDate), - 'Provided initialDate $initialDate must satisfy provided selectableDayPredicate.', - ); - assert(initialEntryMode != null); - assert(useRootNavigator != null); - assert(initialDatePickerMode != null); - assert(debugCheckHasMaterialLocalizations(context)); - - Widget dialog = DatePickerDialog( - initialDate: initialDate, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - initialEntryMode: initialEntryMode, - selectableDayPredicate: selectableDayPredicate, - helpText: helpText, - cancelText: cancelText, - confirmText: confirmText, - initialCalendarMode: initialDatePickerMode, - errorFormatText: errorFormatText, - errorInvalidText: errorInvalidText, - fieldHintText: fieldHintText, - fieldLabelText: fieldLabelText, - keyboardType: keyboardType, - ); - - if (textDirection != null) { - dialog = Directionality( - textDirection: textDirection, - child: dialog, - ); - } - - if (locale != null) { - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); - } - - return showDialog( - context: context, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - builder: (BuildContext context) { - return builder == null ? dialog : builder(context, dialog); - }, - anchorPoint: anchorPoint, - ); -} - -/// A Material-style date picker dialog. -/// -/// It is used internally by [showDatePicker] or can be directly pushed -/// onto the [Navigator] stack to enable state restoration. See -/// [showDatePicker] for a state restoration app example. -/// -/// See also: -/// -/// * [showDatePicker], which is a way to display the date picker. -class DatePickerDialog extends StatefulWidget { - /// A Material-style date picker dialog. - DatePickerDialog({ - super.key, - required DateTime initialDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - this.initialEntryMode = DatePickerEntryMode.calendar, - this.selectableDayPredicate, - this.cancelText, - this.confirmText, - this.helpText, - this.initialCalendarMode = DatePickerMode.day, - this.errorFormatText, - this.errorInvalidText, - this.fieldHintText, - this.fieldLabelText, - this.keyboardType, - this.restorationId, - }) : assert(initialDate != null), - assert(firstDate != null), - assert(lastDate != null), - initialDate = DateUtils.dateOnly(initialDate), - firstDate = DateUtils.dateOnly(firstDate), - lastDate = DateUtils.dateOnly(lastDate), - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()), - assert(initialEntryMode != null), - assert(initialCalendarMode != null) { - assert( - !this.lastDate.isBefore(this.firstDate), - 'lastDate ${this.lastDate} must be on or after firstDate ${this.firstDate}.', - ); - assert( - !this.initialDate.isBefore(this.firstDate), - 'initialDate ${this.initialDate} must be on or after firstDate ${this.firstDate}.', - ); - assert( - !this.initialDate.isAfter(this.lastDate), - 'initialDate ${this.initialDate} must be on or before lastDate ${this.lastDate}.', - ); - assert( - selectableDayPredicate == null || selectableDayPredicate!(this.initialDate), - 'Provided initialDate ${this.initialDate} must satisfy provided selectableDayPredicate', - ); - } - - /// The initially selected [DateTime] that the picker should display. - final DateTime initialDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// The [DateTime] representing today. It will be highlighted in the day grid. - final DateTime currentDate; - - /// The initial mode of date entry method for the date picker dialog. - /// - /// See [DatePickerEntryMode] for more details on the different data entry - /// modes available. - final DatePickerEntryMode initialEntryMode; - - /// Function to provide full control over which [DateTime] can be selected. - final SelectableDayPredicate? selectableDayPredicate; - - /// The text that is displayed on the cancel button. - final String? cancelText; - - /// The text that is displayed on the confirm button. - final String? confirmText; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String? helpText; - - /// The initial display of the calendar picker. - final DatePickerMode initialCalendarMode; - - /// The error text displayed if the entered date is not in the correct format. - final String? errorFormatText; - - /// The error text displayed if the date is not valid. - /// - /// A date is not valid if it is earlier than [firstDate], later than - /// [lastDate], or doesn't pass the [selectableDayPredicate]. - final String? errorInvalidText; - - /// The hint text displayed in the [TextField]. - /// - /// If this is null, it will default to the date format string. For example, - /// 'mm/dd/yyyy' for en_US. - final String? fieldHintText; - - /// The label text displayed in the [TextField]. - /// - /// If this is null, it will default to the words representing the date format - /// string. For example, 'Month, Day, Year' for en_US. - final String? fieldLabelText; - - /// The keyboard type of the [TextField]. - /// - /// If this is null, it will default to [TextInputType.datetime] - final TextInputType? keyboardType; - - /// Restoration ID to save and restore the state of the [DatePickerDialog]. - /// - /// If it is non-null, the date picker will persist and restore the - /// date selected on the dialog. - /// - /// The state of this widget is persisted in a [RestorationBucket] claimed - /// from the surrounding [RestorationScope] using the provided restoration ID. - /// - /// See also: - /// - /// * [RestorationManager], which explains how state restoration works in - /// Flutter. - final String? restorationId; - - @override - State createState() => _DatePickerDialogState(); -} - -class _DatePickerDialogState extends State with RestorationMixin { - late final RestorableDateTime _selectedDate = RestorableDateTime(widget.initialDate); - late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); - final _RestorableAutovalidateMode _autovalidateMode = _RestorableAutovalidateMode(AutovalidateMode.disabled); - - @override - String? get restorationId => widget.restorationId; - - @override - void restoreState(RestorationBucket? oldBucket, bool initialRestore) { - registerForRestoration(_selectedDate, 'selected_date'); - registerForRestoration(_autovalidateMode, 'autovalidateMode'); - registerForRestoration(_entryMode, 'calendar_entry_mode'); - } - - final GlobalKey _calendarPickerKey = GlobalKey(); - final GlobalKey _formKey = GlobalKey(); - - void _handleOk() { - if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { - final FormState form = _formKey.currentState!; - if (!form.validate()) { - setState(() => _autovalidateMode.value = AutovalidateMode.always); - return; - } - form.save(); - } - Navigator.pop(context, _selectedDate.value); - } - - void _handleCancel() { - Navigator.pop(context); - } - - void _handleEntryModeToggle() { - setState(() { - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - _autovalidateMode.value = AutovalidateMode.disabled; - _entryMode.value = DatePickerEntryMode.input; - break; - case DatePickerEntryMode.input: - _formKey.currentState!.save(); - _entryMode.value = DatePickerEntryMode.calendar; - break; - case DatePickerEntryMode.calendarOnly: - case DatePickerEntryMode.inputOnly: - assert(false, 'Can not change entry mode from _entryMode'); - break; - } - }); - } - - void _handleDateChanged(DateTime date) { - setState(() { - _selectedDate.value = date; - }); - } - - Size _dialogSize(BuildContext context) { - final Orientation orientation = MediaQuery.of(context).orientation; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - case DatePickerEntryMode.calendarOnly: - switch (orientation) { - case Orientation.portrait: - return _calendarPortraitDialogSize; - case Orientation.landscape: - return _calendarLandscapeDialogSize; - } - case DatePickerEntryMode.input: - case DatePickerEntryMode.inputOnly: - switch (orientation) { - case Orientation.portrait: - return _inputPortraitDialogSize; - case Orientation.landscape: - return _inputLandscapeDialogSize; - } - } - } - - static const Map _formShortcutMap = { - // Pressing enter on the field will move focus to the next field or control. - SingleActivator(LogicalKeyboardKey.enter): NextFocusIntent(), - }; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - // Constrain the textScaleFactor to the largest supported value to prevent - // layout issues. - final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.3); - - final String dateText = localizations.formatMediumDate(_selectedDate.value); - final Color onPrimarySurface = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.copyWith(color: onPrimarySurface) - : textTheme.headline4?.copyWith(color: onPrimarySurface); - - final Widget actions = Container( - alignment: AlignmentDirectional.centerEnd, - constraints: const BoxConstraints(minHeight: 52.0), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: OverflowBar( - spacing: 8, - children: [ - TextButton( - onPressed: _handleCancel, - child: Text(widget.cancelText ?? localizations.cancelButtonLabel), - ), - TextButton( - onPressed: _handleOk, - child: Text(widget.confirmText ?? localizations.okButtonLabel), - ), - ], - ), - ); - - CalendarDatePicker calendarDatePicker() { - return CalendarDatePicker( - key: _calendarPickerKey, - initialDate: _selectedDate.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - currentDate: widget.currentDate, - onDateChanged: _handleDateChanged, - selectableDayPredicate: widget.selectableDayPredicate, - initialCalendarMode: widget.initialCalendarMode, - ); - } - - Form inputDatePicker() { - return Form( - key: _formKey, - autovalidateMode: _autovalidateMode.value, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 24), - height: orientation == Orientation.portrait ? _inputFormPortraitHeight : _inputFormLandscapeHeight, - child: Shortcuts( - shortcuts: _formShortcutMap, - child: Column( - children: [ - const Spacer(), - InputDatePickerFormField( - initialDate: _selectedDate.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - onDateSubmitted: _handleDateChanged, - onDateSaved: _handleDateChanged, - selectableDayPredicate: widget.selectableDayPredicate, - errorFormatText: widget.errorFormatText, - errorInvalidText: widget.errorInvalidText, - fieldHintText: widget.fieldHintText, - fieldLabelText: widget.fieldLabelText, - keyboardType: widget.keyboardType, - autofocus: true, - ), - const Spacer(), - ], - ), - ), - ), - ); - } - - final Widget picker; - final Widget? entryModeButton; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - picker = calendarDatePicker(); - entryModeButton = IconButton( - icon: const Icon(Icons.edit), - color: onPrimarySurface, - tooltip: localizations.inputDateModeButtonLabel, - onPressed: _handleEntryModeToggle, - ); - break; - - case DatePickerEntryMode.calendarOnly: - picker = calendarDatePicker(); - entryModeButton = null; - break; - - case DatePickerEntryMode.input: - picker = inputDatePicker(); - entryModeButton = IconButton( - icon: const Icon(Icons.calendar_today), - color: onPrimarySurface, - tooltip: localizations.calendarModeButtonLabel, - onPressed: _handleEntryModeToggle, - ); - break; - - case DatePickerEntryMode.inputOnly: - picker = inputDatePicker(); - entryModeButton = null; - break; - } - - final Widget header = _DatePickerHeader( - helpText: widget.helpText ?? localizations.datePickerHelpText, - titleText: dateText, - titleStyle: dateStyle, - orientation: orientation, - isShort: orientation == Orientation.landscape, - entryModeButton: entryModeButton, - ); - - final Size dialogSize = _dialogSize(context) * textScaleFactor; - return Dialog( - insetPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0), - clipBehavior: Clip.antiAlias, - child: AnimatedContainer( - width: dialogSize.width, - height: dialogSize.height, - duration: _dialogSizeAnimationDuration, - curve: Curves.easeIn, - child: MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaleFactor: textScaleFactor, - ), - child: Builder(builder: (BuildContext context) { - switch (orientation) { - case Orientation.portrait: - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Expanded(child: picker), - actions, - ], - ); - case Orientation.landscape: - return Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Flexible( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(child: picker), - actions, - ], - ), - ), - ], - ); - } - }), - ), - ), - ); - } -} - -// A restorable [DatePickerEntryMode] value. -// -// This serializes each entry as a unique `int` value. -class _RestorableDatePickerEntryMode extends RestorableValue { - _RestorableDatePickerEntryMode( - DatePickerEntryMode defaultValue, - ) : _defaultValue = defaultValue; - - final DatePickerEntryMode _defaultValue; - - @override - DatePickerEntryMode createDefaultValue() => _defaultValue; - - @override - void didUpdateValue(DatePickerEntryMode? oldValue) { - assert(debugIsSerializableForRestoration(value.index)); - notifyListeners(); - } - - @override - DatePickerEntryMode fromPrimitives(Object? data) => DatePickerEntryMode.values[data! as int]; - - @override - Object? toPrimitives() => value.index; -} - -// A restorable [AutovalidateMode] value. -// -// This serializes each entry as a unique `int` value. -class _RestorableAutovalidateMode extends RestorableValue { - _RestorableAutovalidateMode( - AutovalidateMode defaultValue, - ) : _defaultValue = defaultValue; - - final AutovalidateMode _defaultValue; - - @override - AutovalidateMode createDefaultValue() => _defaultValue; - - @override - void didUpdateValue(AutovalidateMode? oldValue) { - assert(debugIsSerializableForRestoration(value.index)); - notifyListeners(); - } - - @override - AutovalidateMode fromPrimitives(Object? data) => AutovalidateMode.values[data! as int]; - - @override - Object? toPrimitives() => value.index; -} - -/// Re-usable widget that displays the selected date (in large font) and the -/// help text above it. -/// -/// These types include: -/// -/// * Single Date picker with calendar mode. -/// * Single Date picker with text input mode. -/// * Date Range picker with text input mode. -/// -/// [helpText], [orientation], [icon], [onIconPressed] are required and must be -/// non-null. -class _DatePickerHeader extends StatelessWidget { - - /// Creates a header for use in a date picker dialog. - const _DatePickerHeader({ - required this.helpText, - required this.titleText, - this.titleSemanticsLabel, - required this.titleStyle, - required this.orientation, - this.isShort = false, - this.entryModeButton, - }) : assert(helpText != null), - assert(orientation != null), - assert(isShort != null); - - static const double _datePickerHeaderLandscapeWidth = 152.0; - static const double _datePickerHeaderPortraitHeight = 120.0; - static const double _headerPaddingLandscape = 16.0; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String helpText; - - /// The text that is displayed at the center of the header. - final String titleText; - - /// The semantic label associated with the [titleText]. - final String? titleSemanticsLabel; - - /// The [TextStyle] that the title text is displayed with. - final TextStyle? titleStyle; - - /// The orientation is used to decide how to layout its children. - final Orientation orientation; - - /// Indicates the header is being displayed in a shorter/narrower context. - /// - /// This will be used to tighten up the space between the help text and date - /// text if `true`. Additionally, it will use a smaller typography style if - /// `true`. - /// - /// This is necessary for displaying the manual input mode in - /// landscape orientation, in order to account for the keyboard height. - final bool isShort; - - final Widget? entryModeButton; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final TextTheme textTheme = theme.textTheme; - - // The header should use the primary color in light themes and surface color in dark - final bool isDark = colorScheme.brightness == Brightness.dark; - final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; - final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; - - final TextStyle? helpStyle = textTheme.overline?.copyWith( - color: onPrimarySurfaceColor, - ); - - final Text help = Text( - helpText, - style: helpStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ); - final Text title = Text( - titleText, - semanticsLabel: titleSemanticsLabel ?? titleText, - style: titleStyle, - maxLines: orientation == Orientation.portrait ? 1 : 2, - overflow: TextOverflow.ellipsis, - ); - - switch (orientation) { - case Orientation.portrait: - return SizedBox( - height: _datePickerHeaderPortraitHeight, - child: Material( - color: primarySurfaceColor, - child: Padding( - padding: const EdgeInsetsDirectional.only( - start: 24, - end: 12, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 16), - help, - const Flexible(child: SizedBox(height: 38)), - Row( - children: [ - Expanded(child: title), - if (entryModeButton != null) - entryModeButton!, - ], - ), - ], - ), - ), - ), - ); - case Orientation.landscape: - return SizedBox( - width: _datePickerHeaderLandscapeWidth, - child: Material( - color: primarySurfaceColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 16), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: _headerPaddingLandscape, - ), - child: help, - ), - SizedBox(height: isShort ? 16 : 56), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: _headerPaddingLandscape, - ), - child: title, - ), - ), - if (entryModeButton != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: entryModeButton, - ), - ], - ), - ), - ); - } - } -} - -/// Shows a full screen modal dialog containing a Material Design date range -/// picker. -/// -/// The returned [Future] resolves to the [DateTimeRange] selected by the user -/// when the user saves their selection. If the user cancels the dialog, null is -/// returned. -/// -/// If [initialDateRange] is non-null, then it will be used as the initially -/// selected date range. If it is provided, `initialDateRange.start` must be -/// before or on `initialDateRange.end`. -/// -/// The [firstDate] is the earliest allowable date. The [lastDate] is the latest -/// allowable date. Both must be non-null. -/// -/// If an initial date range is provided, `initialDateRange.start` -/// and `initialDateRange.end` must both fall between or on [firstDate] and -/// [lastDate]. For all of these [DateTime] values, only their dates are -/// considered. Their time fields are ignored. -/// -/// The [currentDate] represents the current day (i.e. today). This -/// date will be highlighted in the day grid. If null, the date of -/// `DateTime.now()` will be used. -/// -/// An optional [initialEntryMode] argument can be used to display the date -/// picker in the [DatePickerEntryMode.calendar] (a scrollable calendar month -/// grid) or [DatePickerEntryMode.input] (two text input fields) mode. -/// It defaults to [DatePickerEntryMode.calendar] and must be non-null. -/// -/// The following optional string parameters allow you to override the default -/// text used for various parts of the dialog: -/// -/// * [helpText], the label displayed at the top of the dialog. -/// * [cancelText], the label on the cancel button for the text input mode. -/// * [confirmText],the label on the ok button for the text input mode. -/// * [saveText], the label on the save button for the fullscreen calendar -/// mode. -/// * [errorFormatText], the message used when an input text isn't in a proper -/// date format. -/// * [errorInvalidText], the message used when an input text isn't a -/// selectable date. -/// * [errorInvalidRangeText], the message used when the date range is -/// invalid (e.g. start date is after end date). -/// * [fieldStartHintText], the text used to prompt the user when no text has -/// been entered in the start field. -/// * [fieldEndHintText], the text used to prompt the user when no text has -/// been entered in the end field. -/// * [fieldStartLabelText], the label for the start date text input field. -/// * [fieldEndLabelText], the label for the end date text input field. -/// -/// An optional [locale] argument can be used to set the locale for the date -/// picker. It defaults to the ambient locale provided by [Localizations]. -/// -/// An optional [textDirection] argument can be used to set the text direction -/// ([TextDirection.ltr] or [TextDirection.rtl]) for the date picker. It -/// defaults to the ambient text direction provided by [Directionality]. If both -/// [locale] and [textDirection] are non-null, [textDirection] overrides the -/// direction chosen for the [locale]. -/// -/// The [context], [useRootNavigator] and [routeSettings] arguments are passed -/// to [showDialog], the documentation for which discusses how it is used. -/// [context] and [useRootNavigator] must be non-null. -/// -/// The [builder] parameter can be used to wrap the dialog widget -/// to add inherited widgets like [Theme]. -/// -/// {@macro flutter.widgets.RawDialogRoute} -/// -/// ### State Restoration -/// -/// Using this method will not enable state restoration for the date range picker. -/// In order to enable state restoration for a date range picker, use -/// [Navigator.restorablePush] or [Navigator.restorablePushNamed] with -/// [DateRangePickerDialog]. -/// -/// For more information about state restoration, see [RestorationManager]. -/// -/// {@macro flutter.widgets.RestorationManager} -/// -/// {@tool sample} -/// This sample demonstrates how to create a restorable Material date range picker. -/// This is accomplished by enabling state restoration by specifying -/// [MaterialApp.restorationScopeId] and using [Navigator.restorablePush] to -/// push [DateRangePickerDialog] when the button is tapped. -/// -/// ** See code in examples/api/lib/material/date_picker/show_date_range_picker.0.dart ** -/// {@end-tool} -/// -/// See also: -/// -/// * [showDatePicker], which shows a Material Design date picker used to -/// select a single date. -/// * [DateTimeRange], which is used to describe a date range. -/// * [DisplayFeatureSubScreen], which documents the specifics of how -/// [DisplayFeature]s can split the screen into sub-screens. -Future showDateRangePicker({ - required BuildContext context, - DateTimeRange? initialDateRange, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, - String? helpText, - String? cancelText, - String? confirmText, - String? saveText, - String? errorFormatText, - String? errorInvalidText, - String? errorInvalidRangeText, - String? fieldStartHintText, - String? fieldEndHintText, - String? fieldStartLabelText, - String? fieldEndLabelText, - Locale? locale, - bool useRootNavigator = true, - RouteSettings? routeSettings, - TextDirection? textDirection, - TransitionBuilder? builder, - Offset? anchorPoint, -}) async { - assert(context != null); - assert( - initialDateRange == null || (initialDateRange.start != null && initialDateRange.end != null), - 'initialDateRange must be null or have non-null start and end dates.', - ); - assert( - initialDateRange == null || !initialDateRange.start.isAfter(initialDateRange.end), - "initialDateRange's start date must not be after it's end date.", - ); - initialDateRange = initialDateRange == null ? null : DateUtils.datesOnly(initialDateRange); - assert(firstDate != null); - firstDate = DateUtils.dateOnly(firstDate); - assert(lastDate != null); - lastDate = DateUtils.dateOnly(lastDate); - assert( - !lastDate.isBefore(firstDate), - 'lastDate $lastDate must be on or after firstDate $firstDate.', - ); - assert( - initialDateRange == null || !initialDateRange.start.isBefore(firstDate), - "initialDateRange's start date must be on or after firstDate $firstDate.", - ); - assert( - initialDateRange == null || !initialDateRange.end.isBefore(firstDate), - "initialDateRange's end date must be on or after firstDate $firstDate.", - ); - assert( - initialDateRange == null || !initialDateRange.start.isAfter(lastDate), - "initialDateRange's start date must be on or before lastDate $lastDate.", - ); - assert( - initialDateRange == null || !initialDateRange.end.isAfter(lastDate), - "initialDateRange's end date must be on or before lastDate $lastDate.", - ); - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()); - assert(initialEntryMode != null); - assert(useRootNavigator != null); - assert(debugCheckHasMaterialLocalizations(context)); - - Widget dialog = DateRangePickerDialog( - initialDateRange: initialDateRange, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - initialEntryMode: initialEntryMode, - helpText: helpText, - cancelText: cancelText, - confirmText: confirmText, - saveText: saveText, - errorFormatText: errorFormatText, - errorInvalidText: errorInvalidText, - errorInvalidRangeText: errorInvalidRangeText, - fieldStartHintText: fieldStartHintText, - fieldEndHintText: fieldEndHintText, - fieldStartLabelText: fieldStartLabelText, - fieldEndLabelText: fieldEndLabelText, - ); - - if (textDirection != null) { - dialog = Directionality( - textDirection: textDirection, - child: dialog, - ); - } - - if (locale != null) { - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); - } - - return showDialog( - context: context, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - useSafeArea: false, - builder: (BuildContext context) { - return builder == null ? dialog : builder(context, dialog); - }, - anchorPoint: anchorPoint, - ); -} - -/// Returns a locale-appropriate string to describe the start of a date range. -/// -/// If `startDate` is null, then it defaults to 'Start Date', otherwise if it -/// is in the same year as the `endDate` then it will use the short month -/// day format (i.e. 'Jan 21'). Otherwise it will return the short date format -/// (i.e. 'Jan 21, 2020'). -String _formatRangeStartDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate) { - return startDate == null - ? localizations.dateRangeStartLabel - : (endDate == null || startDate.year == endDate.year) - ? localizations.formatShortMonthDay(startDate) - : localizations.formatShortDate(startDate); -} - -/// Returns an locale-appropriate string to describe the end of a date range. -/// -/// If `endDate` is null, then it defaults to 'End Date', otherwise if it -/// is in the same year as the `startDate` and the `currentDate` then it will -/// just use the short month day format (i.e. 'Jan 21'), otherwise it will -/// include the year (i.e. 'Jan 21, 2020'). -String _formatRangeEndDate(MaterialLocalizations localizations, DateTime? startDate, DateTime? endDate, DateTime currentDate) { - return endDate == null - ? localizations.dateRangeEndLabel - : (startDate != null && startDate.year == endDate.year && startDate.year == currentDate.year) - ? localizations.formatShortMonthDay(endDate) - : localizations.formatShortDate(endDate); -} - -/// A Material-style date range picker dialog. -/// -/// It is used internally by [showDateRangePicker] or can be directly pushed -/// onto the [Navigator] stack to enable state restoration. See -/// [showDateRangePicker] for a state restoration app example. -/// -/// See also: -/// -/// * [showDateRangePicker], which is a way to display the date picker. -class DateRangePickerDialog extends StatefulWidget { - /// A Material-style date range picker dialog. - const DateRangePickerDialog({ - super.key, - this.initialDateRange, - required this.firstDate, - required this.lastDate, - this.currentDate, - this.initialEntryMode = DatePickerEntryMode.calendar, - this.helpText, - this.cancelText, - this.confirmText, - this.saveText, - this.errorInvalidRangeText, - this.errorFormatText, - this.errorInvalidText, - this.fieldStartHintText, - this.fieldEndHintText, - this.fieldStartLabelText, - this.fieldEndLabelText, - this.restorationId, - }); - - /// The date range that the date range picker starts with when it opens. - /// - /// If an initial date range is provided, `initialDateRange.start` - /// and `initialDateRange.end` must both fall between or on [firstDate] and - /// [lastDate]. For all of these [DateTime] values, only their dates are - /// considered. Their time fields are ignored. - /// - /// If [initialDateRange] is non-null, then it will be used as the initially - /// selected date range. If it is provided, `initialDateRange.start` must be - /// before or on `initialDateRange.end`. - final DateTimeRange? initialDateRange; - - /// The earliest allowable date on the date range. - final DateTime firstDate; - - /// The latest allowable date on the date range. - final DateTime lastDate; - - /// The [currentDate] represents the current day (i.e. today). - /// - /// This date will be highlighted in the day grid. - /// - /// If `null`, the date of `DateTime.now()` will be used. - final DateTime? currentDate; - - /// The initial date range picker entry mode. - /// - /// The date range has two main modes: [DatePickerEntryMode.calendar] (a - /// scrollable calendar month grid) or [DatePickerEntryMode.input] (two text - /// input fields) mode. - /// - /// It defaults to [DatePickerEntryMode.calendar] and must be non-null. - final DatePickerEntryMode initialEntryMode; - - /// The label on the cancel button for the text input mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.cancelButtonLabel] is used. - final String? cancelText; - - /// The label on the "OK" button for the text input mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.okButtonLabel] is used. - final String? confirmText; - - /// The label on the save button for the fullscreen calendar mode. - /// - /// If null, the localized value of - /// [MaterialLocalizations.saveButtonLabel] is used. - final String? saveText; - - /// The label displayed at the top of the dialog. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateRangePickerHelpText] is used. - final String? helpText; - - /// The message used when the date range is invalid (e.g. start date is after - /// end date). - /// - /// If null, the localized value of - /// [MaterialLocalizations.invalidDateRangeLabel] is used. - final String? errorInvalidRangeText; - - /// The message used when an input text isn't in a proper date format. - /// - /// If null, the localized value of - /// [MaterialLocalizations.invalidDateFormatLabel] is used. - final String? errorFormatText; - - /// The message used when an input text isn't a selectable date. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateOutOfRangeLabel] is used. - final String? errorInvalidText; - - /// The text used to prompt the user when no text has been entered in the - /// start field. - /// - /// If null, the localized value of - /// [MaterialLocalizations.dateHelpText] is used. - final String? fieldStartHintText; - - /// The text used to prompt the user when no text has been entered in the - /// end field. - /// - /// If null, the localized value of [MaterialLocalizations.dateHelpText] is - /// used. - final String? fieldEndHintText; - - /// The label for the start date text input field. - /// - /// If null, the localized value of [MaterialLocalizations.dateRangeStartLabel] - /// is used. - final String? fieldStartLabelText; - - /// The label for the end date text input field. - /// - /// If null, the localized value of [MaterialLocalizations.dateRangeEndLabel] - /// is used. - final String? fieldEndLabelText; - - /// Restoration ID to save and restore the state of the [DateRangePickerDialog]. - /// - /// If it is non-null, the date range picker will persist and restore the - /// date range selected on the dialog. - /// - /// The state of this widget is persisted in a [RestorationBucket] claimed - /// from the surrounding [RestorationScope] using the provided restoration ID. - /// - /// See also: - /// - /// * [RestorationManager], which explains how state restoration works in - /// Flutter. - final String? restorationId; - - @override - State createState() => _DateRangePickerDialogState(); -} - -class _DateRangePickerDialogState extends State with RestorationMixin { - late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode); - late final RestorableDateTimeN _selectedStart = RestorableDateTimeN(widget.initialDateRange?.start); - late final RestorableDateTimeN _selectedEnd = RestorableDateTimeN(widget.initialDateRange?.end); - final RestorableBool _autoValidate = RestorableBool(false); - final GlobalKey _calendarPickerKey = GlobalKey(); - final GlobalKey<_InputDateRangePickerState> _inputPickerKey = GlobalKey<_InputDateRangePickerState>(); - - @override - String? get restorationId => widget.restorationId; - - @override - void restoreState(RestorationBucket? oldBucket, bool initialRestore) { - registerForRestoration(_entryMode, 'entry_mode'); - registerForRestoration(_selectedStart, 'selected_start'); - registerForRestoration(_selectedEnd, 'selected_end'); - registerForRestoration(_autoValidate, 'autovalidate'); - } - - void _handleOk() { - if (_entryMode.value == DatePickerEntryMode.input || _entryMode.value == DatePickerEntryMode.inputOnly) { - final _InputDateRangePickerState picker = _inputPickerKey.currentState!; - if (!picker.validate()) { - setState(() { - _autoValidate.value = true; - }); - return; - } - } - final DateTimeRange? selectedRange = _hasSelectedDateRange - ? DateTimeRange(start: _selectedStart.value!, end: _selectedEnd.value!) - : null; - - Navigator.pop(context, selectedRange); - } - - void _handleCancel() { - Navigator.pop(context); - } - - void _handleEntryModeToggle() { - setState(() { - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - _autoValidate.value = false; - _entryMode.value = DatePickerEntryMode.input; - break; - - case DatePickerEntryMode.input: - // Validate the range dates - if (_selectedStart.value != null && - (_selectedStart.value!.isBefore(widget.firstDate) || _selectedStart.value!.isAfter(widget.lastDate))) { - _selectedStart.value = null; - // With no valid start date, having an end date makes no sense for the UI. - _selectedEnd.value = null; - } - if (_selectedEnd.value != null && - (_selectedEnd.value!.isBefore(widget.firstDate) || _selectedEnd.value!.isAfter(widget.lastDate))) { - _selectedEnd.value = null; - } - // If invalid range (start after end), then just use the start date - if (_selectedStart.value != null && _selectedEnd.value != null && _selectedStart.value!.isAfter(_selectedEnd.value!)) { - _selectedEnd.value = null; - } - _entryMode.value = DatePickerEntryMode.calendar; - break; - - case DatePickerEntryMode.calendarOnly: - case DatePickerEntryMode.inputOnly: - assert(false, 'Can not change entry mode from $_entryMode'); - break; - } - }); - } - - void _handleStartDateChanged(DateTime? date) { - setState(() => _selectedStart.value = date); - } - - void _handleEndDateChanged(DateTime? date) { - setState(() => _selectedEnd.value = date); - } - - bool get _hasSelectedDateRange => _selectedStart.value != null && _selectedEnd.value != null; - - @override - Widget build(BuildContext context) { - final MediaQueryData mediaQuery = MediaQuery.of(context); - final Orientation orientation = mediaQuery.orientation; - final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final ColorScheme colors = Theme.of(context).colorScheme; - final Color onPrimarySurface = colors.brightness == Brightness.light - ? colors.onPrimary - : colors.onSurface; - - final Widget contents; - final Size size; - ShapeBorder? shape; - final double elevation; - final EdgeInsets insetPadding; - final bool showEntryModeButton = - _entryMode.value == DatePickerEntryMode.calendar || - _entryMode.value == DatePickerEntryMode.input; - switch (_entryMode.value) { - case DatePickerEntryMode.calendar: - case DatePickerEntryMode.calendarOnly: - contents = _CalendarRangePickerDialog( - key: _calendarPickerKey, - selectedStartDate: _selectedStart.value, - selectedEndDate: _selectedEnd.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - currentDate: widget.currentDate, - onStartDateChanged: _handleStartDateChanged, - onEndDateChanged: _handleEndDateChanged, - onConfirm: _hasSelectedDateRange ? _handleOk : null, - onCancel: _handleCancel, - entryModeButton: showEntryModeButton - ? IconButton( - icon: const Icon(Icons.edit), - padding: EdgeInsets.zero, - color: onPrimarySurface, - tooltip: localizations.inputDateModeButtonLabel, - onPressed: _handleEntryModeToggle, - ) - : null, - confirmText: widget.saveText ?? localizations.saveButtonLabel, - helpText: widget.helpText ?? localizations.dateRangePickerHelpText, - ); - size = mediaQuery.size; - insetPadding = EdgeInsets.zero; - shape = const RoundedRectangleBorder(); - elevation = 0; - break; - - case DatePickerEntryMode.input: - case DatePickerEntryMode.inputOnly: - contents = _InputDateRangePickerDialog( - selectedStartDate: _selectedStart.value, - selectedEndDate: _selectedEnd.value, - currentDate: widget.currentDate, - picker: Container( - padding: const EdgeInsets.symmetric(horizontal: 24), - height: orientation == Orientation.portrait - ? _inputFormPortraitHeight - : _inputFormLandscapeHeight, - child: Column( - children: [ - const Spacer(), - _InputDateRangePicker( - key: _inputPickerKey, - initialStartDate: _selectedStart.value, - initialEndDate: _selectedEnd.value, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - onStartDateChanged: _handleStartDateChanged, - onEndDateChanged: _handleEndDateChanged, - autofocus: true, - autovalidate: _autoValidate.value, - helpText: widget.helpText, - errorInvalidRangeText: widget.errorInvalidRangeText, - errorFormatText: widget.errorFormatText, - errorInvalidText: widget.errorInvalidText, - fieldStartHintText: widget.fieldStartHintText, - fieldEndHintText: widget.fieldEndHintText, - fieldStartLabelText: widget.fieldStartLabelText, - fieldEndLabelText: widget.fieldEndLabelText, - ), - const Spacer(), - ], - ), - ), - onConfirm: _handleOk, - onCancel: _handleCancel, - entryModeButton: showEntryModeButton - ? IconButton( - icon: const Icon(Icons.calendar_today), - padding: EdgeInsets.zero, - color: onPrimarySurface, - tooltip: localizations.calendarModeButtonLabel, - onPressed: _handleEntryModeToggle, - ) - : null, - confirmText: widget.confirmText ?? localizations.okButtonLabel, - cancelText: widget.cancelText ?? localizations.cancelButtonLabel, - helpText: widget.helpText ?? localizations.dateRangePickerHelpText, - ); - final DialogTheme dialogTheme = Theme.of(context).dialogTheme; - size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; - insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); - shape = dialogTheme.shape; - elevation = dialogTheme.elevation ?? 24; - break; - } - - return Dialog( - insetPadding: insetPadding, - shape: shape, - elevation: elevation, - clipBehavior: Clip.antiAlias, - child: AnimatedContainer( - width: size.width, - height: size.height, - duration: _dialogSizeAnimationDuration, - curve: Curves.easeIn, - child: MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaleFactor: textScaleFactor, - ), - child: Builder(builder: (BuildContext context) { - return contents; - }), - ), - ), - ); - } -} - -class _CalendarRangePickerDialog extends StatelessWidget { - const _CalendarRangePickerDialog({ - super.key, - required this.selectedStartDate, - required this.selectedEndDate, - required this.firstDate, - required this.lastDate, - required this.currentDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - required this.onConfirm, - required this.onCancel, - required this.confirmText, - required this.helpText, - this.entryModeButton, - }); - - final DateTime? selectedStartDate; - final DateTime? selectedEndDate; - final DateTime firstDate; - final DateTime lastDate; - final DateTime? currentDate; - final ValueChanged onStartDateChanged; - final ValueChanged onEndDateChanged; - final VoidCallback? onConfirm; - final VoidCallback? onCancel; - final String confirmText; - final String helpText; - final Widget? entryModeButton; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - final Color headerForeground = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final Color headerDisabledForeground = headerForeground.withOpacity(0.38); - final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); - final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); - final TextStyle? headlineStyle = textTheme.headline5; - final TextStyle? startDateStyle = headlineStyle?.apply( - color: selectedStartDate != null ? headerForeground : headerDisabledForeground, - ); - final TextStyle? endDateStyle = headlineStyle?.apply( - color: selectedEndDate != null ? headerForeground : headerDisabledForeground, - ); - final TextStyle saveButtonStyle = textTheme.button!.apply( - color: onConfirm != null ? headerForeground : headerDisabledForeground, - ); - - return SafeArea( - top: false, - left: false, - right: false, - child: Scaffold( - appBar: AppBar( - leading: CloseButton( - onPressed: onCancel, - ), - actions: [ - if (orientation == Orientation.landscape && entryModeButton != null) - entryModeButton!, - TextButton( - onPressed: onConfirm, - child: Text(confirmText, style: saveButtonStyle), - ), - const SizedBox(width: 8), - ], - bottom: PreferredSize( - preferredSize: const Size(double.infinity, 64), - child: Row(children: [ - SizedBox(width: MediaQuery.of(context).size.width < 360 ? 42 : 72), - Expanded( - child: Semantics( - label: '$helpText $startDateText to $endDateText', - excludeSemantics: true, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - helpText, - style: textTheme.overline!.apply( - color: headerForeground, - ), - ), - const SizedBox(height: 8), - Row( - children: [ - Text( - startDateText, - style: startDateStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text(' – ', style: startDateStyle, - ), - Flexible( - child: Text( - endDateText, - style: endDateStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - const SizedBox(height: 16), - ], - ), - ), - ), - if (orientation == Orientation.portrait && entryModeButton != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: entryModeButton, - ), - ]), - ), - ), - body: _CalendarDateRangePicker( - initialStartDate: selectedStartDate, - initialEndDate: selectedEndDate, - firstDate: firstDate, - lastDate: lastDate, - currentDate: currentDate, - onStartDateChanged: onStartDateChanged, - onEndDateChanged: onEndDateChanged, - ), - ), - ); - } -} - -const Duration _monthScrollDuration = Duration(milliseconds: 200); - -const double _monthItemHeaderHeight = 58.0; -const double _monthItemFooterHeight = 12.0; -const double _monthItemRowHeight = 42.0; -const double _monthItemSpaceBetweenRows = 8.0; -const double _horizontalPadding = 8.0; -const double _maxCalendarWidthLandscape = 384.0; -const double _maxCalendarWidthPortrait = 480.0; - -/// Displays a scrollable calendar grid that allows a user to select a range -/// of dates. -class _CalendarDateRangePicker extends StatefulWidget { - /// Creates a scrollable calendar grid for picking date ranges. - _CalendarDateRangePicker({ - DateTime? initialStartDate, - DateTime? initialEndDate, - required DateTime firstDate, - required DateTime lastDate, - DateTime? currentDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - }) : initialStartDate = initialStartDate != null ? DateUtils.dateOnly(initialStartDate) : null, - initialEndDate = initialEndDate != null ? DateUtils.dateOnly(initialEndDate) : null, - assert(firstDate != null), - assert(lastDate != null), - firstDate = DateUtils.dateOnly(firstDate), - lastDate = DateUtils.dateOnly(lastDate), - currentDate = DateUtils.dateOnly(currentDate ?? DateTime.now()) { - assert( - this.initialStartDate == null || this.initialEndDate == null || !this.initialStartDate!.isAfter(initialEndDate!), - 'initialStartDate must be on or before initialEndDate.', - ); - assert( - !this.lastDate.isBefore(this.firstDate), - 'firstDate must be on or before lastDate.', - ); - } - - /// The [DateTime] that represents the start of the initial date range selection. - final DateTime? initialStartDate; - - /// The [DateTime] that represents the end of the initial date range selection. - final DateTime? initialEndDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// The [DateTime] representing today. It will be highlighted in the day grid. - final DateTime currentDate; - - /// Called when the user changes the start date of the selected range. - final ValueChanged? onStartDateChanged; - - /// Called when the user changes the end date of the selected range. - final ValueChanged? onEndDateChanged; - - @override - _CalendarDateRangePickerState createState() => _CalendarDateRangePickerState(); -} - -class _CalendarDateRangePickerState extends State<_CalendarDateRangePicker> { - final GlobalKey _scrollViewKey = GlobalKey(); - DateTime? _startDate; - DateTime? _endDate; - int _initialMonthIndex = 0; - late ScrollController _controller; - late bool _showWeekBottomDivider; - - @override - void initState() { - super.initState(); - _controller = ScrollController(); - _controller.addListener(_scrollListener); - - _startDate = widget.initialStartDate; - _endDate = widget.initialEndDate; - - // Calculate the index for the initially displayed month. This is needed to - // divide the list of months into two `SliverList`s. - final DateTime initialDate = widget.initialStartDate ?? widget.currentDate; - if (!initialDate.isBefore(widget.firstDate) && - !initialDate.isAfter(widget.lastDate)) { - _initialMonthIndex = DateUtils.monthDelta(widget.firstDate, initialDate); - } - - _showWeekBottomDivider = _initialMonthIndex != 0; - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - void _scrollListener() { - if (_controller.offset <= _controller.position.minScrollExtent) { - setState(() { - _showWeekBottomDivider = false; - }); - } else if (!_showWeekBottomDivider) { - setState(() { - _showWeekBottomDivider = true; - }); - } - } - - int get _numberOfMonths => DateUtils.monthDelta(widget.firstDate, widget.lastDate) + 1; - - void _vibrate() { - switch (Theme.of(context).platform) { - case TargetPlatform.android: - case TargetPlatform.fuchsia: - HapticFeedback.vibrate(); - break; - case TargetPlatform.iOS: - case TargetPlatform.linux: - case TargetPlatform.macOS: - case TargetPlatform.windows: - break; - } - } - - // This updates the selected date range using this logic: - // - // * From the unselected state, selecting one date creates the start date. - // * If the next selection is before the start date, reset date range and - // set the start date to that selection. - // * If the next selection is on or after the start date, set the end date - // to that selection. - // * After both start and end dates are selected, any subsequent selection - // resets the date range and sets start date to that selection. - void _updateSelection(DateTime date) { - _vibrate(); - setState(() { - if (_startDate != null && _endDate == null && !date.isBefore(_startDate!)) { - _endDate = date; - widget.onEndDateChanged?.call(_endDate); - } else { - _startDate = date; - widget.onStartDateChanged?.call(_startDate!); - if (_endDate != null) { - _endDate = null; - widget.onEndDateChanged?.call(_endDate); - } - } - }); - } - - Widget _buildMonthItem(BuildContext context, int index, bool beforeInitialMonth) { - final int monthIndex = beforeInitialMonth - ? _initialMonthIndex - index - 1 - : _initialMonthIndex + index; - final DateTime month = DateUtils.addMonthsToMonthDate(widget.firstDate, monthIndex); - return Stack( - alignment: Alignment.center, - children: [ - Text("${month.month}",style: TextStyle(fontSize: 200,color: Colors.grey.withOpacity(0.1)),), - _MonthItem( - selectedDateStart: _startDate, - selectedDateEnd: _endDate, - currentDate: widget.currentDate, - firstDate: widget.firstDate, - lastDate: widget.lastDate, - displayedMonth: month, - onChanged: _updateSelection, - ), - ], - ); - } - - @override - Widget build(BuildContext context) { - const Key sliverAfterKey = Key('sliverAfterKey'); - - return Column( - children: [ - const _DayHeaders(), - if (_showWeekBottomDivider) const Divider(height: 0), - Expanded( - child: _CalendarKeyboardNavigator( - firstDate: widget.firstDate, - lastDate: widget.lastDate, - initialFocusedDay: _startDate ?? widget.initialStartDate ?? widget.currentDate, - // In order to prevent performance issues when displaying the - // correct initial month, 2 `SliverList`s are used to split the - // months. The first item in the second SliverList is the initial - // month to be displayed. - child: CustomScrollView( - key: _scrollViewKey, - controller: _controller, - center: sliverAfterKey, - slivers: [ - SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) => _buildMonthItem(context, index, true), - childCount: _initialMonthIndex, - ), - ), - SliverList( - key: sliverAfterKey, - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) => _buildMonthItem(context, index, false), - childCount: _numberOfMonths - _initialMonthIndex, - ), - ), - ], - ), - ), - ), - ], - ); - } -} - -class _CalendarKeyboardNavigator extends StatefulWidget { - const _CalendarKeyboardNavigator({ - required this.child, - required this.firstDate, - required this.lastDate, - required this.initialFocusedDay, - }); - - final Widget child; - final DateTime firstDate; - final DateTime lastDate; - final DateTime initialFocusedDay; - - @override - _CalendarKeyboardNavigatorState createState() => _CalendarKeyboardNavigatorState(); -} - -class _CalendarKeyboardNavigatorState extends State<_CalendarKeyboardNavigator> { - - final Map _shortcutMap = const { - SingleActivator(LogicalKeyboardKey.arrowLeft): DirectionalFocusIntent(TraversalDirection.left), - SingleActivator(LogicalKeyboardKey.arrowRight): DirectionalFocusIntent(TraversalDirection.right), - SingleActivator(LogicalKeyboardKey.arrowDown): DirectionalFocusIntent(TraversalDirection.down), - SingleActivator(LogicalKeyboardKey.arrowUp): DirectionalFocusIntent(TraversalDirection.up), - }; - late Map> _actionMap; - late FocusNode _dayGridFocus; - TraversalDirection? _dayTraversalDirection; - DateTime? _focusedDay; - - @override - void initState() { - super.initState(); - - _actionMap = >{ - NextFocusIntent: CallbackAction(onInvoke: _handleGridNextFocus), - PreviousFocusIntent: CallbackAction(onInvoke: _handleGridPreviousFocus), - DirectionalFocusIntent: CallbackAction(onInvoke: _handleDirectionFocus), - }; - _dayGridFocus = FocusNode(debugLabel: 'Day Grid'); - } - - @override - void dispose() { - _dayGridFocus.dispose(); - super.dispose(); - } - - void _handleGridFocusChange(bool focused) { - setState(() { - if (focused) { - _focusedDay ??= widget.initialFocusedDay; - } - }); - } - - /// Move focus to the next element after the day grid. - void _handleGridNextFocus(NextFocusIntent intent) { - _dayGridFocus.requestFocus(); - _dayGridFocus.nextFocus(); - } - - /// Move focus to the previous element before the day grid. - void _handleGridPreviousFocus(PreviousFocusIntent intent) { - _dayGridFocus.requestFocus(); - _dayGridFocus.previousFocus(); - } - - /// Move the internal focus date in the direction of the given intent. - /// - /// This will attempt to move the focused day to the next selectable day in - /// the given direction. If the new date is not in the current month, then - /// the page view will be scrolled to show the new date's month. - /// - /// For horizontal directions, it will move forward or backward a day (depending - /// on the current [TextDirection]). For vertical directions it will move up and - /// down a week at a time. - void _handleDirectionFocus(DirectionalFocusIntent intent) { - assert(_focusedDay != null); - setState(() { - final DateTime? nextDate = _nextDateInDirection(_focusedDay!, intent.direction); - if (nextDate != null) { - _focusedDay = nextDate; - _dayTraversalDirection = intent.direction; - } - }); - } - - static const Map _directionOffset = { - TraversalDirection.up: -DateTime.daysPerWeek, - TraversalDirection.right: 1, - TraversalDirection.down: DateTime.daysPerWeek, - TraversalDirection.left: -1, - }; - - int _dayDirectionOffset(TraversalDirection traversalDirection, TextDirection textDirection) { - // Swap left and right if the text direction if RTL - if (textDirection == TextDirection.rtl) { - if (traversalDirection == TraversalDirection.left) { - traversalDirection = TraversalDirection.right; - } else if (traversalDirection == TraversalDirection.right) { - traversalDirection = TraversalDirection.left; - } - } - return _directionOffset[traversalDirection]!; - } - - DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { - final TextDirection textDirection = Directionality.of(context); - final DateTime nextDate = DateUtils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); - if (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { - return nextDate; - } - return null; - } - - @override - Widget build(BuildContext context) { - return FocusableActionDetector( - shortcuts: _shortcutMap, - actions: _actionMap, - focusNode: _dayGridFocus, - onFocusChange: _handleGridFocusChange, - child: _FocusedDate( - date: _dayGridFocus.hasFocus ? _focusedDay : null, - scrollDirection: _dayGridFocus.hasFocus ? _dayTraversalDirection : null, - child: widget.child, - ), - ); - } -} - -/// InheritedWidget indicating what the current focused date is for its children. -/// -/// This is used by the [_MonthPicker] to let its children [_DayPicker]s know -/// what the currently focused date (if any) should be. -class _FocusedDate extends InheritedWidget { - const _FocusedDate({ - required super.child, - this.date, - this.scrollDirection, - }); - - final DateTime? date; - final TraversalDirection? scrollDirection; - - @override - bool updateShouldNotify(_FocusedDate oldWidget) { - return !DateUtils.isSameDay(date, oldWidget.date) || scrollDirection != oldWidget.scrollDirection; - } - - static _FocusedDate? of(BuildContext context) { - return context.dependOnInheritedWidgetOfExactType<_FocusedDate>(); - } -} - - -class _DayHeaders extends StatelessWidget { - const _DayHeaders(); - - /// Builds widgets showing abbreviated days of week. The first widget in the - /// returned list corresponds to the first day of week for the current locale. - /// - /// Examples: - /// - /// ``` - /// ┌ Sunday is the first day of week in the US (en_US) - /// | - /// S M T W T F S <-- the returned list contains these widgets - /// _ _ _ _ _ 1 2 - /// 3 4 5 6 7 8 9 - /// - /// ┌ But it's Monday in the UK (en_GB) - /// | - /// M T W T F S S <-- the returned list contains these widgets - /// _ _ _ _ 1 2 3 - /// 4 5 6 7 8 9 10 - /// ``` - List _getDayHeaders(TextStyle headerStyle, MaterialLocalizations localizations) { - final List result = []; - for (int i = localizations.firstDayOfWeekIndex; true; i = (i + 1) % 7) { - final String weekday = localizations.narrowWeekdays[i]; - result.add(ExcludeSemantics( - child: Center(child: Text(weekday, style: headerStyle)), - )); - if (i == (localizations.firstDayOfWeekIndex - 1) % 7) { - break; - } - } - return result; - } - - @override - Widget build(BuildContext context) { - final ThemeData themeData = Theme.of(context); - final ColorScheme colorScheme = themeData.colorScheme; - final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final List labels = _getDayHeaders(textStyle, localizations); - - // Add leading and trailing containers for edges of the custom grid layout. - labels.insert(0, Container()); - labels.add(Container()); - - return Container( - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).orientation == Orientation.landscape - ? _maxCalendarWidthLandscape - : _maxCalendarWidthPortrait, - maxHeight: _monthItemRowHeight, - ), - child: GridView.custom( - shrinkWrap: true, - gridDelegate: _monthItemGridDelegate, - childrenDelegate: SliverChildListDelegate( - labels, - addRepaintBoundaries: false, - ), - ), - ); - } -} - -class _MonthItemGridDelegate extends SliverGridDelegate { - const _MonthItemGridDelegate(); - - @override - SliverGridLayout getLayout(SliverConstraints constraints) { - final double tileWidth = (constraints.crossAxisExtent - 2 * _horizontalPadding) / DateTime.daysPerWeek; - return _MonthSliverGridLayout( - crossAxisCount: DateTime.daysPerWeek + 2, - dayChildWidth: tileWidth, - edgeChildWidth: _horizontalPadding, - reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection), - ); - } - - @override - bool shouldRelayout(_MonthItemGridDelegate oldDelegate) => false; -} - -const _MonthItemGridDelegate _monthItemGridDelegate = _MonthItemGridDelegate(); - -class _MonthSliverGridLayout extends SliverGridLayout { - /// Creates a layout that uses equally sized and spaced tiles for each day of - /// the week and an additional edge tile for padding at the start and end of - /// each row. - /// - /// This is necessary to facilitate the painting of the range highlight - /// correctly. - const _MonthSliverGridLayout({ - required this.crossAxisCount, - required this.dayChildWidth, - required this.edgeChildWidth, - required this.reverseCrossAxis, - }) : assert(crossAxisCount != null && crossAxisCount > 0), - assert(dayChildWidth != null && dayChildWidth >= 0), - assert(edgeChildWidth != null && edgeChildWidth >= 0), - assert(reverseCrossAxis != null); - - /// The number of children in the cross axis. - final int crossAxisCount; - - /// The width in logical pixels of the day child widgets. - final double dayChildWidth; - - /// The width in logical pixels of the edge child widgets. - final double edgeChildWidth; - - /// Whether the children should be placed in the opposite order of increasing - /// coordinates in the cross axis. - /// - /// For example, if the cross axis is horizontal, the children are placed from - /// left to right when [reverseCrossAxis] is false and from right to left when - /// [reverseCrossAxis] is true. - /// - /// Typically set to the return value of [axisDirectionIsReversed] applied to - /// the [SliverConstraints.crossAxisDirection]. - final bool reverseCrossAxis; - - /// The number of logical pixels from the leading edge of one row to the - /// leading edge of the next row. - double get _rowHeight { - return _monthItemRowHeight + _monthItemSpaceBetweenRows; - } - - /// The height in logical pixels of the children widgets. - double get _childHeight { - return _monthItemRowHeight; - } - - @override - int getMinChildIndexForScrollOffset(double scrollOffset) { - return crossAxisCount * (scrollOffset ~/ _rowHeight); - } - - @override - int getMaxChildIndexForScrollOffset(double scrollOffset) { - final int mainAxisCount = (scrollOffset / _rowHeight).ceil(); - return math.max(0, crossAxisCount * mainAxisCount - 1); - } - - double _getCrossAxisOffset(double crossAxisStart, bool isPadding) { - if (reverseCrossAxis) { - return - ((crossAxisCount - 2) * dayChildWidth + 2 * edgeChildWidth) - - crossAxisStart - - (isPadding ? edgeChildWidth : dayChildWidth); - } - return crossAxisStart; - } - - @override - SliverGridGeometry getGeometryForChildIndex(int index) { - final int adjustedIndex = index % crossAxisCount; - final bool isEdge = adjustedIndex == 0 || adjustedIndex == crossAxisCount - 1; - final double crossAxisStart = math.max(0, (adjustedIndex - 1) * dayChildWidth + edgeChildWidth); - - return SliverGridGeometry( - scrollOffset: (index ~/ crossAxisCount) * _rowHeight, - crossAxisOffset: _getCrossAxisOffset(crossAxisStart, isEdge), - mainAxisExtent: _childHeight, - crossAxisExtent: isEdge ? edgeChildWidth : dayChildWidth, - ); - } - - @override - double computeMaxScrollOffset(int childCount) { - assert(childCount >= 0); - final int mainAxisCount = ((childCount - 1) ~/ crossAxisCount) + 1; - final double mainAxisSpacing = _rowHeight - _childHeight; - return _rowHeight * mainAxisCount - mainAxisSpacing; - } -} - -/// Displays the days of a given month and allows choosing a date range. -/// -/// The days are arranged in a rectangular grid with one column for each day of -/// the week. -class _MonthItem extends StatefulWidget { - /// Creates a month item. - _MonthItem({ - required this.selectedDateStart, - required this.selectedDateEnd, - required this.currentDate, - required this.onChanged, - required this.firstDate, - required this.lastDate, - required this.displayedMonth, - this.dragStartBehavior = DragStartBehavior.start, - }) : assert(firstDate != null), - assert(lastDate != null), - assert(!firstDate.isAfter(lastDate)), - assert(selectedDateStart == null || !selectedDateStart.isBefore(firstDate)), - assert(selectedDateEnd == null || !selectedDateEnd.isBefore(firstDate)), - assert(selectedDateStart == null || !selectedDateStart.isAfter(lastDate)), - assert(selectedDateEnd == null || !selectedDateEnd.isAfter(lastDate)), - assert(selectedDateStart == null || selectedDateEnd == null || !selectedDateStart.isAfter(selectedDateEnd)), - assert(currentDate != null), - assert(onChanged != null), - assert(displayedMonth != null), - assert(dragStartBehavior != null); - - /// The currently selected start date. - /// - /// This date is highlighted in the picker. - final DateTime? selectedDateStart; - - /// The currently selected end date. - /// - /// This date is highlighted in the picker. - final DateTime? selectedDateEnd; - - /// The current date at the time the picker is displayed. - final DateTime currentDate; - - /// Called when the user picks a day. - final ValueChanged onChanged; - - /// The earliest date the user is permitted to pick. - final DateTime firstDate; - - /// The latest date the user is permitted to pick. - final DateTime lastDate; - - /// The month whose days are displayed by this picker. - final DateTime displayedMonth; - - /// Determines the way that drag start behavior is handled. - /// - /// If set to [DragStartBehavior.start], the drag gesture used to scroll a - /// date picker wheel will begin at the position where the drag gesture won - /// the arena. If set to [DragStartBehavior.down] it will begin at the position - /// where a down event is first detected. - /// - /// In general, setting this to [DragStartBehavior.start] will make drag - /// animation smoother and setting it to [DragStartBehavior.down] will make - /// drag behavior feel slightly more reactive. - /// - /// By default, the drag start behavior is [DragStartBehavior.start]. - /// - /// See also: - /// - /// * [DragGestureRecognizer.dragStartBehavior], which gives an example for - /// the different behaviors. - final DragStartBehavior dragStartBehavior; - - @override - _MonthItemState createState() => _MonthItemState(); -} - -class _MonthItemState extends State<_MonthItem> { - /// List of [FocusNode]s, one for each day of the month. - late List _dayFocusNodes; - - @override - void initState() { - super.initState(); - final int daysInMonth = DateUtils.getDaysInMonth(widget.displayedMonth.year, widget.displayedMonth.month); - _dayFocusNodes = List.generate( - daysInMonth, - (int index) => FocusNode(skipTraversal: true, debugLabel: 'Day ${index + 1}'), - ); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - // Check to see if the focused date is in this month, if so focus it. - final DateTime? focusedDate = _FocusedDate.of(context)?.date; - if (focusedDate != null && DateUtils.isSameMonth(widget.displayedMonth, focusedDate)) { - _dayFocusNodes[focusedDate.day - 1].requestFocus(); - } - } - - @override - void dispose() { - for (final FocusNode node in _dayFocusNodes) { - node.dispose(); - } - super.dispose(); - } - - Color _highlightColor(BuildContext context) { - return Theme.of(context).colorScheme.primary.withOpacity(0.12); - } - - void _dayFocusChanged(bool focused) { - if (focused) { - final TraversalDirection? focusDirection = _FocusedDate.of(context)?.scrollDirection; - if (focusDirection != null) { - ScrollPositionAlignmentPolicy policy = ScrollPositionAlignmentPolicy.explicit; - switch (focusDirection) { - case TraversalDirection.up: - case TraversalDirection.left: - policy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; - break; - case TraversalDirection.right: - case TraversalDirection.down: - policy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; - break; - } - Scrollable.ensureVisible(primaryFocus!.context!, - duration: _monthScrollDuration, - alignmentPolicy: policy, - ); - } - } - } - - Widget _buildDayItem(BuildContext context, DateTime dayToBuild, int firstDayOffset, int daysInMonth) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final TextTheme textTheme = theme.textTheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final TextDirection textDirection = Directionality.of(context); - final Color highlightColor = _highlightColor(context); - final int day = dayToBuild.day; - - final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); - - BoxDecoration? decoration; - TextStyle? itemStyle = textTheme.bodyText2; - - final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; - final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); - final bool isSelectedDayEnd = widget.selectedDateEnd != null && dayToBuild.isAtSameMomentAs(widget.selectedDateEnd!); - final bool isInRange = isRangeSelected && - dayToBuild.isAfter(widget.selectedDateStart!) && - dayToBuild.isBefore(widget.selectedDateEnd!); - - _HighlightPainter? highlightPainter; - - if (isSelectedDayStart || isSelectedDayEnd) { - // The selected start and end dates gets a circle background - // highlight, and a contrasting text color. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onPrimary); - decoration = BoxDecoration( - color: colorScheme.primary, - shape: BoxShape.circle, - ); - - if (isRangeSelected && widget.selectedDateStart != widget.selectedDateEnd) { - final _HighlightPainterStyle style = isSelectedDayStart - ? _HighlightPainterStyle.highlightTrailing - : _HighlightPainterStyle.highlightLeading; - highlightPainter = _HighlightPainter( - color: highlightColor, - style: style, - textDirection: textDirection, - ); - } - } else if (isInRange) { - // The days within the range get a light background highlight. - highlightPainter = _HighlightPainter( - color: highlightColor, - style: _HighlightPainterStyle.highlightAll, - textDirection: textDirection, - ); - } else if (isDisabled) { - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onSurface.withOpacity(0.38)); - } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { - // The current day gets a different text color and a circle stroke - // border. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.primary); - decoration = BoxDecoration( - border: Border.all(color: colorScheme.primary), - shape: BoxShape.circle, - ); - } - - // We want the day of month to be spoken first irrespective of the - // locale-specific preferences or TextDirection. This is because - // an accessibility user is more likely to be interested in the - // day of month before the rest of the date, as they are looking - // for the day of month. To do that we prepend day of month to the - // formatted full date. - String semanticLabel = '${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}'; - if (isSelectedDayStart) { - semanticLabel = localizations.dateRangeStartDateSemanticLabel(semanticLabel); - } else if (isSelectedDayEnd) { - semanticLabel = localizations.dateRangeEndDateSemanticLabel(semanticLabel); - } - - Widget dayWidget = Container( - decoration: decoration, - child: Center( - child: Semantics( - label: semanticLabel, - selected: isSelectedDayStart || isSelectedDayEnd, - child: ExcludeSemantics( - child: Text(localizations.formatDecimal(day), style: itemStyle), - ), - ), - ), - ); - - if (highlightPainter != null) { - dayWidget = CustomPaint( - painter: highlightPainter, - child: dayWidget, - ); - } - - if (!isDisabled) { - dayWidget = InkResponse( - focusNode: _dayFocusNodes[day - 1], - onTap: () => widget.onChanged(dayToBuild), - radius: _monthItemRowHeight / 2 + 4, - splashColor: colorScheme.primary.withOpacity(0.38), - onFocusChange: _dayFocusChanged, - child: dayWidget, - ); - } - - return dayWidget; - } - - Widget _buildEdgeContainer(BuildContext context, bool isHighlighted) { - return Container(color: isHighlighted ? _highlightColor(context) : null); - } - - @override - Widget build(BuildContext context) { - final ThemeData themeData = Theme.of(context); - final TextTheme textTheme = themeData.textTheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final int year = widget.displayedMonth.year; - final int month = widget.displayedMonth.month; - final int daysInMonth = DateUtils.getDaysInMonth(year, month); - final int dayOffset = DateUtils.firstDayOffset(year, month, localizations); - final int weeks = ((daysInMonth + dayOffset) / DateTime.daysPerWeek).ceil(); - final double gridHeight = - weeks * _monthItemRowHeight + (weeks - 1) * _monthItemSpaceBetweenRows; - final List dayItems = []; - - for (int i = 0; true; i += 1) { - // 1-based day of month, e.g. 1-31 for January, and 1-29 for February on - // a leap year. - final int day = i - dayOffset + 1; - if (day > daysInMonth) { - break; - } - if (day < 1) { - dayItems.add(Container()); - } else { - final DateTime dayToBuild = DateTime(year, month, day); - final Widget dayItem = _buildDayItem( - context, - dayToBuild, - dayOffset, - daysInMonth, - ); - dayItems.add(dayItem); - } - } - - // Add the leading/trailing edge containers to each week in order to - // correctly extend the range highlight. - final List paddedDayItems = []; - for (int i = 0; i < weeks; i++) { - final int start = i * DateTime.daysPerWeek; - final int end = math.min( - start + DateTime.daysPerWeek, - dayItems.length, - ); - final List weekList = dayItems.sublist(start, end); - - final DateTime dateAfterLeadingPadding = DateTime(year, month, start - dayOffset + 1); - // Only color the edge container if it is after the start date and - // on/before the end date. - final bool isLeadingInRange = - !(dayOffset > 0 && i == 0) && - widget.selectedDateStart != null && - widget.selectedDateEnd != null && - dateAfterLeadingPadding.isAfter(widget.selectedDateStart!) && - !dateAfterLeadingPadding.isAfter(widget.selectedDateEnd!); - weekList.insert(0, _buildEdgeContainer(context, isLeadingInRange)); - - // Only add a trailing edge container if it is for a full week and not a - // partial week. - if (end < dayItems.length || (end == dayItems.length && dayItems.length % DateTime.daysPerWeek == 0)) { - final DateTime dateBeforeTrailingPadding = - DateTime(year, month, end - dayOffset); - // Only color the edge container if it is on/after the start date and - // before the end date. - final bool isTrailingInRange = - widget.selectedDateStart != null && - widget.selectedDateEnd != null && - !dateBeforeTrailingPadding.isBefore(widget.selectedDateStart!) && - dateBeforeTrailingPadding.isBefore(widget.selectedDateEnd!); - weekList.add(_buildEdgeContainer(context, isTrailingInRange)); - } - - paddedDayItems.addAll(weekList); - } - - final double maxWidth = MediaQuery.of(context).orientation == Orientation.landscape - ? _maxCalendarWidthLandscape - : _maxCalendarWidthPortrait; - return Column( - children: [ - Container( - constraints: BoxConstraints(maxWidth: maxWidth), - height: _monthItemHeaderHeight, - padding: const EdgeInsets.symmetric(horizontal: 16), - alignment: AlignmentDirectional.centerStart, - child: ExcludeSemantics( - child: Text( - localizations.formatMonthYear(widget.displayedMonth), - style: textTheme.bodyText2!.apply(color: themeData.colorScheme.onSurface), - ), - ), - ), - Container( - constraints: BoxConstraints( - maxWidth: maxWidth, - maxHeight: gridHeight, - ), - child: GridView.custom( - physics: const NeverScrollableScrollPhysics(), - gridDelegate: _monthItemGridDelegate, - childrenDelegate: SliverChildListDelegate( - paddedDayItems, - addRepaintBoundaries: false, - ), - ), - ), - const SizedBox(height: _monthItemFooterHeight), - ], - ); - } -} - -/// Determines which style to use to paint the highlight. -enum _HighlightPainterStyle { - /// Paints nothing. - none, - - /// Paints a rectangle that occupies the leading half of the space. - highlightLeading, - - /// Paints a rectangle that occupies the trailing half of the space. - highlightTrailing, - - /// Paints a rectangle that occupies all available space. - highlightAll, -} - -/// This custom painter will add a background highlight to its child. -/// -/// This highlight will be drawn depending on the [style], [color], and -/// [textDirection] supplied. It will either paint a rectangle on the -/// left/right, a full rectangle, or nothing at all. This logic is determined by -/// a combination of the [style] and [textDirection]. -class _HighlightPainter extends CustomPainter { - _HighlightPainter({ - required this.color, - this.style = _HighlightPainterStyle.none, - this.textDirection, - }); - - final Color color; - final _HighlightPainterStyle style; - final TextDirection? textDirection; - - @override - void paint(Canvas canvas, Size size) { - if (style == _HighlightPainterStyle.none) { - return; - } - - final Paint paint = Paint() - ..color = color - ..style = PaintingStyle.fill; - - final Rect rectLeft = Rect.fromLTWH(0, 0, size.width / 2, size.height); - final Rect rectRight = Rect.fromLTWH(size.width / 2, 0, size.width / 2, size.height); - - switch (style) { - case _HighlightPainterStyle.highlightTrailing: - canvas.drawRect( - textDirection == TextDirection.ltr ? rectRight : rectLeft, - paint, - ); - break; - case _HighlightPainterStyle.highlightLeading: - canvas.drawRect( - textDirection == TextDirection.ltr ? rectLeft : rectRight, - paint, - ); - break; - case _HighlightPainterStyle.highlightAll: - canvas.drawRect( - Rect.fromLTWH(0, 0, size.width, size.height), - paint, - ); - break; - case _HighlightPainterStyle.none: - break; - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; -} - -class _InputDateRangePickerDialog extends StatelessWidget { - const _InputDateRangePickerDialog({ - required this.selectedStartDate, - required this.selectedEndDate, - required this.currentDate, - required this.picker, - required this.onConfirm, - required this.onCancel, - required this.confirmText, - required this.cancelText, - required this.helpText, - required this.entryModeButton, - }); - - final DateTime? selectedStartDate; - final DateTime? selectedEndDate; - final DateTime? currentDate; - final Widget picker; - final VoidCallback onConfirm; - final VoidCallback onCancel; - final String? confirmText; - final String? cancelText; - final String? helpText; - final Widget? entryModeButton; - - String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final String startText = _formatRangeStartDate(localizations, start, end); - final String endText = _formatRangeEndDate(localizations, start, end, now); - if (start == null || end == null) { - return localizations.unspecifiedDateRange; - } - if (Directionality.of(context) == TextDirection.ltr) { - return '$startText – $endText'; - } else { - return '$endText – $startText'; - } - } - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final Orientation orientation = MediaQuery.of(context).orientation; - final TextTheme textTheme = theme.textTheme; - - final Color onPrimarySurfaceColor = colorScheme.brightness == Brightness.light - ? colorScheme.onPrimary - : colorScheme.onSurface; - final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.apply(color: onPrimarySurfaceColor) - : textTheme.headline4?.apply(color: onPrimarySurfaceColor); - final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); - final String semanticDateText = selectedStartDate != null && selectedEndDate != null - ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' - : ''; - - final Widget header = _DatePickerHeader( - helpText: helpText ?? localizations.dateRangePickerHelpText, - titleText: dateText, - titleSemanticsLabel: semanticDateText, - titleStyle: dateStyle, - orientation: orientation, - isShort: orientation == Orientation.landscape, - entryModeButton: entryModeButton, - ); - - final Widget actions = Container( - alignment: AlignmentDirectional.centerEnd, - constraints: const BoxConstraints(minHeight: 52.0), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: OverflowBar( - spacing: 8, - children: [ - TextButton( - onPressed: onCancel, - child: Text(cancelText ?? localizations.cancelButtonLabel), - ), - TextButton( - onPressed: onConfirm, - child: Text(confirmText ?? localizations.okButtonLabel), - ), - ], - ), - ); - - switch (orientation) { - case Orientation.portrait: - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Expanded(child: picker), - actions, - ], - ); - - case Orientation.landscape: - return Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - header, - Flexible( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(child: picker), - actions, - ], - ), - ), - ], - ); - } - } -} - -/// Provides a pair of text fields that allow the user to enter the start and -/// end dates that represent a range of dates. -class _InputDateRangePicker extends StatefulWidget { - /// Creates a row with two text fields configured to accept the start and end dates - /// of a date range. - _InputDateRangePicker({ - super.key, - DateTime? initialStartDate, - DateTime? initialEndDate, - required DateTime firstDate, - required DateTime lastDate, - required this.onStartDateChanged, - required this.onEndDateChanged, - this.helpText, - this.errorFormatText, - this.errorInvalidText, - this.errorInvalidRangeText, - this.fieldStartHintText, - this.fieldEndHintText, - this.fieldStartLabelText, - this.fieldEndLabelText, - this.autofocus = false, - this.autovalidate = false, - }) : initialStartDate = initialStartDate == null ? null : DateUtils.dateOnly(initialStartDate), - initialEndDate = initialEndDate == null ? null : DateUtils.dateOnly(initialEndDate), - assert(firstDate != null), - firstDate = DateUtils.dateOnly(firstDate), - assert(lastDate != null), - lastDate = DateUtils.dateOnly(lastDate), - assert(firstDate != null), - assert(lastDate != null), - assert(autofocus != null), - assert(autovalidate != null); - - /// The [DateTime] that represents the start of the initial date range selection. - final DateTime? initialStartDate; - - /// The [DateTime] that represents the end of the initial date range selection. - final DateTime? initialEndDate; - - /// The earliest allowable [DateTime] that the user can select. - final DateTime firstDate; - - /// The latest allowable [DateTime] that the user can select. - final DateTime lastDate; - - /// Called when the user changes the start date of the selected range. - final ValueChanged? onStartDateChanged; - - /// Called when the user changes the end date of the selected range. - final ValueChanged? onEndDateChanged; - - /// The text that is displayed at the top of the header. - /// - /// This is used to indicate to the user what they are selecting a date for. - final String? helpText; - - /// Error text used to indicate the text in a field is not a valid date. - final String? errorFormatText; - - /// Error text used to indicate the date in a field is not in the valid range - /// of [firstDate] - [lastDate]. - final String? errorInvalidText; - - /// Error text used to indicate the dates given don't form a valid date - /// range (i.e. the start date is after the end date). - final String? errorInvalidRangeText; - - /// Hint text shown when the start date field is empty. - final String? fieldStartHintText; - - /// Hint text shown when the end date field is empty. - final String? fieldEndHintText; - - /// Label used for the start date field. - final String? fieldStartLabelText; - - /// Label used for the end date field. - final String? fieldEndLabelText; - - /// {@macro flutter.widgets.editableText.autofocus} - final bool autofocus; - - /// If true, this the date fields will validate and update their error text - /// immediately after every change. Otherwise, you must call - /// [_InputDateRangePickerState.validate] to validate. - final bool autovalidate; - - @override - _InputDateRangePickerState createState() => _InputDateRangePickerState(); -} - -/// The current state of an [_InputDateRangePicker]. Can be used to -/// [validate] the date field entries. -class _InputDateRangePickerState extends State<_InputDateRangePicker> { - late String _startInputText; - late String _endInputText; - DateTime? _startDate; - DateTime? _endDate; - late TextEditingController _startController; - late TextEditingController _endController; - String? _startErrorText; - String? _endErrorText; - bool _autoSelected = false; - - @override - void initState() { - super.initState(); - _startDate = widget.initialStartDate; - _startController = TextEditingController(); - _endDate = widget.initialEndDate; - _endController = TextEditingController(); - } - - @override - void dispose() { - _startController.dispose(); - _endController.dispose(); - super.dispose(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - if (_startDate != null) { - _startInputText = localizations.formatCompactDate(_startDate!); - final bool selectText = widget.autofocus && !_autoSelected; - _updateController(_startController, _startInputText, selectText); - _autoSelected = selectText; - } - - if (_endDate != null) { - _endInputText = localizations.formatCompactDate(_endDate!); - _updateController(_endController, _endInputText, false); - } - } - - /// Validates that the text in the start and end fields represent a valid - /// date range. - /// - /// Will return true if the range is valid. If not, it will - /// return false and display an appropriate error message under one of the - /// text fields. - bool validate() { - String? startError = _validateDate(_startDate); - final String? endError = _validateDate(_endDate); - if (startError == null && endError == null) { - if (_startDate!.isAfter(_endDate!)) { - startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel; - } - } - setState(() { - _startErrorText = startError; - _endErrorText = endError; - }); - return startError == null && endError == null; - } - - DateTime? _parseDate(String? text) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - return localizations.parseCompactDate(text); - } - - String? _validateDate(DateTime? date) { - if (date == null) { - return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel; - } else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) { - return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel; - } - return null; - } - - void _updateController(TextEditingController controller, String text, bool selectText) { - TextEditingValue textEditingValue = controller.value.copyWith(text: text); - if (selectText) { - textEditingValue = textEditingValue.copyWith(selection: TextSelection( - baseOffset: 0, - extentOffset: text.length, - )); - } - controller.value = textEditingValue; - } - - void _handleStartChanged(String text) { - setState(() { - _startInputText = text; - _startDate = _parseDate(text); - widget.onStartDateChanged?.call(_startDate); - }); - if (widget.autovalidate) { - validate(); - } - } - - void _handleEndChanged(String text) { - setState(() { - _endInputText = text; - _endDate = _parseDate(text); - widget.onEndDateChanged?.call(_endDate); - }); - if (widget.autovalidate) { - validate(); - } - } - - @override - Widget build(BuildContext context) { - final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final InputDecorationTheme inputTheme = Theme.of(context).inputDecorationTheme; - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: TextField( - controller: _startController, - decoration: InputDecoration( - border: inputTheme.border ?? const UnderlineInputBorder(), - filled: inputTheme.filled, - hintText: widget.fieldStartHintText ?? localizations.dateHelpText, - labelText: widget.fieldStartLabelText ?? localizations.dateRangeStartLabel, - errorText: _startErrorText, - ), - keyboardType: TextInputType.datetime, - onChanged: _handleStartChanged, - autofocus: widget.autofocus, - ), - ), - const SizedBox(width: 8), - Expanded( - child: TextField( - controller: _endController, - decoration: InputDecoration( - border: inputTheme.border ?? const UnderlineInputBorder(), - filled: inputTheme.filled, - hintText: widget.fieldEndHintText ?? localizations.dateHelpText, - labelText: widget.fieldEndLabelText ?? localizations.dateRangeEndLabel, - errorText: _endErrorText, - ), - keyboardType: TextInputType.datetime, - onChanged: _handleEndChanged, - ), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart deleted file mode 100644 index 9f5defef..00000000 --- a/packages/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 113, -// "name": 'DecoratedBoxTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【position】 : 前/背景色 【DecorationPosition】\n" -// "【decoration】 : 动画 【Animation】", -// } -class CustomDecoratedBoxTransition extends StatefulWidget { - const CustomDecoratedBoxTransition({Key? key}) : super(key: key); - - @override - _CustomDecoratedBoxTransitionState createState() => - _CustomDecoratedBoxTransitionState(); -} - -class _CustomDecoratedBoxTransitionState - extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 1), - ); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: SizedBox( - width: 200, - height: 100, - child: DecoratedBoxTransition( - position: DecorationPosition.background, - decoration: DecorationTween( - begin: const BoxDecoration( - color: Colors.greenAccent, - borderRadius: BorderRadius.all(Radius.circular(50)), - boxShadow: [ - BoxShadow( - offset: Offset(1, 1), - color: Colors.purple, - blurRadius: 3, - spreadRadius: 1) - ]), - end: const BoxDecoration( - color: Colors.orange, - borderRadius: BorderRadius.all(Radius.circular(10)), - boxShadow: [ - BoxShadow( - offset: Offset(1, 1), - color: Colors.blue, - blurRadius: 1, - spreadRadius: 0) - ])).animate(_ctrl), - child: const Icon(Icons.android, color: Colors.white, size: 60), - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart b/packages/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart deleted file mode 100644 index 41e708eb..00000000 --- a/packages/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 230 DefaultTabController 默认Tab控制器 在使用TabBar和TabBarView时,需要同一个控制器实现页签和页面的控制。DefaultTabController会在未指定控制器时提供默认控制器,简化使用。 -// { -// "widgetId": 230, -// "name": 'DefaultTabController基本使用', -// "priority": 1, -// "subtitle": -// "【length】 : 页签数量 【int】\n" -// "【initialIndex】 : 初始页签索引 【int】\n" -// "【child】 : 组件 【Widget】", -// } - -class DefaultTabControllerDemo extends StatelessWidget { - final List tabs = const [ - Tab(text: '青眼白龙'), - Tab(text: '黑魔术师'), - Tab(text: '混沌战士'), - ]; - - const DefaultTabControllerDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: DefaultTabController( - length: tabs.length, - child: Scaffold( - appBar: AppBar( - title: const Text("DefaultTabController"), - bottom: TabBar( - tabs: tabs, - ), - ), - body: TabBarView( - children: tabs.map((Tab tab) { - return Center( - child: Text( - '${tab.text}', - style: const TextStyle(fontSize: 20), - ), - ); - }).toList(), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart deleted file mode 100644 index 8d8ef77c..00000000 --- a/packages/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 114, -// "name": 'DefaultTextStyleTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【softWrap】 : 是否包裹 【bool】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【overflow】 : 溢出模式 【TextOverflow】\n" -// "【style】 : 动画 【Animation】", -// } -class CustomDefaultTextStyleTransition extends StatefulWidget { - const CustomDefaultTextStyleTransition({Key? key}) : super(key: key); - - @override - _CustomDefaultTextStyleTransitionState createState() => - _CustomDefaultTextStyleTransitionState(); -} - -class _CustomDefaultTextStyleTransitionState - extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 1), - ); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () { - setState(() { - _ctrl.reset(); - _ctrl.forward(); - }); - }, - child: Container( - alignment: Alignment.center, - width: 300, - height: 100, - child: DefaultTextStyleTransition( - textAlign: TextAlign.start, - softWrap: true, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyleTween( - begin: const TextStyle( - color: Colors.blue, - fontSize: 50, - shadows: [ - Shadow( - offset: Offset(1, 1), - color: Colors.black, - blurRadius: 3) - ]), - end: const TextStyle( - color: Colors.white, - fontSize: 20, - shadows: [ - Shadow( - offset: Offset(1, 1), - color: Colors.purple, - blurRadius: 3) - ])).animate(_ctrl), - child: const Text('张风捷特烈'), - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Dismissible/node1_base.dart b/packages/widgets/lib/StatefulWidget/Dismissible/node1_base.dart deleted file mode 100644 index aba2c84c..00000000 --- a/packages/widgets/lib/StatefulWidget/Dismissible/node1_base.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 176, -// "name": 'Dismissible基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【background】 : 左底 【Widget】\n" -// "【secondaryBackground】 : 右底 【Widget】\n" -// "【key】 : 键 【Key】\n" -// "【confirmDismiss】 : 确认回调 【DismissDirectionCallback】\n" -// "【onDismissed】 : 消失回调 【DismissDirectionCallback】\n", -// } -class CustomDismissible extends StatefulWidget { - const CustomDismissible({Key? key}) : super(key: key); - - @override - _CustomDismissibleState createState() => _CustomDismissibleState(); -} - -class _CustomDismissibleState extends State { - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - Widget _buildItem(Color color) { - return Dismissible( - background: Container( - color: Colors.green, - alignment: const Alignment(-0.9, 0), - child: const Icon( - Icons.check, - color: Colors.white, - ), - ), - secondaryBackground: Container( - alignment: const Alignment(0.9, 0), - child: const Icon( - Icons.close, - color: Colors.white, - ), - color: Colors.red, - ), - key: ValueKey(color), - onDismissed: (d) { - data.remove(color); - }, - confirmDismiss: (e) async { - if (e == DismissDirection.endToStart) { - return true; - } else { - return false; - } - }, - child: Container( - alignment: Alignment.center, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart b/packages/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart deleted file mode 100644 index 585169ac..00000000 --- a/packages/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart +++ /dev/null @@ -1,108 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 176, -// "name": 'Dismissible基本使用', -// "priority": 2, -// "subtitle": "【direction】 : 方向 【DismissDirection】\n" -// "【crossAxisEndOffset】 : 偏移 【double】\n", -// } -class DirectionDismissible extends StatefulWidget { - const DirectionDismissible({Key? key}) : super(key: key); - - @override - _CustomDirectionDismissibleState createState() => - _CustomDirectionDismissibleState(); -} - -class _CustomDirectionDismissibleState extends State { - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ListView( - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - Widget _buildItem(Color color) { - return Dismissible( - direction: DismissDirection.vertical, - background: Container( - color: Colors.green, - alignment: const Alignment( - 0, - -0.9, - ), - child: const Icon( - Icons.check, - color: Colors.white, - ), - ), - crossAxisEndOffset: 0.5, - secondaryBackground: Container( - alignment: const Alignment( - 0, - 0.9, - ), - child: const Icon( - Icons.close, - color: Colors.white, - ), - color: Colors.red, - ), - key: ValueKey(color), - onDismissed: (d) { - data.remove(color); - }, - confirmDismiss: (e) async { - print(e); - if (e == DismissDirection.up) { - return true; - } else { - return false; - } - }, - child: Container( - alignment: Alignment.center, - width: 80, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/DragTarget/node1_base.dart b/packages/widgets/lib/StatefulWidget/DragTarget/node1_base.dart deleted file mode 100644 index 41a1aa1e..00000000 --- a/packages/widgets/lib/StatefulWidget/DragTarget/node1_base.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 104, -// "name": 'DragTarget基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【DragTargetBuilder】\n" -// "【onWillAccept】 : 拖入时 【Function(T)】\n" -// "【onAccept】 : 拖拽成功 【Function(T)】\n" -// "【onLeave】 : 拖入再脱出 【Function(T)】", -// } - -class CustomDragTarget extends StatefulWidget { - const CustomDragTarget({Key? key}) : super(key: key); - - @override - _CustomDragTargetState createState() => _CustomDragTargetState(); -} - -class _CustomDragTargetState extends State { - Color _color = Colors.grey; - String _info = 'DragTarget'; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Wrap(children: _buildColors(), spacing: 10), - const SizedBox(height: 20), - _buildDragTarget() - ], - ); - } - - final List colors = const [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green, - Colors.orange, - Colors.purple, - Colors.cyanAccent - ]; - - List _buildColors() => colors - .map( - (e) => Draggable( - child: Container( - width: 30, - height: 30, - alignment: Alignment.center, - child: Text( - colors.indexOf(e).toString(), - style: const TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - ), - decoration: BoxDecoration(color: e, shape: BoxShape.circle), - ), - data: e, - feedback: Container( - width: 25, - height: 25, - decoration: BoxDecoration(color: e, shape: BoxShape.circle), - )), - ).toList(); - - Widget _buildDragTarget() { - return DragTarget( - onLeave: (data) => setState(() => _info='onLeave'), - onAccept: (data) => setState(() { - _info='onAccept'; - _color = data; - }), - onWillAccept: (data) { - setState(() { - _info='onWillAccept'; - }); - print("onWillAccept: data = $data "); - return data != null; - }, - builder: (context, candidateData, rejectedData) => Container( - width: 150.0, - height: 50.0, - color: _color, - child: Center( - child: Text( - _info, - style: const TextStyle(color: Colors.white), - ), - ))); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node1_base.dart b/packages/widgets/lib/StatefulWidget/Draggable/node1_base.dart deleted file mode 100644 index 98da9750..00000000 --- a/packages/widgets/lib/StatefulWidget/Draggable/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 103, -// "name": 'Draggable基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【feedback】 : 拖拽时的孩子 【Widget】\n" -// "【axis】 : 拖动的轴 【Axis】", -// } -class CustomDraggable extends StatelessWidget { - const CustomDraggable({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - List axis = [null, Axis.vertical, Axis.horizontal]; - return Wrap( - spacing: 30, - children: axis - .map((e) => Draggable( - axis: e, - child: Container( - width: 30, - height: 30, - alignment: Alignment.center, - decoration: const BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - ), - feedback: Container( - width: 30, - height: 30, - decoration: const BoxDecoration( - color: Colors.red, - shape: BoxShape.circle, - ), - ), - )) - .toList()); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart b/packages/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart deleted file mode 100644 index 2a4be825..00000000 --- a/packages/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 252 DraggableScrollableSheet 拖滑页 可拖动和滑动的Sheet,可指定最大、最小、最初的分度现在滑动范围。构造器builder需要返回一个可滑动组件。 -// { -// "widgetId": 252, -// "name": 'DraggableScrollableSheet基本使用', -// "priority": 1, -// "subtitle": -// "【initialChildSize】 : 初始分度 【double】\n" -// "【minChildSize】 : 最小分度 【double】\n" -// "【maxChildSize】 : 最大分度 【double】\n" -// "【builder】 : 滑动组件构造器 【ScrollableWidgetBuilder】\n" -// "【expand】 : 是否延展 【bool】", -// } - -class DraggableScrollableSheetDemo extends StatelessWidget { - const DraggableScrollableSheetDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(10), - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DraggableScrollableSheetPage()), - ); - }, - child: const Text("进入 DraggableScrollableSheet 测试页"), - ), - ); - } -} - -class DraggableScrollableSheetPage extends StatelessWidget { - DraggableScrollableSheetPage({Key? key}) : super(key: key); - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("DraggableScrollableSheet"), - ), - body: SizedBox.expand( - child: DraggableScrollableSheet( - initialChildSize: 0.3, - minChildSize: 0.2, - maxChildSize: 0.5, - expand: true, - builder: (BuildContext context, ScrollController scrollController)=> - ListView.builder( - controller: scrollController, - itemCount: data.length, - itemBuilder: buildColorItem, - ), - )), - ); - } - - Widget buildColorItem(BuildContext context, int index) { - return Container( - alignment: Alignment.center, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/DrawerController/node1_base.dart b/packages/widgets/lib/StatefulWidget/DrawerController/node1_base.dart deleted file mode 100644 index e0dc5d67..00000000 --- a/packages/widgets/lib/StatefulWidget/DrawerController/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 257 DrawerController 为 Drawer 组件提供交互行为,一般很少使用。在 Scaffold 组件源码中有使用场景。 -// { -// "widgetId": 257, -// "name": 'DrawerController基本使用', -// "priority": 1, -// "subtitle": -// "【drawerCallback】 : 事件回调 【DrawerCallback】\n" -// "【enableOpenDragGesture】 : 是否侧边滑开 【bool】\n" -// "【alignment】 : 对齐方式 【DrawerAlignment】\n" -// "【scrimColor】 : 背景颜色 【Color】\n" -// "【child】 : Drawer组件 【Widget】", -// } - -class DrawerControllerDemo extends StatefulWidget { - const DrawerControllerDemo({Key? key}) : super(key: key); - - @override - _DrawerControllerDemoState createState() => _DrawerControllerDemoState(); -} - -class _DrawerControllerDemoState extends State { - final GlobalKey _drawerKey = - GlobalKey(); - - bool _open = false; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - ElevatedButton( - onPressed: toggleDrawer, - child: const Text("显隐 Drawer"), - ), - SizedBox( - height: 200, - child: DrawerController( - scrimColor: Colors.blue.withAlpha(88), - enableOpenDragGesture: true, - key: _drawerKey, - alignment: DrawerAlignment.start, - drawerCallback: (value) { - _open = value; - }, - child: Drawer( - child: Container( - alignment: Alignment.center, - color: Colors.red, - child: const Text( - "I am Drawer!", - style: TextStyle(color: Colors.white, fontSize: 18), - ), - ), - ), - ), - ), - ], - ); - } - - void toggleDrawer() { - if (_open) { - _drawerKey.currentState?.close(); - } else { - print('---open--$_open-------'); - _drawerKey.currentState?.open(); - } - } -} diff --git a/packages/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart deleted file mode 100644 index 3f5b6b33..00000000 --- a/packages/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 55, -// "name": 'DropdownButton基本用法', -// "priority": 1, -// "subtitle": -// "【value】 : 当前值 【T】\n" -// "【items】 : 下拉选框 【List>】\n" -// "【icon】 : 图标 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【onChanged】 : 选择条目事件 【Function(T)】\n" -// "【backgroundColor】 : 背景色 【Color】", -// } -class CustomDropDownButton extends StatefulWidget { - const CustomDropDownButton({Key? key}) : super(key: key); - - @override - _CustomDropDownButtonState createState() => _CustomDropDownButtonState(); -} - -class _CustomDropDownButtonState extends State { - Color _color = Colors.red; - final List _colors = const [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - final List _info = const ["红色", "黄色", "蓝色", "绿色"]; - - @override - Widget build(BuildContext context) { - return Wrap( - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - width: 50, - height: 50, - color: _color, - ), - DropdownButton( - value: _color, - elevation: 1, - icon: Icon( - Icons.expand_more, - size: 20, - color: _color, - ), - items: _buildItems(), - onChanged: (v) => setState(() => _color = v??Colors.blue)), - ], - ); - } - - List> _buildItems() => _colors - .map((e) => DropdownMenuItem( - value: e, - child: Text( - _info[_colors.indexOf(e)], - style: TextStyle(color: e), - ))) - .toList(); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart deleted file mode 100644 index b8587aad..00000000 --- a/packages/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-16 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 55, -// "name": 'DropdownButton的样式指定', -// "priority": 2, -// "subtitle": -// "【isDense】 : 是否紧排 【bool】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【hint】 : 提示组件 【Widget】\n" -// "【iconEnabledColor】 : 图标颜色 【Color】", -// } - -class StyleDropDownButton extends StatefulWidget { - const StyleDropDownButton({Key? key}) : super(key: key); - - @override - _StyleDropDownButtonState createState() => _StyleDropDownButtonState(); -} - -class _StyleDropDownButtonState extends State { - Color _color = Colors.red; - - final List _colors = const [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - final List _info = const ["红色", "黄色", "蓝色", "绿色"]; - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - width: 50, - height: 50, - color: _color, - ), - DropdownButton( - hint: const Text('请选择'), - isDense: true, - iconSize:20, - iconEnabledColor:_color, - value: _color, - items: _buildItems(), - onChanged: (v) => setState(() => _color = v??Colors.blue)), - ], - ); - } - - List> _buildItems() => _colors - .map((e) => DropdownMenuItem( - value: e, - child: Text( - _info[_colors.indexOf(e)], - style: TextStyle(color: e), - ))) - .toList(); -} diff --git a/packages/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart b/packages/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart deleted file mode 100644 index 8785f98b..00000000 --- a/packages/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 223 DropdownButtonFormField 表单下拉框 -/// 底层依赖 DropdownButton 实现,所以基本属性类似。但拥有 FormField 的特性,可以回调 onSaved、validator 方法。 -/// link: 55,222 -/// -// { -// "widgetId": 223, -// "name": '表单下拉框简单使用', -// "priority": 1, -// "subtitle": -// "【items】 : 子组件列表 【List>】\n" -// "【validator】 : 表单验证回调 【FormFieldValidator】\n" -// "【onSaved】 : 表单保存回调 【FormFieldSetter】\n" -// "其他属性详见 DropdownButton,表单校验特性详见 FormField。", -// } - -class DropdownButtonFormFieldDemo extends StatefulWidget { - const DropdownButtonFormFieldDemo({Key? key}) : super(key: key); - - @override - _DropdownButtonFormFieldDemoState createState() => - _DropdownButtonFormFieldDemoState(); -} - -class _DropdownButtonFormFieldDemoState extends State { - Color _color = Colors.blue; - final List _colors = const [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - final List _info = const ["红色", "黄色", "蓝色", "绿色"]; - - @override - Widget build(BuildContext context) { - return Wrap( - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - width: 50, - height: 50, - color: _color, - ), - - SizedBox( - width: 80, - child: DropdownButtonFormField( - value: _color, - elevation: 1, - hint: const Text('选择颜色',style: TextStyle(fontSize: 12),), - icon: Icon( - Icons.expand_more, - size: 20, - color: _color, - ), - items: _buildItems(), - onChanged: (v) => setState(() => _color = v ?? Colors.blue)), - ) - - ], - ); - } - - List> _buildItems() => _colors - .map((e) => DropdownMenuItem( - value: e, - child: Text( - _info[_colors.indexOf(e)], - style: TextStyle(color: e), - ))) - .toList(); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/EditableText/node1_base.dart b/packages/widgets/lib/StatefulWidget/EditableText/node1_base.dart deleted file mode 100644 index 35b4836c..00000000 --- a/packages/widgets/lib/StatefulWidget/EditableText/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 244 EditableText 可编辑文字 可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。 -// { -// "widgetId": 244, -// "name": "EditableText基本使用", -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TextEditingController】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【backgroundCursorColor】 : 背景游标颜色 【Color】\n" -// "【cursorColor】 : 游标颜色 【Color】\n" -// "上面五个是EditableText必须的属性,其他同TextField,此处不再列举。", -// } - -class EditableTextDemo extends StatefulWidget { - const EditableTextDemo({Key? key}) : super(key: key); - - @override - _EditableTextDemoState createState() => _EditableTextDemoState(); -} - -class _EditableTextDemoState extends State { - final TextEditingController _ctrl = - TextEditingController(text: 'Hello Flutter Unit!'); - final FocusNode _node = FocusNode(); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: EditableText( - controller: _ctrl, - focusNode: _node, - style: const TextStyle(fontSize: 16, color: Colors.blue), - cursorColor: Colors.blue, - backgroundCursorColor: Colors.orange, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart deleted file mode 100644 index 31ff221d..00000000 --- a/packages/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 354 ElevatedButton Material风格的升起按钮,表现和RaisedButton类似。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 354, -// "name": 'ElevatedButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } - -class ElevatedButtonDemo extends StatelessWidget { - const ElevatedButtonDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - height: 60, - child: Wrap( - spacing: 20, - children: [ - ElevatedButton( - child: const Text('ElevatedButton'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - const ElevatedButton( - child: Text('禁用按钮'), - onPressed: null, - onLongPress: null, - ), - ], - )); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart deleted file mode 100644 index 9096c128..00000000 --- a/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 354, -// "name": 'ElevatedButton样式', -// "priority": 2, -// "subtitle": -// "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } - -class ElevatedButtonStyleDemo extends StatelessWidget { - const ElevatedButtonStyleDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - child: Wrap( - spacing: 10, - children: [ - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.orange, - primary: Colors.white, - elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('ElevatedButton样式'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.white, - primary: Colors.black, - side: const BorderSide(color: Colors.blue,width: 1), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)) - ), - // elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('ElevatedButton边线'), - autofocus: false, - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - ], - ), - ); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart b/packages/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart deleted file mode 100644 index a90eefcd..00000000 --- a/packages/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-16 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 51, -// "name": 'ExpandIcon基本使用', -// "priority": 1, -// "subtitle": -// "【isExpanded】 : 是否展开 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n", -// "【size】 : 图标大小 【double】\n" -// "【color】 : 不展开时颜色 【Color】\n" -// "【expandedColor】 : 展开时颜色 【Color】\n" -// "【onPressed】 : 点击事件 【Function(bool)】", -// } -class CustomExpandIcon extends StatefulWidget { - const CustomExpandIcon({Key? key}) : super(key: key); - - @override - _CustomExpandIconState createState() => _CustomExpandIconState(); -} - -class _CustomExpandIconState extends State { - bool _closed = true; - - @override - Widget build(BuildContext context) { - return ExpandIcon( - isExpanded: _closed, - padding: const EdgeInsets.all(5), - size: 30, - color: Colors.blue, - expandedColor: Colors.orangeAccent, - onPressed: (value) => setState(() => _closed = !_closed), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart b/packages/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart deleted file mode 100644 index 3faf35a8..00000000 --- a/packages/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 178, -// "name": 'ExpansionPanelList基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【animationDuration】 : 动画时长 【Duration】\n" -// "【expansionCallback】 : 展开回调 【List】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -class CustomExpansionPanelList extends StatefulWidget { - const CustomExpansionPanelList({Key? key}) : super(key: key); - - @override - _CustomExpansionPanelListState createState() => - _CustomExpansionPanelListState(); -} - -class _CustomExpansionPanelListState extends State { - final List data = [ - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - int _position = 0; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 300, - child: ExpansionPanelList( - children: data.map((color) => _buildItem(color)).toList(), - animationDuration: const Duration(milliseconds: 200), - expansionCallback: (index, open) { - setState(() => _position = open ? -1 : index); - }, - ), - ); - } - - ExpansionPanel _buildItem(Color color) { - return ExpansionPanel( - isExpanded: data.indexOf(color) == _position, - canTapOnHeader: true, - headerBuilder: (ctx, index) => Center( - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Container( - height: 30, - width: 30, - decoration: - BoxDecoration(color: color, shape: BoxShape.circle), - ), - Container( - width: 120, - alignment: Alignment.center, - height: 50, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.black), - ), - ), - ], - ), - ), - body: Container( - alignment: Alignment.center, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - )); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart b/packages/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart deleted file mode 100644 index 7c59f98f..00000000 --- a/packages/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../StatelessWidget/RadioListTile/node1_base.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 52, -// "name": 'ExpansionTile基本使用', -// "priority": 1, -// "subtitle": "【children】 : 展开内容 【List】\n" -// "【leading】 : 头左组件 【Widget】\n" -// "【title】 : 头中组件 【Widget】\n" -// "【trailing】 : 头尾组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【onExpansionChanged】 : 折叠事件 【Function(bool)】\n" -// "【initiallyExpanded】 : 是否初始时展开 【bool】", -// } -class CustomExpansionTile extends StatefulWidget { - const CustomExpansionTile({Key? key}) : super(key: key); - - @override - _CustomExpansionTileState createState() => _CustomExpansionTileState(); -} - -class _CustomExpansionTileState extends State { - @override - Widget build(BuildContext context) { - return ExpansionTile( - leading: const Icon(Icons.star), - title: const Text("选择语言"), - backgroundColor: Colors.grey.withAlpha(6), - onExpansionChanged: (value) { - print('$value'); - }, - initiallyExpanded: false, - children: const[CustomRadioListTile()], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Form/node1_base.dart b/packages/widgets/lib/StatefulWidget/Form/node1_base.dart deleted file mode 100644 index 1cf4dbd5..00000000 --- a/packages/widgets/lib/StatefulWidget/Form/node1_base.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 198, -// "name": 'Form基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onChanged】 : 表单变化回调 【VoidCallback】\n" -// "【onWillPop】 : 返回回调 【WillPopCallback】", -// } -class CustomForm extends StatefulWidget { - const CustomForm({Key? key}) : super(key: key); - - @override - _CustomFormState createState() => _CustomFormState(); -} - -class _CustomFormState extends State { - final GlobalKey _formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return Form( - onWillPop: () => _willPop(context), - key: _formKey, - onChanged: () { - print('Form---onChanged'); - }, - child: - Stack( - alignment: Alignment.centerRight, - children: [ - SizedBox( - width: 350, - child: UnconstrainedBox( - child: SizedBox( - width: 200, - height: 70, - child: TextFormField( - style: const TextStyle(textBaseline: TextBaseline.alphabetic), - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'username', - ), - validator: _validateUsername, - ), - ), - ), - ), - Positioned( - top: 0, right: 0, child: _buildSubmitButton(context)), - ], - ), - ); - } - - String? _validateUsername(value) { - if (value.isEmpty) { - return '用户名不能为空'; - } - return null; - } - - Widget _buildSubmitButton(BuildContext context) { - return ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - ), - onPressed: _onSubmit, - child: const Icon( - Icons.check, - color: Colors.white, - ), - ); - } - - void _onSubmit(){ - if(_formKey.currentState==null) return; - if (_formKey.currentState!.validate()) { - FocusScope.of(context).requestFocus(FocusNode()); - Navigator.of(context).pop(); - } - } - - Future _willPop(context) async { - return await showDialog( - context: context, - builder: (context) => AlertDialog( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - title: const Text('提示'), - content: const Text('你确定要离开此页吗?'), - actions: [ - ElevatedButton( - onPressed: () => Navigator.of(context).pop(true), - child: const Text('确定'), - ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(false), - child: const Text('取消'), - ), - ], - ), - ) ?? - false; - } -} diff --git a/packages/widgets/lib/StatefulWidget/FormField/node1_base.dart b/packages/widgets/lib/StatefulWidget/FormField/node1_base.dart deleted file mode 100644 index f687de2f..00000000 --- a/packages/widgets/lib/StatefulWidget/FormField/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: 222 FormField 表单字段 -/// 一个表单字段,需要在 Form 组件中使用,内含泛型 T 的字段作为状态量,对根据字段的更新和验证会触发相应回调。 -/// link:198,199,223, -// { -// "widgetId": 222, -// "name": 'FormField 介绍', -// "priority": 1, -// "subtitle": -// "【builder】 : 内容构造器 【FormFieldBuilder】\n" -// "【initialValue】 : 初始值 【T】\n" -// "【validator】 : 验证函数 【FormFieldValidator 】\n" -// "【enabled】 : 是否有效 【bool】\n" -// "【onSaved】 : 表单save时回调 【FormFieldSetter】", -// } -class FormFieldDemo extends StatelessWidget { - const FormFieldDemo({Key? key}) : super(key: key); - - final String info = - 'FormField 代表表单中的一个字段,对于字符串类型的字段,框架中封装了 TextFormField 以便使用;下拉选择的字段,用 DropdownButtonFormField。' - '目前框架中 FormField 的子类也只有这两个。既然是表单字段,必然是要和 Form 组件一起使用。通过对 Form 添加 GlobalKey ,来获取 FormState 对象。' - '当 FormState 调用 save 方法时,所有的 FormField 都会触发 onSave 方法,当 FormState 调用 validate 方法时,所有的 FormField 都会触发 validate 方法。'; - - - @override - Widget build(BuildContext context) { - - - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart deleted file mode 100644 index d0aacef9..00000000 --- a/packages/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 172, -// "name": 'FutureBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 子组件 【AsyncWidgetBuilder】\n" -// "【initialData】 : 初始数据 【T】\n" -// "【future】 : 异步任务 【Future】", -// } -class CustomFutureBuilder extends StatefulWidget { - const CustomFutureBuilder({Key? key}) : super(key: key); - - @override - _CustomFutureBuilderState createState() => _CustomFutureBuilderState(); -} - -class _CustomFutureBuilderState extends State { - late Future _future; - - @override - void initState() { - _future = loadData(); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - initialData: 'Load', - future: _future, - builder: (ctx, snap) { - if (snap.connectionState == ConnectionState.done) { - return Text('${snap.data}'); - } - if (snap.connectionState == ConnectionState.waiting) { - return const CircularProgressIndicator(); - } - if (snap.hasError) { - return const Text('Error'); - } - return Container(); - }); - } - - Future loadData() async { - await Future.delayed(const Duration(seconds: 2)); - return 'LoadeSuccess'; - } -} diff --git a/packages/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart b/packages/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart deleted file mode 100644 index efd87685..00000000 --- a/packages/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 250 GlowingOverscrollIndicator 孩子为可滑动列表,当滑动到顶部和底部时的指示效果,可指定颜色,没什么太大卵用。是Android和fuchsia系统默认滑动效果。 -// { -// "widgetId": 250, -// "name": '基本使用', -// "priority": 1, -// "subtitle": -// "【showLeading】 : 头部是否生效 【bool】\n" -// "【showTrailing】 : 底部是否生效 【bool】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【color】 : 颜色 【Color】\n" -// "【child】 : 子组件 【Widget】", -// } - -class GlowingOverscrollIndicatorDemo extends StatelessWidget { - GlowingOverscrollIndicatorDemo({Key? key}) : super(key: key); - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: GlowingOverscrollIndicator( - color: Colors.purple, - // showLeading: false, - // showTrailing: false, - axisDirection: AxisDirection.down, - child: ListView.builder( - itemBuilder: (_, index) => Container( - margin: const EdgeInsets.all(10), - height: 60, - color: data[index], - ), - itemCount: data.length, - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Hero/node1_base.dart b/packages/widgets/lib/StatefulWidget/Hero/node1_base.dart deleted file mode 100644 index 119a0f41..00000000 --- a/packages/widgets/lib/StatefulWidget/Hero/node1_base.dart +++ /dev/null @@ -1,128 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 171, -// "name": 'Hero基本使用', -// "priority": 1, -// "subtitle": -// "【tag】 : 标签 【String】\n", -// } -class CustomHero extends StatelessWidget { - const CustomHero({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Hero hero = Hero( - //----定义一个Hero,并添加tag标签,此中组件共享 - tag: 'user-head', - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(30)), - child: Image.asset( - "assets/images/icon_head.webp", - width: 60, - height: 60, - fit: BoxFit.cover, - ), - ), - ); - - Widget container = Container( - alignment: const Alignment(-0.8, -0.8), - child: hero, - width: 250, - height: 250 * 0.618, - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Colors.red.withAlpha(99), - Colors.yellow.withAlpha(189), - Colors.green.withAlpha(88), - Colors.blue.withAlpha(230) - ])), - ); - - return GestureDetector( - child: Card(elevation: 5, child: container), - onTap: () => Navigator.push( - context, - Bottom2TopRouter(child: const TargetPage(), duration: 1000), - ), - ); - } - -} - -class TargetPage extends StatelessWidget { - const TargetPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Hero hero = const Hero( - //----定义一个Hero,为其添加标签,两个标签相同,则可以共享 - tag: 'user-head', - child: Padding( - padding: EdgeInsets.all(6.0), - child: CircleAvatar( - backgroundColor: Colors.transparent, - backgroundImage: AssetImage( - "assets/images/icon_head.webp", - ), - ), - ), - ); - - Widget touch = InkWell( - onTap: () { - Navigator.of(context).pop(); - }, - child: hero, - ); - - return Scaffold( - appBar: AppBar( - actions: [touch], - ), - body: Container( - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Colors.red.withAlpha(99), - Colors.yellow.withAlpha(189), - Colors.green.withAlpha(88), - Colors.blue.withAlpha(230) - ])), - ), - ); - } -} - -//下--->上 -class Bottom2TopRouter extends PageRouteBuilder { - final Widget child; - final int duration; - final Curve curve; - - Bottom2TopRouter({ - required this.child, - this.duration = 500, - this.curve = Curves.fastOutSlowIn, - }) : super( - transitionDuration: Duration(milliseconds: duration), - pageBuilder: (ctx, a1, a2) { - return child; - }, - transitionsBuilder: ( - ctx, - a1, - a2, - Widget child, - ) => SlideTransition( - position: Tween( - begin: const Offset(0.0, 1.0), - end: const Offset(0.0, 0.0), - ).animate(CurvedAnimation(parent: a1, curve: curve)), - child: child)); -} diff --git a/packages/widgets/lib/StatefulWidget/Image/node1_base.dart b/packages/widgets/lib/StatefulWidget/Image/node1_base.dart deleted file mode 100644 index 42ca2bfb..00000000 --- a/packages/widgets/lib/StatefulWidget/Image/node1_base.dart +++ /dev/null @@ -1,38 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '可从资源文件和网络加载图片', -// "priority": 1, -// "subtitle": "Image.asset加载资源图片,指定路径;\n" -// "Image.network加载资源网络图片,指定链接。\n" -// "Image.file加载资源文件图片,指定路径。\n" -// "Image.memory加载内存图片,指定字节数组。\n" -// "【height】 : 宽 【double】\n" -// "【width】: 高 【double】" -// } - -class LoadImage extends StatelessWidget { - const LoadImage({Key? key}) : super(key: key); - - final String assetsImagePath = "assets/images/icon_head.webp"; - final String netImageUrl = "https://p9-juejin.byteimg.com/" - "/tos-cn-i-k3u1fbpfcp/36dee4e4dceb4c41a93df4a3603439fe~" - "tplv-k3u1fbpfcp-zoom-crop-mark:1304:1304:1304:734.awebp"; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: [ - Image.asset(assetsImagePath, height: 80, width: 80), - _loadFromNet(), - ], - ); - } - - Widget _loadFromNet() => Image.network(netImageUrl, height: 80); -} diff --git a/packages/widgets/lib/StatefulWidget/Image/node2_fit.dart b/packages/widgets/lib/StatefulWidget/Image/node2_fit.dart deleted file mode 100644 index 0155c389..00000000 --- a/packages/widgets/lib/StatefulWidget/Image/node2_fit.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片的适应模式', -// "priority": 2, -// "subtitle": "【fit】 : 适应模式*7 【BoxFit】\n", -// }, - -class FitImage extends StatefulWidget { - const FitImage({Key? key}) : super(key: key); - - @override - _FitImageState createState() => _FitImageState(); -} - -class _FitImageState extends State { - bool _smallImage = false; - - @override - Widget build(BuildContext context) { - List imageLi = BoxFit.values - .toList() - .map((mode) => Column(children:[ - Container( - margin: const EdgeInsets.all(5), - width: 100, - height: 80, - color: Colors.grey.withAlpha(88), - child: Image( - image: AssetImage(!_smallImage - ? "assets/images/wy_300x200.webp" - : "assets/images/wy_30x20.webp"), - fit: mode)), - Text(mode.toString().split(".")[1]) - ])).toList(); - - return Wrap( - children: [...imageLi, _buildSwitch()], - ); - } - - Widget _buildSwitch() { - return Container( - alignment: Alignment.center, - width: 200, - height: 100, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text("使用小图"), - Switch( - value: _smallImage, - onChanged: (b) => setState(() => _smallImage = b)), - ], - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Image/node3_alignment.dart b/packages/widgets/lib/StatefulWidget/Image/node3_alignment.dart deleted file mode 100644 index 75f33e7b..00000000 --- a/packages/widgets/lib/StatefulWidget/Image/node3_alignment.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片对齐模式', -// "priority": 3, -// "subtitle": "【alignment】 : 颜色 【AlignmentGeometry】\n" -// " 常用Alignment类的九个静态常量,但也可定制位置", -// }, - -class AlignmentImage extends StatelessWidget { - const AlignmentImage({Key? key}) : super(key: key); - - final List alignment = const[ - Alignment.center, - Alignment.centerLeft, - Alignment.centerRight, - Alignment.topCenter, - Alignment.topLeft, - Alignment.topRight, - Alignment.bottomCenter, - Alignment.bottomLeft, - Alignment.bottomRight - ]; //测试数组 - - @override - Widget build(BuildContext context) { - List imgLi = alignment - .map((alignment) => //生成子Widget列表 - Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 90, - height: 60, - color: Colors.grey.withAlpha(88), - child: Image( - image: const AssetImage("assets/images/wy_30x20.webp"), - alignment: alignment, - )), - Text(alignment.toString().split(".")[1]) - ])) - .toList(); - var imageAlignment = Wrap(children: imgLi); - return imageAlignment; - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart b/packages/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart deleted file mode 100644 index 95086264..00000000 --- a/packages/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart +++ /dev/null @@ -1,31 +0,0 @@ - -import 'package:flutter/material.dart'; - - - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片实现局部放大', -// "priority": 6, -// "subtitle": "【centerSlice】 : 保留的区域 【Rect】", -// }, - -class CenterSliceImage extends StatelessWidget { - const CenterSliceImage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 300, - height: 80, - child: Image.asset( - "assets/images/right_chat.png", - centerSlice: const Rect.fromLTRB(9, 27, 60, 27 + 1.0), - fit: BoxFit.fill, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Ink/node1_base.dart b/packages/widgets/lib/StatefulWidget/Ink/node1_base.dart deleted file mode 100644 index c8345204..00000000 --- a/packages/widgets/lib/StatefulWidget/Ink/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 152, -// "name": 'Ink基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】\n" -// "【color】 : 颜色 【Color】", -// } -class CustomInk extends StatelessWidget { - const CustomInk({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Material( - color: Colors.orangeAccent, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Center( - child: Ink( - padding: const EdgeInsets.all(10), - decoration: const BoxDecoration( - color: Colors.yellow, - borderRadius: BorderRadius.all(Radius.circular(20))), - width: 200.0, - height: 100.0, - child: InkWell( - onTap: () {}, - child: const Center(child: Text('Hello')), - ), - ), - ), - ), - ); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/Ink/node2_image.dart b/packages/widgets/lib/StatefulWidget/Ink/node2_image.dart deleted file mode 100644 index 5041a018..00000000 --- a/packages/widgets/lib/StatefulWidget/Ink/node2_image.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 152, -// "name": 'Ink.image图片水波纹', -// "priority": 2, -// "subtitle": " 其中属性与Image组件一致,详见Image组件", -// } - -class InkImage extends StatelessWidget { - const InkImage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Material( - color: Colors.grey[800], - child: Center( - child: Ink.image( - image: const AssetImage('assets/images/sabar.webp'), - fit: BoxFit.cover, - width: 300.0, - height: 200.0, - child: InkWell( - onTap: () {}, - child: const Align( - alignment: Alignment.topLeft, - child: Padding( - padding: EdgeInsets.all(10.0), - child: Text('Chaos', - style: TextStyle( - fontWeight: FontWeight.w900, color: Colors.black)), - ), - )), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/InkResponse/node1_base.dart b/packages/widgets/lib/StatefulWidget/InkResponse/node1_base.dart deleted file mode 100644 index 0fcbdb5e..00000000 --- a/packages/widgets/lib/StatefulWidget/InkResponse/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 149, -// "name": 'InkResponse基本事件', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onTapCancel】 : 点击取消 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】", -// } - -class CustomInkResponse extends StatefulWidget { - const CustomInkResponse({Key? key}) : super(key: key); - - @override - _CustomInkResponseState createState() => _CustomInkResponseState(); -} - -class _CustomInkResponseState extends State { - String _info = 'Push'; - - @override - Widget build(BuildContext context) { - return InkResponse( - onTap: () => setState(() => _info = 'onTap'), - onDoubleTap: () => setState(() => _info = 'onDoubleTap'), - onLongPress: () => setState(() => _info = 'onLongPress'), - onTapCancel: () => setState(() => _info = 'onTapCancel'), - child: Container( - alignment: Alignment.center, - width: 200, - height: 100, - child: Text(_info), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/InkResponse/node2_color.dart b/packages/widgets/lib/StatefulWidget/InkResponse/node2_color.dart deleted file mode 100644 index d5d61473..00000000 --- a/packages/widgets/lib/StatefulWidget/InkResponse/node2_color.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 149, -// "name": 'InkResponse其他属性', -// "priority": 2, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n" -// "【highlightColor】 : 高亮色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【radius】 : 水波半径 【double】", -// } - -class ColorInkResponse extends StatefulWidget { - const ColorInkResponse({Key? key}) : super(key: key); - - @override - _ColorInkResponseState createState() => _ColorInkResponseState(); -} - -class _ColorInkResponseState extends State { - String _info = 'Push'; - - @override - Widget build(BuildContext context) { - return InkResponse( - onTap: () => {}, - splashColor: Colors.blueAccent, - highlightColor: Colors.orange, - onHighlightChanged: (v) => - setState(() => _info = 'onHighlightChanged:$v'), - radius: 50, - child: Container( - alignment: Alignment.center, - width: 200, - height: 100, - child: Text(_info), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/InkWell/node1_base.dart b/packages/widgets/lib/StatefulWidget/InkWell/node1_base.dart deleted file mode 100644 index d0e0ed50..00000000 --- a/packages/widgets/lib/StatefulWidget/InkWell/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 150, -// "name": 'InkWell基本事件', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onTapCancel】 : 点击取消 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】", -// } - -class CustomInkWell extends StatefulWidget { - const CustomInkWell({Key? key}) : super(key: key); - - @override - _CustomInkWellState createState() => _CustomInkWellState(); -} - -class _CustomInkWellState extends State { - String _info = 'Push'; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: () => setState(() => _info = 'onTap'), - onDoubleTap: () => setState(() => _info = 'onDoubleTap'), - onLongPress: () => setState(() => _info = 'onLongPress'), - onTapCancel: () => setState(() => _info = 'onTapCancel'), - child: Container( - alignment: Alignment.center, - width: 120, - height: 50, - child: Text(_info), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/InkWell/node2_color.dart b/packages/widgets/lib/StatefulWidget/InkWell/node2_color.dart deleted file mode 100644 index ba752c6c..00000000 --- a/packages/widgets/lib/StatefulWidget/InkWell/node2_color.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 150, -// "name": 'InkWell其他属性', -// "priority": 2, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n" -// "【highlightColor】 : 高亮色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【radius】 : 水波半径 【double】", -// } - -class ColorInkWell extends StatefulWidget { - const ColorInkWell({Key? key}) : super(key: key); - - @override - _ColorInkWellState createState() => _ColorInkWellState(); -} - -class _ColorInkWellState extends State { - String _info = 'Push'; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: () => {}, - splashColor: Colors.blueAccent, - highlightColor: Colors.orange, - onHighlightChanged: (v) => - setState(() => _info = 'onHighlightChanged:$v'), - radius: 50, - child: Container( - alignment: Alignment.center, - width: 180, - height: 50, - child: Text(_info), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart b/packages/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart deleted file mode 100644 index 0990e86d..00000000 --- a/packages/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 231 InputDecorator 输入装饰 在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。 -// { -// "widgetId": 231, -// "name": "InputDecorator基本使用", -// "priority": 1, -// "subtitle": "【decoration】 : 装饰对象 【InputDecoration】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【child】 : 子组件 【Widget】", -// } - -class InputDecoratorDemo extends StatelessWidget { - const InputDecoratorDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: InputDecorator( - decoration: const InputDecoration(), - child: EditableText( - controller: TextEditingController(text:'hello'), - focusNode: FocusNode(), - style: const TextStyle(fontSize: 12,color: Colors.black), - cursorColor: Colors.blue, - backgroundCursorColor: Colors.orange, - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart b/packages/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart deleted file mode 100644 index e944cb43..00000000 --- a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 351 InteractiveViewer 交互视图 主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。 -// { -// "widgetId": 351, -// "name": "InteractiveViewer基本使用", -// "priority": 1, -// "subtitle": "【alignPanAxis】 : 沿轴拖动 【bool】\n" -// "【boundaryMargin】 : 边界边距 【EdgeInsets】\n" -// "【panEnabled】 : 是否可平移 【bool】\n" -// "【scaleEnabled】 : 是否可缩放 【bool】\n" -// "【maxScale】 : 最大放大倍数 【double】\n" -// "【minScale】 : 最小缩小倍数 【double】\n" -// "【onInteractionEnd】 : 交互结束回调 【GestureScaleEndCallback】\n" -// "【onInteractionStart】 : 交互开始回调 【GestureScaleStartCallback】\n" -// "【onInteractionUpdate】 : 交互更新回调 【GestureScaleUpdateCallback】\n" -// "【child】 : 游标颜色 【Widget】", -// } - -class InteractiveViewerDemo extends StatelessWidget { - const InteractiveViewerDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: 150, - color: Colors.grey.withAlpha(33), - child: InteractiveViewer( - boundaryMargin: const EdgeInsets.all(40.0), - maxScale: 2.5, - minScale: 0.3, - panEnabled: true, - scaleEnabled: true, - child: Image.asset('assets/images/caver.webp'), - onInteractionStart: _onInteractionStart, - onInteractionUpdate: _onInteractionUpdate, - onInteractionEnd: _onInteractionEnd, - ), - ); - } - - void _onInteractionStart(ScaleStartDetails details) { - print('onInteractionStart----' + details.toString()); - } - - void _onInteractionUpdate(ScaleUpdateDetails details) { - print('onInteractionUpdate----' + details.toString()); - } - - void _onInteractionEnd(ScaleEndDetails details) { - print('onInteractionEnd----' + details.toString()); - } -} diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart b/packages/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart deleted file mode 100644 index bf6d633d..00000000 --- a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 351, -// "name": "变换控制器的使用", -// "priority": 3, -// "subtitle": "【transformationController】 : 变换控制器 【TransformationController】", -// } - -class InteractiveViewerDemo3 extends StatefulWidget { - const InteractiveViewerDemo3({Key? key}) : super(key: key); - - @override - _InteractiveViewerDemo3State createState() => _InteractiveViewerDemo3State(); -} - -class _InteractiveViewerDemo3State extends State - with SingleTickerProviderStateMixin { - final TransformationController _transformationController = - TransformationController(); - late Animation _animationReset; - late AnimationController _controllerReset; - - void _onAnimateReset() { - _transformationController.value = _animationReset.value; - if (!_controllerReset.isAnimating) { - _animationReset.removeListener(_onAnimateReset); - _controllerReset.reset(); - } - } - - void _animateResetInitialize() { - _controllerReset.reset(); - _animationReset = Matrix4Tween( - begin: _transformationController.value, - end: Matrix4.identity(), - ).animate(_controllerReset); - _animationReset.addListener(_onAnimateReset); - _controllerReset.forward(); - } - - void _animateResetStop() { - _controllerReset.stop(); - _animationReset.removeListener(_onAnimateReset); - _controllerReset.reset(); - } - - void _onInteractionStart(ScaleStartDetails details) { - if (_controllerReset.status == AnimationStatus.forward) { - _animateResetStop(); - } - } - - @override - void initState() { - super.initState(); - _controllerReset = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 400), - ); - } - - @override - void dispose() { - _controllerReset.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Wrap( - direction: Axis.vertical, - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - alignment: WrapAlignment.center, - children: [ - Container( - height: 150, - color: Colors.grey.withAlpha(33), - child: InteractiveViewer( - boundaryMargin: const EdgeInsets.all(40), - transformationController: _transformationController, - minScale: 0.1, - maxScale: 1.8, - onInteractionStart: _onInteractionStart, - child: Image.asset('assets/images/caver.webp'), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _buildButton(), - _buildButton2(), - _buildButton3(), - ], - ) - ], - ); - } - - Widget _buildButton() { - return MaterialButton( - child: const Icon( - Icons.refresh, - color: Colors.white, - ), - color: Colors.green, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onPressed: _animateResetInitialize); - } - - final double _x = 0.0; - - Widget _buildButton2() { - return MaterialButton( - child: const Icon( - Icons.navigate_before, - color: Colors.white, - ), - color: Colors.green, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onPressed: () { - var temp = _transformationController.value.clone(); - temp.translate(_x - 4); - _transformationController.value = temp; - }); - } - - Widget _buildButton3() { - return MaterialButton( - child: const Icon( - Icons.navigate_next, - color: Colors.white, - ), - color: Colors.green, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onPressed: () { - var temp = _transformationController.value.clone(); - temp.translate(_x + 4); - _transformationController.value = temp; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart b/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart deleted file mode 100644 index f9e13523..00000000 --- a/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 145, -// "name": 'LicensePage基本使用', -// "priority": 1, -// "subtitle": "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】", -// } -class CustomLicensePage extends StatelessWidget { - const CustomLicensePage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: 400, - child: const LicensePage( - applicationIcon: FlutterLogo(), - applicationVersion: 'v0.0.1', - applicationName: 'Flutter Unit', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart b/packages/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart deleted file mode 100644 index a124eb33..00000000 --- a/packages/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 47, -// "name": 'LinearProgressIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 进度 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【valueColor】 : 进度颜色 【Animation】\n" -// " value为null时会不停循环", -// } -class CustomLinearProgressIndicator extends StatefulWidget { - const CustomLinearProgressIndicator({Key? key}) : super(key: key); - - @override - _CustomLinearProgressIndicatorState createState() => - _CustomLinearProgressIndicatorState(); -} - -class _CustomLinearProgressIndicatorState - extends State { - List data = [0.2, 0.4, 0.6, 0.8, null]; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: data - .map((e) => SizedBox( - width: 50, - height: 3, - child:LinearProgressIndicator( - value: e, - backgroundColor: Colors.grey.withAlpha(33), - valueColor: const AlwaysStoppedAnimation(Colors.orange), - ), - )) - .toList(), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart b/packages/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart deleted file mode 100644 index b62dc3d3..00000000 --- a/packages/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 179, -// "name": 'ListWheelScrollView基本使用', -// "priority": 1, -// "subtitle": "【children】 : 子组件列表 【List】\n" -// "【perspective】 : 透视度 【double】\n" -// "【itemExtent】 : item高 【EdgeInsets】\n" -// "【onSelectedItemChanged】 : 选中回调 【ValueChanged 】", -// } -class CustomListWheelScrollView extends StatefulWidget { - const CustomListWheelScrollView({Key? key}) : super(key: key); - - @override - _CustomListWheelScrollViewState createState() => - _CustomListWheelScrollViewState(); -} - -class _CustomListWheelScrollViewState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - Color _color = Colors.blue; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildCircle(), - SizedBox( - height: 150, - width: 300, - child: ListWheelScrollView( - perspective: 0.006, - itemExtent: 50, - onSelectedItemChanged: (index) { - print('onSelectedItemChanged:$index'); - setState(() => _color = data[index]); - }, - children: data.map((color) => _buildItem(color)).toList(), - ), - ), - ], - ); - } - - Widget _buildCircle() => Container( - margin: const EdgeInsets.only(bottom: 5), - width: 30, - height: 30, - decoration: BoxDecoration(color: _color, shape: BoxShape.circle), - ); - - Widget _buildItem(Color color) { - return Container( - key: ValueKey(color) , - alignment: Alignment.center, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart b/packages/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart deleted file mode 100644 index 727a5b43..00000000 --- a/packages/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 105, -// "name": 'LongPressDraggable与DragTarget联用', -// "priority": 1, -// "subtitle": "【child】 : 孩子 【Widget】\n" -// "【feedback】 : 拖拽时的孩子 【Widget】\n" -// "【axis】 : 拖动的轴 【Axis】\n" -// "【data】 : 数据 【T】\n" -// "【onDragStarted】 : 开始拖拽 【Function()】\n" -// "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n" -// "【onDragCompleted】 : 拖拽完成 【Function()】\n" -// "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】", -// } -class CustomLongPressDraggable extends StatefulWidget { - const CustomLongPressDraggable({Key? key}) : super(key: key); - - @override - _CustomLongPressDraggableState createState() => - _CustomLongPressDraggableState(); -} - -class _CustomLongPressDraggableState extends State { - Color _color = Colors.grey; - String _info = 'DragTarget'; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Wrap( - children: _buildColors(), - spacing: 10, - ), - const SizedBox(height: 20), - _buildDragTarget() - ], - ); - } - - final List colors = const [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green, - Colors.orange, - Colors.purple, - Colors.cyanAccent - ]; - - List _buildColors() => colors - .map( - (e) => LongPressDraggable( - onDragStarted: () => setState(() => _info = '开始拖拽'), - onDragEnd: (d) => setState(() => _info = '结束拖拽'), - onDragCompleted: () => _info = '拖拽完成', - onDraggableCanceled: (v, o) => _info = '拖拽取消', - child: Container( - width: 30, - height: 30, - alignment: Alignment.center, - child: Text( - colors.indexOf(e).toString(), - style: const TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - ), - decoration: BoxDecoration(color: e, shape: BoxShape.circle), - ), - data: e, - feedback: Container( - width: 25, - height: 25, - decoration: BoxDecoration(color: e, shape: BoxShape.circle), - )), - ) - .toList(); - - Widget _buildDragTarget() { - return DragTarget( - onAccept: (data) => setState(() { - _info='onAccept'; - _color = data; - }), - builder: (context, candidateData, rejectedData) => Container( - width: 150.0, - height: 50.0, - color: _color, - child: Center( - child: Text( - _info, - style: const TextStyle(color: Colors.white), - ), - ))); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Material/node1_base.dart b/packages/widgets/lib/StatefulWidget/Material/node1_base.dart deleted file mode 100644 index 4e78c440..00000000 --- a/packages/widgets/lib/StatefulWidget/Material/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 160, -// "name": 'Material基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【type】 : 类型 【MaterialType】\n" -// "【elevation】 : 影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【color】 : 颜色 【Color】", -// } -class CustomMaterial extends StatelessWidget { - const CustomMaterial({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - runSpacing: 10, - children: MaterialType.values.map((e) => _buildMaterial(e)).toList()); - } - - Material _buildMaterial(MaterialType type) => Material( - shadowColor: Colors.blue, - type: type, - color: Colors.orange, - elevation: 3, - child: Container( - alignment: Alignment.center, - width: 100, - height: 60, - child: Text( - type.toString().split('.')[1], - style: const TextStyle(color: Colors.black), - ), - ), - ); -} diff --git a/packages/widgets/lib/StatefulWidget/Material/node2_shape.dart b/packages/widgets/lib/StatefulWidget/Material/node2_shape.dart deleted file mode 100644 index 58872e81..00000000 --- a/packages/widgets/lib/StatefulWidget/Material/node2_shape.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 160, -// "name": 'Material的shape属性', -// "priority": 2, -// "subtitle": -// "【shape】 : 形状 【ShapeBorder】\n", -// } -class ShapeMaterial extends StatelessWidget { - const ShapeMaterial({Key? key}) : super(key: key); - - final Map shapeMap = const { - 'BorderDirectional': BorderDirectional( - top: BorderSide( - color: Colors.white, - ), - start: BorderSide(color: Colors.black, width: 15), - bottom: BorderSide( - color: Colors.white, - )), - 'Border': Border( - top: BorderSide(width: 5.0, color: Color(0xFFDFDFDF)), - left: BorderSide(width: 5.0, color: Color(0xFFDFDFDF)), - right: BorderSide(width: 5.0, color: Color(0xFF7F7F7F)), - bottom: BorderSide(width: 5.0, color: Color(0xFF7F7F7F)), - ), - 'Circle': CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - 'RoundedRectangleBorder': RoundedRectangleBorder( - side: BorderSide(width: 1.0, color: Colors.black), - borderRadius: BorderRadius.all(Radius.circular(15))), - 'ContinuousRectangleBorder': ContinuousRectangleBorder( - side: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(40.0)), - ) - }; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - runSpacing: 10, - children: shapeMap.keys.map((e) => _buildMaterial(e)).toList(), - ); - } - - Material _buildMaterial(String type) => Material( - shadowColor: Colors.blue, - shape: shapeMap[type], - color: Colors.orange, - elevation: 3, - textStyle: const TextStyle(color: Colors.white), - child: Container( - alignment: Alignment.center, - width: 300, - height: 60, - child: Text( - type, - ), - ), - ); -} diff --git a/packages/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart b/packages/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart deleted file mode 100644 index a2b7b013..00000000 --- a/packages/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-17 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 65, -// "name": 'MaterialApp基本用法', -// "priority": 1, -// "subtitle": "【theme】 : 主题 【ThemeData】\n" -// "【title】 : 任务栏标题 【String】\n" -// "【debugShowCheckedModeBanner】 : 开启角标 【bool】\n" -// "【showPerformanceOverlay】 : 开启性能浮层 【bool】\n" -// "【debugShowMaterialGrid】 : 开启网格 【bool】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【home】 : 主页 【Widget】", -// } -class MaterialAppDemo extends StatefulWidget { - const MaterialAppDemo({Key? key}) : super(key: key); - - @override - _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); -} - -class _WidgetsAppDemoState extends State { - bool _debugShowCheckedModeBanner = false; - bool _showPerformanceOverlay = false; - bool _debugShowMaterialGrid = false; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildSwitchers(), - SizedBox( - height: 250, - child: MaterialApp( - debugShowCheckedModeBanner: _debugShowCheckedModeBanner, - showPerformanceOverlay: _showPerformanceOverlay, - debugShowMaterialGrid: _debugShowMaterialGrid, - home: const HomePage(), - ), - ), - ], - ); - } - - Widget _buildSwitchers() { - return DefaultTextStyle( - style: const TextStyle(color: Colors.blue), - child: Wrap( - spacing: 10, - children: [ - Column( - children: [ - Switch( - value: _showPerformanceOverlay, - onChanged: (v) { - setState(() { - _showPerformanceOverlay = v; - }); - }, - ), - const Text('性能浮层') - ], - ), - Column( - children: [ - Switch( - value: _debugShowCheckedModeBanner, - onChanged: (v) { - setState(() { - _debugShowCheckedModeBanner = v; - }); - }, - ), - const Text('开启角标') - ], - ), - Column( - children: [ - Switch( - value: _debugShowMaterialGrid, - onChanged: (v) { - setState(() { - _debugShowMaterialGrid = v; - }); - }, - ), - const Text('开启网格') - ], - ) - ], - ), - ); - } -} - -class HomePage extends StatefulWidget { - const HomePage({Key? key}) : super(key: key); - - @override - _HomePageState createState() => _HomePageState(); -} - -class _HomePageState extends State { - var _count = 0; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - alignment: const Alignment(0, 0.7), - child: Text( - '你点击了$_count次', - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () { - setState(() { - _count++; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart b/packages/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart deleted file mode 100644 index 18472167..00000000 --- a/packages/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart +++ /dev/null @@ -1,83 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 261 MergeableMaterial 可合并材料 用于展示 MergeableMaterialItem 的列表,包括 MaterialSlice(主体) 和 MaterialGap(分隔) 。 -// { -// "widgetId": 261, -// "name": 'MergeableMaterial基本使用', -// "priority": 1, -// "subtitle": -// "【elevation】 : 影深 【double】\n" -// "【hasDividers】 : 是否有分隔线 【bool】\n" -// "【dividerColor】 : 分隔线颜色 【Color】\n" -// "【mainAxis】 : 轴向 【Axis】\n" -// "【children】 : 子组件集 【List】", -// } - -class MergeableMaterialDemo extends StatefulWidget { - const MergeableMaterialDemo({Key? key}) : super(key: key); - - @override - _MergeableMaterialDemoState createState() => _MergeableMaterialDemoState(); -} - -class _MergeableMaterialDemoState extends State { - List items=[]; - - @override - void initState() { - super.initState(); - _init(20); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: SingleChildScrollView( - child: MergeableMaterial( - elevation: 1, - hasDividers: true, - dividerColor: Colors.red, - children: items, - ), - ), - ); - } - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]! - ]; - - void _init(int count) { - for (int i = 0; i < count; i++) { - items.add(MaterialSlice( - key: ValueKey(i), - child: Container( - alignment: Alignment.center, - height: 60, - color: data[i % data.length], - child: Text(colorString(data[i % data.length])), - ))); - if(i!=count-1){ - items.add(MaterialGap( - key: ValueKey(i), - size: 5)); - } - } - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart b/packages/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart deleted file mode 100644 index af9d3653..00000000 --- a/packages/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 135, -// "name": 'MonthPicker基本使用', -// "priority": 1, -// "subtitle": "【selectedDate】 : 选中日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } -class CustomMonthPicker extends StatelessWidget{ - const CustomMonthPicker({Key? key}) : super(key: key); - - final String info = - 'MonthPicker 月份期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } - - // final DateTime _date = DateTime.now(); - // - // @override - // Widget build(BuildContext context) { - // return SizedBox( - // height: 350, - // child: MonthPicker( - // selectedDate: _date, - // onChanged: (date) => setState(() => _date = date), - // firstDate: DateTime(2018), - // lastDate: DateTime(2030), - // ), - // ); - // } -} diff --git a/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart b/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart deleted file mode 100644 index e5f7a6d8..00000000 --- a/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart +++ /dev/null @@ -1,71 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 293 MouseRegion 用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。 -// { -// "widgetId": 293, -// "name": "MouseRegion基本使用", -// "priority": 1, -// "subtitle": "【onEnter】 : 移入事件 【PointerEnterEventListener】\n" -// "【onHover】: 移动事件 【PointerHoverEventListener】\n" -// "【onExit】: 移出事件 【PointerExitEventListener】", -// } - -class MouseRegionDemo extends StatefulWidget { - const MouseRegionDemo({Key? key}) : super(key: key); - - @override - _MouseRegionDemoState createState() => _MouseRegionDemoState(); -} - -class _MouseRegionDemoState extends State { - int _enterCounter = 0; - int _exitCounter = 0; - double x = 0.0; - double y = 0.0; - void _incrementEnter(PointerEvent details) { - setState(() { - _enterCounter++; - }); - } - void _incrementExit(PointerEvent details) { - setState(() { - _exitCounter++; - }); - } - void _updateLocation(PointerEvent details) { - setState(() { - x = details.position.dx; - y = details.position.dy; - }); - } - @override - Widget build(BuildContext context) { - return ConstrainedBox( - constraints: BoxConstraints.tight(const Size(300.0, 200.0)), - child: MouseRegion( - onEnter: _incrementEnter, - onHover: _updateLocation, - onExit: _incrementExit, - child: Container( - color: Colors.lightBlueAccent, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('你的鼠标移入移除信息:'), - Text( - '$_enterCounter Entries\n$_exitCounter Exits', - style: Theme.of(context).textTheme.headline4, - ), - Text( - 'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})', - ), - ], - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart b/packages/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart deleted file mode 100644 index b4913d37..00000000 --- a/packages/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2022/7/23 -/// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 基本使用", -// "priority": 1, -// "subtitle": "【destinations】 : 菜单数据列表 【List】\n" -// "【selectedIndex】: 激活索引 【int】\n" -// "【labelType】: 标签样式 【NavigationRailLabelType?】\n" -// "【onDestinationSelected】: 菜单点击事件 【ValueChanged?】", -// } - -class CustomNavigationRail extends StatefulWidget { - const CustomNavigationRail({Key? key}) : super(key: key); - - @override - State createState() => _CustomNavigationRailState(); -} - -class _CustomNavigationRailState extends State { - final PageController _controller = PageController(); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - _NavigationRailDemo( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) - ], - ); - } - - void _onDestinationSelected(int value) { - _controller.jumpToPage(value); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class _TestContent extends StatelessWidget { - final String content; - - const _TestContent({Key? key, required this.content}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Text( - content, - style: const TextStyle(fontSize: 26), - )); - } -} - -class _NavigationRailDemo extends StatefulWidget { - final ValueChanged? onDestinationSelected; - - const _NavigationRailDemo({Key? key, this.onDestinationSelected}) - : super(key: key); - - @override - State<_NavigationRailDemo> createState() => _NavigationRailDemoState(); -} - -class _NavigationRailDemoState extends State<_NavigationRailDemo> { - int _selectIndex = 0; - - final List destinations = const [ - NavigationRailDestination( - icon: Icon(Icons.message_outlined), label: Text("消息")), - NavigationRailDestination( - icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), - NavigationRailDestination( - icon: Icon(Icons.book_outlined), label: Text("通讯录")), - NavigationRailDestination( - icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), - NavigationRailDestination( - icon: Icon(Icons.games_sharp), label: Text("工作台")), - NavigationRailDestination( - icon: Icon(Icons.calendar_month), label: Text("日历")) - ]; - - @override - Widget build(BuildContext context) { - return NavigationRail( - onDestinationSelected: _onDestinationSelected, - labelType: NavigationRailLabelType.all, - destinations: destinations, - selectedIndex: _selectIndex, - ); - } - - void _onDestinationSelected(int value) { - _selectIndex = value; - setState(() {}); - widget.onDestinationSelected?.call(value); - } -} diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart b/packages/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart deleted file mode 100644 index 61638bdb..00000000 --- a/packages/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart +++ /dev/null @@ -1,146 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2022/7/23 -/// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 折叠效果", -// "priority": 2, -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【leading】: 首组件 【Widget?】\n" -// "【trailing】: 尾组件 【Widget?】\n" -// "【extended】: 是否展开 【bool】", -// } - -class ExtendableNavigationRail extends StatefulWidget { - const ExtendableNavigationRail({Key? key}) : super(key: key); - - @override - State createState() => _ExtendableNavigationRailState(); -} - -class _ExtendableNavigationRailState extends State { - final PageController _controller = PageController(); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - ExtendableNavigation( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) - ], - ); - } - - void _onDestinationSelected(int value) { - _controller.jumpToPage(value); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class _TestContent extends StatelessWidget { - final String content; - - const _TestContent({Key? key, required this.content}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Text( - content, - style: const TextStyle(fontSize: 26), - )); - } -} - -class ExtendableNavigation extends StatefulWidget { - final ValueChanged? onDestinationSelected; - - const ExtendableNavigation({Key? key, this.onDestinationSelected}) - : super(key: key); - - @override - State createState() => _ExtendableNavigationState(); -} - -class _ExtendableNavigationState extends State { - int _selectIndex = 0; - bool _extended = false; - - final List destinations = const [ - NavigationRailDestination( - icon: Icon(Icons.message_outlined), label: Text("消息")), - NavigationRailDestination( - icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), - NavigationRailDestination( - icon: Icon(Icons.book_outlined), label: Text("通讯录")), - NavigationRailDestination( - icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), - NavigationRailDestination( - icon: Icon(Icons.games_sharp), label: Text("工作台")), - NavigationRailDestination( - icon: Icon(Icons.calendar_month), label: Text("日历")) - ]; - - Widget buildLeading() { - return GestureDetector( - onTap: _toggleExtended, - child: const Icon( - Icons.menu_open, - color: Colors.grey, - )); - } - - @override - Widget build(BuildContext context) { - return NavigationRail( - leading: buildLeading(), - extended: _extended, - elevation: 1, - trailing: const Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: EdgeInsets.only(bottom: 20.0), - child: FlutterLogo(), - ), - ), - ), - onDestinationSelected: _onDestinationSelected, - destinations: destinations, - selectedIndex: _selectIndex, - ); - } - - void _onDestinationSelected(int value) { - _selectIndex = value; - setState(() {}); - widget.onDestinationSelected?.call(value); - } - - void _toggleExtended() { - setState(() { - _extended = !_extended; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart b/packages/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart deleted file mode 100644 index 02315f81..00000000 --- a/packages/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart +++ /dev/null @@ -1,176 +0,0 @@ - -import 'package:flutter/material.dart'; - - - -// minWidth: 72, -// minExtendedWidth: 200 , -// unselectedIconTheme: const IconThemeData(color: textColor) , -// selectedIconTheme: const IconThemeData(color: activeColor) , -// unselectedLabelTextStyle: labelStyle, -// selectedLabelTextStyle: labelStyle, - -/// create by 张风捷特烈 on 2022/7/23 -/// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 样式", -// "priority": 3, -// "subtitle": "【useIndicator】 : 是否显示指示器 【bool】\n" -// "【indicatorColor】: 指示器颜色 【Color?】\n" -// "【backgroundColor】: 背景色 【Color?】\n" -// "【labelType】: 标签样式 【NavigationRailLabelType?】\n" -// "【selectedIconTheme】: 选中图标样式 【IconThemeData?】\n" -// "【unselectedIconTheme】: 未选中图标样式 【IconThemeData?】\n" -// "【selectedLabelTextStyle】: 选中文字样式 【TextStyle?】\n" -// "【unselectedLabelTextStyle】: 未选中文字样式 【TextStyle?】\n" -// "【minExtendedWidth】: 展开宽度 【double?】\n" -// "【minWidth】: 未展开宽度 【double?】", -// } - - -class DarkNavigationRail extends StatefulWidget { - const DarkNavigationRail({Key? key}) : super(key: key); - - @override - State createState() => _DarkNavigationRailState(); -} - -class _DarkNavigationRailState extends State { - final PageController _controller = PageController(); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - DarkExtendableNavigation( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) - ], - ); - } - - void _onDestinationSelected(int value) { - _controller.jumpToPage(value); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class _TestContent extends StatelessWidget { - final String content; - - const _TestContent({Key? key, required this.content}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Text( - content, - style: const TextStyle(fontSize: 26), - )); - } -} - -class DarkExtendableNavigation extends StatefulWidget { - final ValueChanged? onDestinationSelected; - - const DarkExtendableNavigation({Key? key, this.onDestinationSelected}) - : super(key: key); - - @override - State createState() => _DarkExtendableNavigationState(); -} - -class _DarkExtendableNavigationState extends State { - int _selectIndex = 0; - bool _extended = false; - - final List destinations = const [ - NavigationRailDestination( - icon: Icon(Icons.message_outlined), label: Text("消息")), - NavigationRailDestination( - icon: Icon(Icons.video_camera_back_outlined), label: Text("视频会议")), - NavigationRailDestination( - icon: Icon(Icons.book_outlined), label: Text("通讯录")), - NavigationRailDestination( - icon: Icon(Icons.cloud_upload_outlined), label: Text("云文档")), - NavigationRailDestination( - icon: Icon(Icons.games_sharp), label: Text("工作台")), - NavigationRailDestination( - icon: Icon(Icons.calendar_month), label: Text("日历")) - ]; - - Widget buildLeading() { - return GestureDetector( - onTap: _toggleExtended, - child: const Icon( - Icons.menu_open, - color: Colors.grey, - )); - } - - @override - Widget build(BuildContext context) { - const Color textColor = Color(0xffcfd1d7); - const Color activeColor = Colors.white; - const TextStyle labelStyle = TextStyle(color: textColor,fontSize: 11); - - return NavigationRail( - leading: buildLeading(), - extended: _extended, - labelType: NavigationRailLabelType.none, - useIndicator: true, - indicatorColor: Colors.blue, - elevation: 1, - backgroundColor: const Color(0xff324465), - minWidth: 72, - minExtendedWidth: 200 , - unselectedIconTheme: const IconThemeData(color: textColor) , - selectedIconTheme: const IconThemeData(color: activeColor) , - unselectedLabelTextStyle: labelStyle, - selectedLabelTextStyle: labelStyle, - trailing: const Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: EdgeInsets.only(bottom: 20.0), - child: FlutterLogo(), - ), - ), - ), - onDestinationSelected: _onDestinationSelected, - destinations: destinations, - selectedIndex: _selectIndex, - ); - } - - void _onDestinationSelected(int value) { - _selectIndex = value; - setState(() {}); - widget.onDestinationSelected?.call(value); - } - - void _toggleExtended() { - setState(() { - _extended = !_extended; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Navigator/node1_base.dart b/packages/widgets/lib/StatefulWidget/Navigator/node1_base.dart deleted file mode 100644 index 5daa0c0a..00000000 --- a/packages/widgets/lib/StatefulWidget/Navigator/node1_base.dart +++ /dev/null @@ -1,196 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/19 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 232, -// "name": 'Navigator基本用法', -// "priority": 1, -// "subtitle": -// "【initialRoute】 : 最初显示路由 【String】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【observers】 : 路由监听器 【List】\n" -// "【onPopPage】 : 出栈回调 【PopPageCallback】", -// } -class NavigatorDemo extends StatelessWidget { - const NavigatorDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - width: 300, - child: Navigator( - onPopPage: _onPopPage, - initialRoute: '/home-content', - onGenerateRoute: _onGenerateRoute, - observers: [TolyNavigatorObservers()], - ), - ); - } - - Route _onGenerateRoute(RouteSettings settings) { - switch (settings.name) { - case '/home-content': - return MaterialPageRoute( - builder: (_) => const HomeContent(), settings: settings); - case "/red": - return MaterialPageRoute(builder: (_) => const RedPage(), settings: settings); - case "/yellow": - return MaterialPageRoute( - builder: (_) => const YellowPage(), settings: settings); - case "/green": - return MaterialPageRoute( - builder: (_) => const GreenPage(), settings: settings); - default: - return MaterialPageRoute( - builder: (_) => const HomeContent(), settings: settings); - } - } - - bool _onPopPage(Route route, result) { - print('----_onPopPage-----'); - return true; - } -} - -//路由监听器 -class TolyNavigatorObservers extends NavigatorObserver { - @override - void didPush(Route route, Route? previousRoute) { - print( - '--didPush:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); - } - - @override - void didStopUserGesture() { - print('--didStopUserGesture:--'); - } - - @override - void didStartUserGesture(Route route, Route? previousRoute) { - print( - '--didStartUserGesture:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); - } - - @override - void didReplace({Route? newRoute, Route? oldRoute}) { - print( - '--didReplace:--newRoute:--${newRoute?.settings}--oldRoute:--${oldRoute?.settings}'); - } - - @override - void didRemove(Route? route, Route? previousRoute) { - print( - '--didRemove:--route:--${route?.settings}--previousRoute:--${previousRoute?.settings}'); - } - - @override - void didPop(Route route, Route? previousRoute) { - print( - '--didPop:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); - } -} - -class HomeContent extends StatelessWidget { - const HomeContent({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.red, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - ), - child: const Text('to red'), - onPressed: () { - Navigator.pushNamed(context, '/red'); - }, - ), - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.yellow, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - ), - child: const Text('to yellow'), - onPressed: () { - Navigator.pushNamed(context, '/yellow'); - }, - ), - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.green, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - ), - child: const Text('to yellow'), - onPressed: () { - Navigator.pushNamed(context, '/green'); - }, - ) - ], - ), - ], - ); - } -} - -class RedPage extends StatelessWidget { - const RedPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("RedPage"), - ), - body: Container( - color: Colors.red, - ), - ); - } -} - -class YellowPage extends StatelessWidget { - const YellowPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("YellowPage"), - ), - body: Container( - color: Colors.yellow, - ), - ); - } -} - -class GreenPage extends StatelessWidget { - const GreenPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("GreenPage"), - ), - body: Container( - color: Colors.green, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart b/packages/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart deleted file mode 100644 index 241090fc..00000000 --- a/packages/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 251, -// "name": 'NestedScrollView基本用法', -// "priority": 1, -// "subtitle": -// "【controller】 : 滑动控制器 【ScrollController】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】\n" -// "【physics】 : 滑顶样式 【ScrollPhysics】\n" -// "【dragStartBehavior】 : 开始拖动行为 【DragStartBehavior】\n" -// "【headerSliverBuilder】 : *头部构造器 【NestedScrollViewHeaderSliversBuilder】\n" -// "【body】 : *内容 【Widget】", -// } - -class NestedScrollViewDemo extends StatelessWidget { - final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; - - const NestedScrollViewDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 200, - child: Scaffold( - body: DefaultTabController( - length: _tabs.length, - child: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) { - return [ - SliverOverlapAbsorber( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - sliver: SliverAppBar( - title: const Text('旷古奇书'), - pinned: true, - elevation: 6, //影深 - expandedHeight: 220.0, - forceElevated: innerBoxIsScrolled, //为true时展开有阴影 - flexibleSpace: FlexibleSpaceBar( - background: Image.asset( - "assets/images/wy_300x200_filter.webp", - fit: BoxFit.cover, - ), - ), - bottom: TabBar( - tabs: _tabs - .map((String name) => Tab(text: name,)) - .toList(), - ), - ), - ), - ]; - }, - body: _buildTabBarView(), - ), - ), - )); - } - - Widget _buildTabBarView() { - return TabBarView( - children: _tabs.map((String name) { - return SafeArea( - top: false, - bottom: false, - child: Builder( - builder: (BuildContext context) { - return CustomScrollView( - key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - SliverPadding( - padding: const EdgeInsets.all(8.0), - sliver: SliverFixedExtentList( - itemExtent: 48.0, - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return ListTile( - title: Text('《$name》 第 $index章'), - ); - }, - childCount: 50, - ), - ), - ), - ], - ); - }, - ), - ); - }).toList(), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart deleted file mode 100644 index ec7a27c9..00000000 --- a/packages/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 355 OutlinedButton Material风格的边线按钮,表现和OutlineButton类似。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 355, -// "name": 'OutlinedButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } - -class OutlinedButtonDemo extends StatelessWidget { - const OutlinedButtonDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - height: 60, - child: Wrap( - spacing: 20, - children: [ - OutlinedButton( - child: const Text('OutlinedButton'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - const OutlinedButton( - child: Text('禁用按钮'), - onPressed: null, - onLongPress: null, - ), - ], - )); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart deleted file mode 100644 index 6cf13aaa..00000000 --- a/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 355, -// "name": 'OutlinedButton样式', -// "priority": 2, -// "subtitle": -// "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } - -class OutlinedButtonStyleDemo extends StatelessWidget { - const OutlinedButtonStyleDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - child: Wrap( - spacing: 10, - children: [ - OutlinedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.orange, - primary: Colors.white, - elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('ElevatedButton样式'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - OutlinedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.white, - primary: Colors.black, - side: const BorderSide(color: Colors.blue,width: 1), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)) - ), - // elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('ElevatedButton边线'), - autofocus: false, - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - ], - ), - ); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/Overlay/node1_base.dart b/packages/widgets/lib/StatefulWidget/Overlay/node1_base.dart deleted file mode 100644 index d8a9aed2..00000000 --- a/packages/widgets/lib/StatefulWidget/Overlay/node1_base.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 182, -// "name": 'Overlay基本使用', -// "priority": 1, -// "subtitle": -// " Overlay.of(context).insert插入全局组件", -// } - -class CustomOverlay extends StatelessWidget { - const CustomOverlay({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - children: [ - SizedBox( - height: 50, - child: RawMaterialButton( - elevation: 2, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - fillColor: Colors.blue, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - child: const Icon(Icons.add), - onPressed: ()=>showFloating(context), - ), - ), - const SizedBox( - height: 50, - child: RawMaterialButton( - elevation: 2, - shape: CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - fillColor: Colors.red, - splashColor: Colors.orange, - textStyle: TextStyle(color: Colors.white), - child: Icon(Icons.remove), - onPressed: hideFloating, - ), - ), - ], - ); - } -} - -bool show = false; -Offset offset = const Offset(200, 200); - -const double radius = 60; - -var entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - left: offset.dx, - top: offset.dy, - child: _buildFloating(), - ), - ], - )); - -///绘制悬浮控件 -_buildFloating() => GestureDetector( - onPanDown: (details) { - offset = details.globalPosition - const Offset(radius / 2, radius / 2); - entry.markNeedsBuild(); - }, - onPanUpdate: (DragUpdateDetails details) { - offset = offset + details.delta; - entry.markNeedsBuild(); - }, - onLongPress: hideFloating, - child: Material( - color: Colors.transparent, - child: Container( - height: radius, - width: radius, - alignment: Alignment.center, - decoration: const BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: AssetImage('assets/images/icon_head.webp')), - ), - ), - )); - -showFloating(BuildContext context) { - if (!show) { - Overlay.of(context)?.insert(entry); - show = true; - } -} - -hideFloating() { - if (show) { - entry.remove(); - show = false; - } -} diff --git a/packages/widgets/lib/StatefulWidget/PageView/node1_base.dart b/packages/widgets/lib/StatefulWidget/PageView/node1_base.dart deleted file mode 100644 index 94a33414..00000000 --- a/packages/widgets/lib/StatefulWidget/PageView/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-28 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 165, -// "name": 'PageView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【onPageChanged】 : 点击事件 【ValueChanged】", -// } -class CustomPageView extends StatelessWidget { - CustomPageView({Key? key}) : super(key: key); - - final List data = [ - Colors.green[50]!, - Colors.green[100]!, - Colors.green[200]!, - Colors.green[300]!, - Colors.green[400]!, - Colors.green[500]!, - Colors.green[600]!, - Colors.green[700]!, - Colors.green[800]!, - Colors.green[900]!, - ]; - - TextStyle get textStyle => - const TextStyle(color: Colors.white, fontSize: 24, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ), - ]); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 150, - child: PageView( - onPageChanged: (position) => print(position), - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 90, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/PageView/node2_direction.dart b/packages/widgets/lib/StatefulWidget/PageView/node2_direction.dart deleted file mode 100644 index b2056220..00000000 --- a/packages/widgets/lib/StatefulWidget/PageView/node2_direction.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-28 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 165, -// "name": 'PageView滑动方向', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】", -// } -class DirectionPageView extends StatelessWidget { - DirectionPageView({Key? key}) : super(key: key); - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - TextStyle get textStyle => - const TextStyle(color: Colors.white, fontSize: 24, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ), - ]); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 150, - child: PageView( - scrollDirection: Axis.vertical, - reverse: true, - onPageChanged: (position) { - print(position); - }, - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 90, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/PageView/node3_controller.dart b/packages/widgets/lib/StatefulWidget/PageView/node3_controller.dart deleted file mode 100644 index fea68213..00000000 --- a/packages/widgets/lib/StatefulWidget/PageView/node3_controller.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-28 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 165, -// "name": 'PageView控制器简单实用', -// "priority": 3, -// "subtitle": -// "【controller】 : 页面控制器 【PageController】", -// } -class CtrlPageView extends StatefulWidget { - const CtrlPageView({Key? key}) : super(key: key); - - @override - _CtrlPageViewState createState() => _CtrlPageViewState(); -} - -class _CtrlPageViewState extends State { - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - ]; - - late PageController _controller; - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - void initState() { - super.initState(); - _controller=PageController( - viewportFraction: 0.8, - initialPage: (data.length/2).round() - ); - } - TextStyle get textStyle => - const TextStyle(color: Colors.white, fontSize: 24, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ), - ]); - @override - Widget build(BuildContext context) { - return SizedBox( - height: 150, - child: PageView( - controller: _controller, - onPageChanged: (position) { - print(position); - }, - children: data - .map((color) => - Container( - alignment: Alignment.center, - width: 90, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart b/packages/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart deleted file mode 100644 index e7208c43..00000000 --- a/packages/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart +++ /dev/null @@ -1,225 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: 235 PaginatedDataTable 可分页表格 -/// 一个功能丰富的可分页表格组件,可指定分页数、排列、页码前后切换。 -/// link: 110,102 -// { -// "widgetId": 235 , -// "name": 'PaginatedDataTable 使用', -// "priority": 1, -// "subtitle": -// "【header】 : 表名 【Widget】\n" -// "【rowsPerPage】 : 每页记录数 【int】\n" -// "【actions】 : 操作组件 【List】\n" -// "【columns】 : 数据列 【List】\n" -// "【sortColumnIndex】 : 排序列索引 【int】\n" -// "【sortAscending】 : 是否升序 【bool】\n" -// "【onSelectAll】 : 全选回调 【ValueSetter】\n" -// "【onRowsPerPageChanged】 : 分页改变监听 【ValueChanged】\n" -// "【availableRowsPerPage】 : 可用分页列表 【List】\n" -// "【source】 : 数据源 【DataTableSource】", -// } -class PaginatedDataTableDemo extends StatefulWidget { - const PaginatedDataTableDemo({Key? key}) : super(key: key); - - @override - State createState() => _PaginatedDataTableDemoState(); -} - -class _PaginatedDataTableDemoState extends State { - int _rowsPerPage = 5; - - int _sortColumnIndex = 0; - bool _sortAscending = true; - - final DessertDataSource _dessertsDataSource = DessertDataSource(); - - void sort( - Comparable Function(HeroInfo d) getField, - int columnIndex, - bool ascending, - ) { - _dessertsDataSource.sort(getField, ascending); - setState(() { - _sortColumnIndex = columnIndex; - _sortAscending = ascending; - }); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - width: 350, - child: SingleChildScrollView( - child: PaginatedDataTable( - actions: const [ - IconButton(icon: Icon(Icons.add), onPressed: null), - ], - header: const Text( - '《旷古奇书》-角色预设', - style: TextStyle(color: Colors.blue), - ), - rowsPerPage: _rowsPerPage, - availableRowsPerPage: const [5, 8, 10, 15], - onRowsPerPageChanged: (int? value) { - setState(() { - _rowsPerPage = value ?? 0; - }); - }, - sortColumnIndex: _sortColumnIndex, - sortAscending: _sortAscending, - onSelectAll: _dessertsDataSource._selectAll, - columns: [ - DataColumn( - label: const Text('角色名称'), - onSort: (int columnIndex, bool ascending) => sort( - (HeroInfo d) => d.name, columnIndex, ascending)), - DataColumn( - label: const Text('主场卷部'), - tooltip: '人物主要出场的作品.', - numeric: true, - onSort: (int columnIndex, bool ascending) => sort( - (HeroInfo d) => d.calories, columnIndex, ascending)), - DataColumn( - label: const Text('种族'), - numeric: true, - onSort: (int columnIndex, bool ascending) => sort( - (HeroInfo d) => d.fat, columnIndex, ascending)), - DataColumn( - label: const Text('性别'), - numeric: true, - onSort: (int columnIndex, bool ascending) => sort( - (HeroInfo d) => d.carbs, columnIndex, ascending)), - ], - source: _dessertsDataSource), - )); - } -} - -class HeroInfo { - HeroInfo(this.name, this.calories, this.fat, this.carbs); - - final String name; - final String calories; - final String fat; - final String carbs; - bool selected = false; -} - -class DessertDataSource extends DataTableSource { - final List _desserts = [ - HeroInfo('捷特', '《幻将录》', "人族", "男"), - HeroInfo('龙少', '《幻将录》', "人族", "男"), - HeroInfo('巫缨', '《幻将录》', "人族", "女"), - HeroInfo('林兮', '《幻将录》', "人族", "男"), - HeroInfo('九方玄玉', '《风神传》', "神族", "男"), - HeroInfo('七日洪荒', '《风神传》', "魔族", "男"), - HeroInfo('林昔瑶', '《封妖志》', "鬼族", "女"), - HeroInfo('林兮鬼帝', '《封妖志》', "鬼族", "男"), - HeroInfo('艾隆', '《封妖志》', "鬼族", "男"), - HeroInfo('语熙华', '《风神传》', "道族", "男"), - HeroInfo('雪玉宛如', '《幻将录》', "人族", "女"), - HeroInfo('破千', '《幻将录》', "人族", "男"), - HeroInfo('浪封', '《幻将录》', "人族", "男"), - HeroInfo('虎翼穷奇', '《封妖志》', "妖族", "男"), - HeroInfo('凯', '《幻将录》', "人族", "男"), - HeroInfo('荆棘', '《幻将录》', "人族", "女"), - HeroInfo('龙右', '《幻将录》', "人族", "男"), - HeroInfo('梦千', '《幻将录》', "人族", "男"), - HeroInfo('梦小梦', '《幻将录》', "人族", "女"), - HeroInfo('梦瞳', '《幻将录》', "人族", "男"), - HeroInfo('十戈', '《幻将录》', "人族", "男"), - HeroInfo('计画天', '《幻将录》', "人族", "女"), - HeroInfo('士方', '《幻将录》', "人族", "男"), - HeroInfo('巫妻孋', '《幻将录》', "人族", "女"), - HeroInfo('木时黎', '《永恒传说》', "人族", "男"), - HeroInfo('木艾奇', '《永恒传说》', "人族", "男"), - HeroInfo('张风', '《永恒传说》', "人族", "男"), - HeroInfo('薛剑儿', '《永恒传说》', "人族", "男"), - HeroInfo('李月', '《永恒传说》', "人族", "女"), - HeroInfo('刘雪', '《永恒传说》', "人族", "女"), - HeroInfo('葛心', '《永恒传说》', "人族", "女"), - HeroInfo('步映容', '《幻将录》', "人族", "女"), - HeroInfo('莫慈良', '《幻将录》', "人族", "男"), - HeroInfo('莫向阳', '《幻将录》', "人族", "男"), - HeroInfo('莫子薇', '《永恒传说》', "人族", "女"), - HeroInfo('藏凯阳', '《永恒传说》', "人族", "男"), - HeroInfo('奇雨歆', '《永恒传说》', "人族", "女"), - HeroInfo('林天蕊', '《永恒传说》', "人族", "女"), - HeroInfo('吴灏然', '《永恒传说》', "人族", "男"), - HeroInfo('何解连', '《永恒传说》', "人族", "男"), - HeroInfo('步络尘', '《幻将录》', "人族", "男"), - HeroInfo('拓雷', '《幻将录》', "人族", "男"), - HeroInfo('炽阳骑', '《幻将录》', "人族", "男"), - HeroInfo('正构', '《幻将录》', "人族", "男"), - HeroInfo('烈', '《幻将录》', "人族", "男"), - HeroInfo('梦华君', '《幻将录》', "人族", "男"), - HeroInfo('初星', '《幻将录》', "人族", "男"), - HeroInfo('梦飞烟', '《幻将录》', "人族", "男"), - HeroInfo('武落英', '《幻将录》', "人族", "女"), - HeroInfo('古千缘', '《幻将录》', "人族", "男"), - ]; - - void sort( - Comparable Function(HeroInfo d) getField, - bool ascending, - ) { - _desserts.sort((HeroInfo a, HeroInfo b) { - if (!ascending) { - final HeroInfo c = a; - a = b; - b = c; - } - final Comparable aValue = getField(a); - final Comparable bValue = getField(b); - return Comparable.compare(aValue, bValue); - }); - notifyListeners(); - } - - int _selectedCount = 0; - - @override - DataRow? getRow(int index) { - if (index >= _desserts.length) return null; - final HeroInfo dessert = _desserts[index]; - return DataRow.byIndex( - index: index, - selected: dessert.selected, - onSelectChanged: (bool? value) { - if (dessert.selected != value && value != null) { - _selectedCount += value ? 1 : -1; - assert(_selectedCount >= 0); - dessert.selected = value; - notifyListeners(); - } - }, - cells: [ - DataCell(Center(child: Text(dessert.name))), - DataCell(Center(child: Text(dessert.calories))), - DataCell(Center(child: Text(dessert.fat))), - DataCell(Center(child: Text(dessert.carbs))), - ]); - } - - @override - bool get isRowCountApproximate => false; - - @override - int get rowCount => _desserts.length; - - @override - int get selectedRowCount => _selectedCount; - - void _selectAll(bool? checked) { - if (checked == null) return; - for (HeroInfo dessert in _desserts) { - dessert.selected = checked; - } - _selectedCount = checked ? _desserts.length : 0; - notifyListeners(); - } -} diff --git a/packages/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart deleted file mode 100644 index 9ba7d0cb..00000000 --- a/packages/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - - -/// create by 张风捷特烈 on 2020-03-16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 56, -// "name": 'PopupMenuButton基本使用', -// "priority": 1, -// "subtitle": -// "【itemBuilder】 : 构造器 【PopupMenuItemBuilder】\n" -// "【offset】 : 偏移 【Offset】\n" -// "【color】 : 背景颜色 【Color】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【elevation】 : 影深 【double】\n" -// "【onCanceled】 : 取消事件 【Function()】\n" -// "【onSelected】 : 选择事件 【Function(T)】", -// } -class CustomPopupMenuButton extends StatefulWidget { - const CustomPopupMenuButton({Key? key}) : super(key: key); - - @override - _CustomPopupMenuButtonState createState() => _CustomPopupMenuButtonState(); -} - -class _CustomPopupMenuButtonState extends State { - final Map map = const { - "关于": Icons.info_outline, - "帮助": Icons.help_outline, - "问题反馈": Icons.add_comment, - }; - - @override - Widget build(BuildContext context) { - return PopupMenuButton( - itemBuilder: (context) => buildItems(), - offset: const Offset(0, 50), - color: const Color(0xffF4FFFA), - elevation: 1, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), - bottomRight: Radius.circular(20), - topRight: Radius.circular(5), - bottomLeft: Radius.circular(5), - )), - onSelected: (e) { - print(e); - if (e == '关于') { - DialogAbout.show(context); - } - }, - onCanceled: () => print('onCanceled'), - ); - } - - List> buildItems() { - return map.keys - .toList() - .map((e) => PopupMenuItem( - value: e, - child: Wrap( - spacing: 10, - children: [ - Icon(map[e], color: Colors.blue), - Text(e), - ], - ))) - .toList(); - } -} diff --git a/packages/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart b/packages/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart deleted file mode 100644 index e16919b6..00000000 --- a/packages/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 174, -// "name": 'PopupMenuDivider基本使用', -// "priority": 1, -// "subtitle": -// "【height】 : 高度 【double】", -// } -class CustomPopupMenuDivider extends StatelessWidget { - const CustomPopupMenuDivider({Key? key}) : super(key: key); - - final Map map = const { - "关于": Icons.info_outline, - "帮助": Icons.help_outline, - "问题反馈": Icons.add_comment, - }; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildPopupMenuButton(context), - const PopupMenuDivider(), - ], - ); - } - - PopupMenuButton _buildPopupMenuButton(BuildContext context) { - return PopupMenuButton( - itemBuilder: (context) => [ - ...buildItems().sublist(0, 2), - const PopupMenuDivider(), - ...buildItems().sublist(2, 3) - ], - offset: const Offset(0, 50), - color: const Color(0xffF4FFFA), - elevation: 1, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), - bottomRight: Radius.circular(20), - topRight: Radius.circular(5), - bottomLeft: Radius.circular(5), - )), - onSelected: (e) { - print(e); - if (e == '关于') { - DialogAbout.show(context); - } - }, - onCanceled: () => print('onCanceled'), - ); - } - - List> buildItems() { - return map.keys - .toList() - .map((e) => PopupMenuItem( - value: e, - child: Wrap( - spacing: 10, - children: [ - Icon(map[e], color: Colors.blue), - Text(e), - ], - ))) - .toList(); - } -} diff --git a/packages/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart deleted file mode 100644 index d90763a7..00000000 --- a/packages/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 93, -// "name": 'PositionedTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【rect】 : 动画 【Animation】\n" -// " PositionedTransition组件只能在Stack内起作用", -// } -class CustomPositionedTransition extends StatefulWidget { - const CustomPositionedTransition({Key? key}) : super(key: key); - - @override - _CustomPositionedTransitionState createState() => - _CustomPositionedTransitionState(); -} - -class _CustomPositionedTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - ); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - color: Colors.grey.withAlpha(33), - width: 200, - height: 100, - child: Stack( - children: [ - PositionedTransition( - rect: RelativeRectTween( - begin: const RelativeRect.fromLTRB(0, 50, 150, 100), - end: const RelativeRect.fromLTRB(60, 0, 150, -50), - ).animate(_ctrl), - child: const Icon( - Icons.android, - color: Colors.green, - size: 50, - ), - ) - ], - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Radio/node1_base.dart b/packages/widgets/lib/StatefulWidget/Radio/node1_base.dart deleted file mode 100644 index b2005847..00000000 --- a/packages/widgets/lib/StatefulWidget/Radio/node1_base.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 45, -// "name": 'Radio基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 选钮值 【T】\n" -// "【groupValue】 : 当前匹配值 【T】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【onChanged】 : 改变时回调 【Function(T)】", -// } -class CustomRadio extends StatefulWidget { - const CustomRadio({Key? key}) : super(key: key); - - @override - _CustomRadioState createState() => _CustomRadioState(); -} - -class _CustomRadioState extends State { - List data = [1, 2, 3, 4, 5]; - double _value = 1; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: data - .map((e) => Radio( - activeColor: Colors.orangeAccent, - value: e, - groupValue: _value, - onChanged: (v) => setState(() => _value = v??0))) - .toList(), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart b/packages/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart deleted file mode 100644 index 28c35587..00000000 --- a/packages/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 44, -// "name": 'RangeSlider基本使用', -// "priority": 1, -// "subtitle": "【values】 : 数值 【RangeValues】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【divisions】 : 分段数 【int】\n" -// "【label】 : 提示气泡文字 【String】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【inactiveColor】 : 非激活颜色 【Color】\n" -// "【onChangeStart】 : 开始滑动时监听 【Function(RangeValues)】\n" -// "【onChangeEnd】 : 滑动结束时监听 【Function(RangeValues)】\n" -// "【onChanged】 : 改变时回调 【Function(RangeValues)】", -// } -class CustomRangeSlider extends StatefulWidget { - const CustomRangeSlider({Key? key}) : super(key: key); - - @override - _CustomRangeSliderState createState() => _CustomRangeSliderState(); -} - -class _CustomRangeSliderState extends State { - RangeValues _rangeValues = const RangeValues(90, 270); - - @override - Widget build(BuildContext context) { - return RangeSlider( - values: _rangeValues, - divisions: 180, - min: 0.0, - max: 360.0, - labels: RangeLabels(_rangeValues.start.toStringAsFixed(1), - _rangeValues.end.toStringAsFixed(1)), - activeColor: Colors.orangeAccent, - inactiveColor: Colors.green.withAlpha(99), - onChangeStart: (value) { - print('开始滑动:$value'); - }, - onChangeEnd: (value) { - print('滑动结束:$value'); - }, - onChanged: (value) { - setState(() { - _rangeValues = value; - }); - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/RawChip/node1_press.dart b/packages/widgets/lib/StatefulWidget/RawChip/node1_press.dart deleted file mode 100644 index cd1c437f..00000000 --- a/packages/widgets/lib/StatefulWidget/RawChip/node1_press.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 153, -// "name": 'RawChip点击效果', -// "priority": 1, -// "subtitle": -// "【label】: 中间组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【labelPadding】 : label边距 【EdgeInsetsGeometry】\n" -// "【shadowColor】: 阴影色 【Color】\n" -// "【avatar】: 左侧组件 【Widget】\n" -// "【elevation】: 影深 【double】\n" -// "【pressElevation】: 点击时影深 【double】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -class PressRawChip extends StatelessWidget { - const PressRawChip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return RawChip( - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - label: const Text('张风捷特烈'), - avatar: Image.asset("assets/images/icon_head.webp"), - elevation: 3, - pressElevation: 5, - shadowColor: Colors.orangeAccent, - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/RawChip/node2_select.dart b/packages/widgets/lib/StatefulWidget/RawChip/node2_select.dart deleted file mode 100644 index 8949f861..00000000 --- a/packages/widgets/lib/StatefulWidget/RawChip/node2_select.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 153, -// "name": 'RawChip选中和删除效果', -// "priority": 2, -// "subtitle": -// "【selected】: 是否选中 【bool】\n" -// "【deleteIconColor】: 尾部图标色 【Color】\n" -// "【selectedColor】: 选中色 【Color】\n" -// "【deleteIcon】: 尾部组件 【Widget】\n" -// "【onSelected】: 选中事件 【Function(bool)】\n" -// "【onDeleted】 : 尾部事件 【Function()】", -// } -class SelectRawChip extends StatefulWidget { - const SelectRawChip({Key? key}) : super(key: key); - - @override - _SelectRawChipState createState() => _SelectRawChipState(); -} - -class _SelectRawChipState extends State { - bool _selected = false; - @override - Widget build(BuildContext context) { - return RawChip( - selected: _selected, - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - deleteIconColor: Colors.red, - selectedColor: Colors.orangeAccent.withAlpha(44), - label: const Text('张风捷特烈'), - avatar: Image.asset("assets/images/icon_head.webp"), - elevation: 3, - pressElevation: 5, - shadowColor: Colors.orangeAccent, - onSelected: (v)=> setState(() => _selected=v), - onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart b/packages/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart deleted file mode 100644 index 5b5c2a58..00000000 --- a/packages/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart +++ /dev/null @@ -1,70 +0,0 @@ - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 248 RawGestureDetector 可以用来检测给定手势工厂描述的手势,在开发自己的手势识别器时非常有用。对于常见的手势,使用 GestureRecognizer。 -// { -// "widgetId": 248, -// "name": 'RawGestureDetector基本使用', -// "priority": 1, -// "subtitle": -// "【behavior】 : 侦测行为 【HitTestBehavior】\n" -// "【gestures】 : 手势映射 【Map】\n" -// "【child】 : 子组件 【Widget】", -// } - -class RawGestureDetectorDemo extends StatefulWidget { - const RawGestureDetectorDemo({Key? key}) : super(key: key); - - @override - _RawGestureDetectorDemoState createState() => _RawGestureDetectorDemoState(); -} - -class _RawGestureDetectorDemoState extends State { - String _last = ""; - - @override - Widget build(BuildContext context) { - return RawGestureDetector( - gestures: { - TapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), - init, - ), - }, - child: Container( - width: 300.0, - height: 100.0, - alignment: Alignment.center, - color: Colors.yellow, - child: Text(_last)), - ); - } - - void init(TapGestureRecognizer instance) { - instance..onTapDown = (TapDownDetails details) { - setState(() { - _last = 'down'; - }); - } - ..onTapUp = (TapUpDetails details) { - setState(() { - _last = 'up'; - }); - } - ..onTap = () { - setState(() { - _last = 'tap'; - }); - } - ..onTapCancel = () { - setState(() { - _last = 'cancel'; - }); - } - ; - } -} diff --git a/packages/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart b/packages/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart deleted file mode 100644 index 6152e70c..00000000 --- a/packages/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 254 RawKeyboardListener 可以用来检测键盘按键和松键的事件,目前只能检测到物理键盘,可在桌面端使用。 -// { -// "widgetId": 254, -// "name": 'RawGestureDetector基本使用', -// "priority": 1, -// "subtitle": "【onKey】 : 键盘事件 【ValueChanged】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【autofocus】 : 是否自动聚焦 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } - -class RawKeyboardListenerDemo extends StatefulWidget { - const RawKeyboardListenerDemo({Key? key}) : super(key: key); - - @override - _RawKeyboardListenerDemoState createState() => _RawKeyboardListenerDemoState(); -} - -class _RawKeyboardListenerDemoState extends State { - String _info = ""; - - final FocusNode node = FocusNode(); - - @override - Widget build(BuildContext context) { - return RawKeyboardListener( - focusNode: node, - onKey: _onKey, - child: SizedBox( - width: 300, - child: Row( - children: [ - const Expanded( - child: TextField( - decoration: InputDecoration( - border: OutlineInputBorder() - ), - ), - ), - const SizedBox(width: 20,), - Text(_info) - ], - ), - ), - ); - } - - void _onKey(RawKeyEvent value) { - print(value); - if(value is RawKeyDownEvent){ - _info = "按下: ${value.logicalKey.debugName}\nid: 0x${value.logicalKey.keyId.toRadixString(16).padLeft(9,"0")}"; - } - if(value is RawKeyUpEvent){ - _info = "抬起: ${value.logicalKey.debugName}\nid: 0x${value.logicalKey.keyId.toRadixString(16).padLeft(9,"0")}"; - } - setState(() { - - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart deleted file mode 100644 index 69468522..00000000 --- a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 175, -// "name": 'RawMaterialButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【fillColor】 : 填充色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【textStyle】 : 文字样式 【TextStyle】\n" -// "【onLongPress】 : 长按事件 【Function()】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -class CustomRawMaterialButton extends StatelessWidget { - const CustomRawMaterialButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - RawMaterialButton( - elevation: 2, - fillColor: Colors.green, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: ()=>print('onLongPress'), - child: const Icon(Icons.remove), - onPressed: ()=>print('onPressed'), - ), - RawMaterialButton( - elevation: 2, - fillColor: Colors.blue, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: ()=>print('onLongPress'), - child: const Text('Push'), - onPressed: ()=>print('onPressed'), - ), - RawMaterialButton( - elevation: 2, - fillColor: Colors.red, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: ()=>print('onLongPress'), - child: const Icon(Icons.add), - onPressed: ()=>print('onPressed'), - ), - - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart b/packages/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart deleted file mode 100644 index 8fb42d22..00000000 --- a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 175, -// "name": 'RawMaterialButton高亮和形状', -// "priority": 2, -// "subtitle": -// "【highlightElevation】 : 高亮影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } -class ShapeRawMaterialButton extends StatelessWidget { - const ShapeRawMaterialButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - RawMaterialButton( - elevation: 2, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - fillColor: Colors.green, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: () => print('onLongPress'), - child: const Icon(Icons.remove), - onPressed: () => print('onPressed'), - ), - RawMaterialButton( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(15))), - elevation: 0, - highlightElevation: 0, - fillColor: Colors.blue, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: () => print('onLongPress'), - child: const Text('Push'), - onPressed: () => print('onPressed'), - ), - RawMaterialButton( - elevation: 2, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - fillColor: Colors.red, - splashColor: Colors.orange, - textStyle: const TextStyle(color: Colors.white), - onLongPress: () => print('onLongPress'), - child: const Icon(Icons.add), - onPressed: () => print('onPressed'), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart b/packages/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart deleted file mode 100644 index 6b2ba5b5..00000000 --- a/packages/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 49, -// "name": 'RefreshIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子(可滑动) 【Widget】\n" -// "【displacement】 : 指示器悬浮高度 【double】\n" -// "【color】 : 指示器颜色 【Color】\n", -// "【backgroundColor】 : 指示器背景色 【Color】\n" -// "【onRefresh】 : 异步函数 【Future Function()】" -// } -class CustomRefreshIndicator extends StatefulWidget { - const CustomRefreshIndicator({Key? key}) : super(key: key); - - @override - _CustomRefreshIndicatorState createState() => _CustomRefreshIndicatorState(); -} - -class _CustomRefreshIndicatorState extends State { - int _count = 0; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - width: 200, - child: RefreshIndicator( - onRefresh: _increment, - displacement: 20, - color: Colors.orange, - backgroundColor: Colors.white, - child: SingleChildScrollView( - child: Container( - alignment: Alignment.center, - width: 200, - height: 300, - color: Colors.blue, - child: Text('$_count',style: const TextStyle(color: Colors.white,fontSize: 40)), - ), - ), - ), - ); - } - - Future _increment() async { - await Future.delayed(const Duration(seconds: 2)); - setState(() { - _count++; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart deleted file mode 100644 index bc9883e6..00000000 --- a/packages/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 115, -// "name": 'RelativePositionedTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【size】 : 左和上的偏移量 【Size】\n" -// "【rect】 : 动画 【Animation】\n" -// " PositionedTransition组件只能在Stack内起作用", -// } -class CustomRelativePositionedTransition extends StatefulWidget { - const CustomRelativePositionedTransition({Key? key}) : super(key: key); - - @override - _CustomRelativePositionedTransitionState createState() => - _CustomRelativePositionedTransitionState(); -} - -class _CustomRelativePositionedTransitionState - extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - late Animation rectAnimation; - - @override - void initState() { - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - ); - rectAnimation = RectTween( - begin: const Rect.fromLTRB(0, 0, 50, 50), - end: const Rect.fromLTRB(0, 0, 50, 50).translate(100, 50), - ).animate(_ctrl); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - color: Colors.grey.withAlpha(33), - width: 200, - height: 100, - child: Stack( - children: [ - RelativePositionedTransition( - size: const Size(200, 100), - rect: rectAnimation as Animation, - child: const Icon( - Icons.android, - color: Colors.green, - size: 50, - ), - ) - ], - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart b/packages/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart deleted file mode 100644 index d485ed00..00000000 --- a/packages/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 177, -// "name": 'ReorderableListView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【header】 : 头部组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsets】\n" -// "【onReorder】 : 调换时回调 【ReorderCallback】", -// } -class CustomReorderableListView extends StatefulWidget { - const CustomReorderableListView({Key? key}) : super(key: key); - - @override - _CustomReorderableListViewState createState() => _CustomReorderableListViewState(); -} - -class _CustomReorderableListViewState extends State { - -final List data = [ - Colors.yellow[50]!, - Colors.yellow[100]!, - Colors.yellow[200]!, - Colors.yellow[300]!, - Colors.yellow[400]!, - Colors.yellow[500]!, - Colors.yellow[600]!, - Colors.yellow[700]!, - Colors.yellow[800]!, - Colors.yellow[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 250, - child: ReorderableListView( - padding: const EdgeInsets.all(10), - header: Container( - color: Colors.blue, - alignment: Alignment.center, - height: 50, - child: const Text('长按拖拽进行换位',style: TextStyle(color: Colors.white),)), - onReorder: _handleReorder, - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - void _handleReorder(int oldIndex, int newIndex) { - if (oldIndex < newIndex) { - newIndex -= 1; - } - - setState(() { - final element = data.removeAt(oldIndex); - data.insert(newIndex, element); - }); - - } - - Widget _buildItem(Color color) { - return Container( - key: ValueKey(color) , - alignment: Alignment.center, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ]), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart b/packages/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart deleted file mode 100644 index d4612940..00000000 --- a/packages/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 177, -// "name": 'ReorderableListView滑动方向', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】", -// } -class DirectionReorderableListView extends StatefulWidget { - const DirectionReorderableListView({Key? key}) : super(key: key); - - @override - _DirectionReorderableListViewState createState() => - _DirectionReorderableListViewState(); -} - -class _DirectionReorderableListViewState extends State { - final List data = [ - Colors.yellow[50]!, - Colors.yellow[100]!, - Colors.yellow[200]!, - Colors.yellow[300]!, - Colors.yellow[400]!, - Colors.yellow[500]!, - Colors.yellow[600]!, - Colors.yellow[700]!, - Colors.yellow[800]!, - Colors.yellow[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ReorderableListView( - scrollDirection: Axis.horizontal, - reverse: false, - onReorder: _handleReorder, - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - void _handleReorder(int oldIndex, int newIndex) { - if (oldIndex < newIndex) { - newIndex -= 1; - } - - setState(() { - final element = data.removeAt(oldIndex); - data.insert(newIndex, element); - }); - - } - - Widget _buildItem(Color color) { - return Container( - key: ValueKey(color) , - alignment: Alignment.center, - width: 80, - color: color, - child: Text( - colorString(color), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ]), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart deleted file mode 100644 index e28a145a..00000000 --- a/packages/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart +++ /dev/null @@ -1,64 +0,0 @@ - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 90, -// "name": 'RotationTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【turns】 : 是否消失 【Animation】", -// } -class CustomRotationTransition extends StatefulWidget { - const CustomRotationTransition({Key? key}) : super(key: key); - - @override - _CustomRotationTransitionState createState() => _CustomRotationTransitionState(); -} - -class _CustomRotationTransitionState extends State with SingleTickerProviderStateMixin{ - - late AnimationController _ctrl; - - @override - void initState() { - super.initState(); - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - ); - _ctrl.forward(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - color: Colors.grey.withAlpha(22), - width: 100, - height: 100, - child: RotationTransition( - turns: CurvedAnimation( - parent: _ctrl, - curve: Curves.linear, - ), - child: const Icon( - Icons.camera_outlined, - color: Colors.green, - size: 60, - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Scaffold/node1_base.dart b/packages/widgets/lib/StatefulWidget/Scaffold/node1_base.dart deleted file mode 100644 index 0cfbf92a..00000000 --- a/packages/widgets/lib/StatefulWidget/Scaffold/node1_base.dart +++ /dev/null @@ -1,127 +0,0 @@ -import 'package:flutter/material.dart'; -import '../PopupMenuButton/node1_base.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 64, -// "name": 'Scaffold基本用法', -// "priority": 1, -// "subtitle": -// "【appBar】 : 头部组件 【PreferredSizeWidget】\n" -// "【bottomNavigationBar】 : 底部组件 【Widget】\n" -// "【drawer】 : 左侧滑组件 【Widget】\n" -// "【endDrawer】 : 右侧滑组件 【Widget】\n" -// "【body】 : 内容组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【floatingActionButton】 : 浮动按钮 【Widget】\n" -// "【floatingActionButtonLocation】 : 浮动按钮位置 【FloatingActionButtonLocation】", -// } -class CustomScaffold extends StatefulWidget { - const CustomScaffold({Key? key}) : super(key: key); - - @override - State createState() => _CustomScaffoldState(); -} - -// AppBar 默认的实例,有状态 -class _CustomScaffoldState extends State with SingleTickerProviderStateMixin { - final List tabs = const ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; - int _position = 0; - final Map iconsMap = { - "图鉴": Icons.home, - "动态": Icons.toys, - "喜欢": Icons.favorite, - "手册": Icons.class_, - "我的": Icons.account_circle, - }; - final List _colors = [ - Colors.blue, - Colors.red, - Colors.yellow, - Colors.green, - Colors.purple, - ]; - - late TabController _tabController; - - @override - void initState() { - super.initState(); - _tabController = TabController(vsync: this, length: tabs.length); - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 300, - child: Scaffold( - floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () {}, - ), - drawer: _buildLeftDrawer(), - endDrawer: _buildLeftDrawer(), - appBar: AppBar( - title: const Text('风雅六社'), - backgroundColor: Colors.blue, - centerTitle: true, - actions: const [Icon(Icons.star), CustomPopupMenuButton()], - bottom: _buildTabBar(), - ), - body: _buildTableBarView(), - bottomNavigationBar: _buildBottomNavigationBar(), - ), - ); - } - - Drawer _buildLeftDrawer() => Drawer( - elevation: 1, - child: Image.asset( - 'assets/images/sabar.webp', - fit: BoxFit.cover, - ), - ); - - PreferredSizeWidget _buildTabBar() => TabBar( - isScrollable: true, - controller: _tabController, - indicatorColor: Colors.orangeAccent, - tabs: tabs.map((e) => Tab(text: e)).toList(), - ); - - Widget _buildBottomNavigationBar() => BottomNavigationBar( - onTap: (position) => setState(() => _position = position), - currentIndex: _position, - elevation: 1, - backgroundColor: Colors.white, - iconSize: 25, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), - showUnselectedLabels: false, - showSelectedLabels: true, - items: iconsMap.keys - .map((key) => BottomNavigationBarItem( - label: key, - icon: Icon(iconsMap[key]), - backgroundColor: _colors[_position])) - .toList(), - ); - - Widget _buildTableBarView() => TabBarView( - controller: _tabController, - children: tabs - .map((e) => Center( - child: Text( - e, - style: const TextStyle(color: Colors.blue, fontSize: 20), - ))) - .toList()); -} diff --git a/packages/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart deleted file mode 100644 index 9afc2afd..00000000 --- a/packages/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 91, -// "name": 'ScaleTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【scale】 : 动画 【Animation】", -// } -class CustomScaleTransition extends StatefulWidget { - const CustomScaleTransition({Key? key}) : super(key: key); - - @override - _CustomScaleTransitionState createState() => _CustomScaleTransitionState(); -} - -class _CustomScaleTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController(vsync: this, duration: const Duration(seconds: 2)); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - color: Colors.grey.withAlpha(22), - width: 100, - height: 100, - child: ScaleTransition( - scale: CurvedAnimation(parent: _ctrl, curve: Curves.linear), - child: const Icon(Icons.android, color: Colors.green, size: 60), - ), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Scrollable/node1_base.dart b/packages/widgets/lib/StatefulWidget/Scrollable/node1_base.dart deleted file mode 100644 index dd95e0ce..00000000 --- a/packages/widgets/lib/StatefulWidget/Scrollable/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; - -/// create by 张风捷特烈 on 2020/8/2 -/// contact me by email 1981462002@qq.com -/// 说明: 253 Scrollable 可滑动组件 实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。 - -// { -// "widgetId": 253, -// "name": "Scrollable的基本使用", -// "priority": 1, -// "subtitle": "【viewportBuilder】 : 视口构造器 【ViewportBuilder】\n" -// "【axisDirection】: 滑动方向 【AxisDirection】\n" -// "【controller】: 滑动控制器 【ScrollController】\n" -// "【dragStartBehavior】: t拖动行为 【DragStartBehavior】\n" -// "【physics】: 滚动现象 【ScrollPhysics】\n", -// } - -class ScrollableDemo extends StatelessWidget { - ScrollableDemo({Key? key}) : super(key: key); - - final List data = List.generate(32, (i) => Color(0xFF6600FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 250, - child: Scrollable( - axisDirection: AxisDirection.down, - physics: const BouncingScrollPhysics(), - dragStartBehavior: DragStartBehavior.start, - viewportBuilder: (ctx, position) => Viewport( - cacheExtent: 200, - cacheExtentStyle: CacheExtentStyle.pixel, - offset: position, - slivers: [_buildSliverList()], - ), - ), - ); - } - - Widget _buildSliverList() => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - margin: const EdgeInsets.only(top: 1), - alignment: Alignment.center, - width: 100, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ], - ), - ), - ), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart b/packages/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart deleted file mode 100644 index 97fff91c..00000000 --- a/packages/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 194, -// "name": 'Scrollbar基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【controller】 : 控制器 【ScrollController】", -// } -class CustomScrollbar extends StatelessWidget { - CustomScrollbar({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Scrollbar( - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: color, - child: Text( - colorString(color), - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ], - ), - ), - )) - .toList(), - ), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/SelectableText/node1_base.dart b/packages/widgets/lib/StatefulWidget/SelectableText/node1_base.dart deleted file mode 100644 index 398040c8..00000000 --- a/packages/widgets/lib/StatefulWidget/SelectableText/node1_base.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 53, -// "name": 'SelectableText基本使用', -// "priority": 1, -// "subtitle": -// "【入参】 : 显示文字 【String】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【cursorRadius】 : 光标半径 【Radius】\n" -// "【cursorColor】 : 光标颜色 【Color】\n" -// "【cursorWidth】 : 光标宽度 【double】\n" -// "【showCursor】 : 是否显示光标 【bool】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } -class CustomSelectableText extends StatelessWidget { - const CustomSelectableText({Key? key}) : super(key: key); - - final String text = " 始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时," - "臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然," - "技经肯綮之未尝,而况大軱乎!良庖岁更刀,割也;族庖月更刀,折也。" - "今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有间,而刀刃者无厚;" - "以无厚入有间,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。" - "虽然,每至于族,吾见其难为,怵然为戒,视为止,行为迟。动刀甚微,謋然已解,如土委地。" - "提刀而立,为之四顾,为之踌躇满志,善刀而藏之."; - - @override - Widget build(BuildContext context) { - return SelectableText( - text, - style: const TextStyle(fontSize: 18, color: Colors.orange), - cursorColor: Colors.green, - cursorRadius: const Radius.circular(3), - cursorWidth: 5, - showCursor: true, - autofocus: false, - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart deleted file mode 100644 index a196c71f..00000000 --- a/packages/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 92, -// "name": 'SizeTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【axis】 : 轴向*2 【Axis】\n" -// "【sizeFactor】 : 动画 【Animation】", -// } -class CustomSizeTransition extends StatefulWidget { - const CustomSizeTransition({Key? key}) : super(key: key); - - @override - _CustomSizeTransitionState createState() => _CustomSizeTransitionState(); -} - -class _CustomSizeTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = - AnimationController(vsync: this, duration: const Duration(seconds: 1)); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Wrap( - runSpacing: 20, - children: [ - SizeTransition( - axis: Axis.horizontal, - sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear), - child: Container( - width: MediaQuery.of(context).size.width, - color: Colors.orange, - child: - const Icon(Icons.android, color: Colors.green, size: 80)), - ), - SizeTransition( - axis: Axis.vertical, - sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear), - child: Container( - width: MediaQuery.of(context).size.width, - color: Colors.orange, - child: - const Icon(Icons.android, color: Colors.green, size: 80)), - ), - ], - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart b/packages/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart deleted file mode 100644 index 4bf9ceb1..00000000 --- a/packages/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 112, -// "name": 'SlideTransition 基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【textDirection】 : x轴方向 【TextDirection】\n" -// "【position】 : 动画 【Animation】", -// } -class CustomSlideTransition extends StatefulWidget { - const CustomSlideTransition({Key? key}) : super(key: key); - - @override - _CustomSlideTransitionState createState() => _CustomSlideTransitionState(); -} - -class _CustomSlideTransitionState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - late Animation animation; - - @override - void initState() { - super.initState(); - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - )..forward(); - - animation = Tween( - begin: Offset.zero, - end: const Offset(0.5, 0.5), - ).animate(_ctrl); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Container( - width: 200, - color: Colors.grey.withAlpha(33), - height: 100, - child: Stack( - fit: StackFit.expand, - children: [ - SlideTransition( - textDirection: TextDirection.ltr, - position: animation, - child: _buildChild(), - ), - SlideTransition( - textDirection: TextDirection.rtl, - position: animation, - child: _buildChild(), - ), - ], - ), - )); - } - Widget _buildChild() => const Icon( - Icons.accessible_forward_sharp, - color: Colors.green, - size: 25, - ); -} diff --git a/packages/widgets/lib/StatefulWidget/Slider/node1_base.dart b/packages/widgets/lib/StatefulWidget/Slider/node1_base.dart deleted file mode 100644 index 278635c3..00000000 --- a/packages/widgets/lib/StatefulWidget/Slider/node1_base.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 42, -// "name": 'Slider基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 数值 【double】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【inactiveColor】 : 非激活颜色 【Color】\n" -// "【onChanged】 : 改变时回调 【Function(double)】", -// } -class CustomSlider extends StatefulWidget { - const CustomSlider({Key? key}) : super(key: key); - - @override - _CustomSliderState createState() => _CustomSliderState(); -} - -class _CustomSliderState extends State { - double _value = 0.0; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text('当前值:${_value.toStringAsFixed(1)}'), - Slider( - value: _value, - min: 0.0, - max: 360.0, - activeColor: Colors.orangeAccent, - inactiveColor: Colors.green.withAlpha(99), - onChanged: _onChange), - ], - ); - } - - void _onChange(value) { - setState(() { - _value = value; - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Slider/node2_lable.dart b/packages/widgets/lib/StatefulWidget/Slider/node2_lable.dart deleted file mode 100644 index e11d5227..00000000 --- a/packages/widgets/lib/StatefulWidget/Slider/node2_lable.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-31 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 42, -// "name": 'Slider的分段与标签', -// "priority": 2, -// "subtitle": -// "【divisions】 : 分段数 【int】\n" -// "【label】 : 提示气泡文字 【String】\n" -// "【onChangeStart】 : 开始滑动时监听 【Function(double)】\n" -// "【onChangeEnd】 : 滑动结束时监听 【Function(double)】", -// } -class DivisionsSlider extends StatefulWidget { - const DivisionsSlider({Key? key}) : super(key: key); - - @override - _DivisionsSliderState createState() => _DivisionsSliderState(); -} - -class _DivisionsSliderState extends State { - double _value = 0.0; - - @override - Widget build(BuildContext context) { - return Slider( - value: _value, - min: 0.0, - max: 360.0, - divisions: 10, - label: _value.toStringAsFixed(1), - activeColor: Colors.orangeAccent, - inactiveColor: Colors.green.withAlpha(99), - onChangeStart: (value) { - print('开始滑动:$value'); - }, - onChangeEnd: (value) { - print('滑动结束:$value'); - }, - onChanged: (value) { - setState(() { - _value = value; - }); - }); - } -} diff --git a/packages/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart deleted file mode 100644 index a40aa0ea..00000000 --- a/packages/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart +++ /dev/null @@ -1,33 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 242 StatefulBuilder 需要传入 builder 属性进行构造组件,在 builder 中可以使用 StateSetter 改变构造子组件的状态,即可以不用创建类而实现一个局部刷新的组件。 -// { -// "widgetId": 242, -// "name": 'StatefulBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【StatefulWidgetBuilder】", -// } - -class StatefulBuilderDemo extends StatelessWidget { - const StatefulBuilderDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - int count = 0; - - return StatefulBuilder( - builder: (ctx, setState) => ElevatedButton( - child: Text("当前数字: $count"), - onPressed: () { - setState(() { - count++; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart b/packages/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart deleted file mode 100644 index 27e59ba1..00000000 --- a/packages/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 233 StatusTransitionWidget 状态转变组件 -/// 抽象类,可以根据提供的动画器状态变化触发刷新。在 Flutter 框架层没有实现的子类,也没有使用的场景,感觉用处不是很大。 -/// -// { -// "widgetId": 233, -// "name": 'StatusTransitionWidget 介绍', -// "priority": 1, -// "subtitle": -// "【animation】 : 子组件 【Animation】\n" -// "这里自定义 ColorStatusTransitionWidget 进行使用,在动画器的状态改变时构建不同的颜色。", -// } - - -class StatusTransitionWidgetDemo extends StatefulWidget { - const StatusTransitionWidgetDemo({Key? key}) : super(key: key); - - @override - _StatusTransitionWidgetDemoState createState() => - _StatusTransitionWidgetDemoState(); -} - -class _StatusTransitionWidgetDemoState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - super.initState(); - _ctrl = AnimationController( - vsync: this, - duration: const Duration(seconds: 1), - )..forward(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: (){ - _ctrl.forward(from: 0); - }, - child: ColorStatusTransitionWidget( - anim: _ctrl, - ), - ); - } -} - -class ColorStatusTransitionWidget extends StatusTransitionWidget { - final Animation anim; - - const ColorStatusTransitionWidget({Key? key,required this.anim}) - : super(key: key, animation: anim); - - @override - Widget build(BuildContext context) { - Color color = Colors.blue; - switch (animation.status) { - case AnimationStatus.dismissed: - color = Colors.black; - break; - case AnimationStatus.forward: - color = Colors.blue; - break; - case AnimationStatus.reverse: - color = Colors.red; - break; - case AnimationStatus.completed: - color = Colors.green; - break; - } - - return Container( - alignment: Alignment.center, - width: 80, - height: 80, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - child: Text('${animation.status}'.split('.')[1],style: const TextStyle(color: Colors.white),), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Stepper/node1_base.dart b/packages/widgets/lib/StatefulWidget/Stepper/node1_base.dart deleted file mode 100644 index 6274ec80..00000000 --- a/packages/widgets/lib/StatefulWidget/Stepper/node1_base.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 200, -// "name": 'Stepper基本使用', -// "priority": 1, -// "subtitle": -// "【steps】 : 步骤列表 【List】\n" -// "【currentStep】 : 当前步骤 【double】\n" -// "【onStepTapped】 : 点击回调 【ValueChanged】\n" -// "【onStepCancel】 : 上一步回调 【VoidCallback】\n" -// "【controlsBuilder】 : 控制器构造 【ControlsWidgetBuilder】", -// } -class StepperDemo extends StatefulWidget { - const StepperDemo({Key? key}) : super(key: key); - - @override - _StepperDemoState createState() => _StepperDemoState(); -} - -class _StepperDemoState extends State { - int _position = 0; - - final Map stepsData = { - "填写表单": '请按表单填写个人信息。', - "邮箱校验": '已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。', - "注册完成": '恭喜您,注册完成!', - }; - - final List steps = const [ - Step( - title: Text("填写表单"), - content: SizedBox(height: 60, child: Text("请按表单填写个人信息")), - ), - Step(title: Text("邮箱校验"), content: Text("请对您的账号进行邮箱校验")), - Step(title: Text("注册完成"), content: Text("恭喜您,注册完成")), - ]; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Stepper( - type: StepperType.horizontal, - currentStep: _position, - onStepTapped: (index) { - setState(() { - _position = index; - }); - }, - onStepContinue: () { - setState(() { - if (_position < 2) { - _position++; - } - }); - }, - onStepCancel: () { - if (_position > 0) { - setState(() { - _position--; - }); - } - }, - controlsBuilder: (_, ControlsDetails details) { - return Row( - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - onPressed: details.onStepContinue, - child: const Icon( - Icons.check, - color: Colors.white, - ), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.red, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - onPressed: details.onStepCancel, - child: const Icon( - Icons.keyboard_backspace, - color: Colors.white, - ), - ), - ], - ); - }, - steps: stepsData.keys.map((e){ - bool isActive = stepsData.keys.toList().indexOf(e) ==_position; - return Step( - title: Text(e,style: TextStyle(color: isActive?Colors.blue:Colors.black),), - isActive: isActive, - state: _getState(stepsData.keys.toList().indexOf(e)), - content: SizedBox(height: 60, child: Text(stepsData[e]!)), - ); - }).toList()), - ); - } - - StepState _getState(index){ - if(_position==index) return StepState.editing; - if(_position>index) return StepState.complete; - return StepState.indexed; - } -} diff --git a/packages/widgets/lib/StatefulWidget/Stepper/node2_type.dart b/packages/widgets/lib/StatefulWidget/Stepper/node2_type.dart deleted file mode 100644 index 60fc4a28..00000000 --- a/packages/widgets/lib/StatefulWidget/Stepper/node2_type.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 200, -// "name": 'Stepper的方向', -// "priority": 2, -// "subtitle": -// "【type】 : 方向 【StepperType】", -// } -class VerticalStepper extends StatefulWidget { - const VerticalStepper({Key? key}) : super(key: key); - - @override - _VerticalStepperState createState() => _VerticalStepperState(); -} - -class _VerticalStepperState extends State { - int _position = 0; - - final Map stepsData = { - "填写表单": '请按表单填写个人信息。', - "邮箱校验": '已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。', - "注册完成": '恭喜您,注册完成!', - }; - - final List steps = const[ - Step( - title: Text("填写表单"), - content: SizedBox(height: 60, child: Text("请按表单填写个人信息")), - ), - Step(title: Text("邮箱校验"), content: Text("请对您的账号进行邮箱校验")), - Step(title: Text("注册完成"), content: Text("恭喜您,注册完成")), - ]; - - @override - Widget build(BuildContext context) { - return Stepper( - type: StepperType.vertical, - currentStep: _position, - onStepTapped: (index) { - setState(() { - _position = index; - }); - }, - onStepContinue: () { - setState(() { - if (_position < 2) { - _position++; - } - }); - }, - onStepCancel: () { - if (_position > 0) { - setState(() { - _position--; - }); - } - }, - controlsBuilder: (_,ControlsDetails details) { - return Row( - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - onPressed: details.onStepContinue, - child: const Icon( - Icons.check, - color: Colors.white, - ), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.red, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - onPressed: details.onStepCancel, - child: const Icon( - Icons.keyboard_backspace, - color: Colors.white, - ), - ), - ], - ); - }, - steps: stepsData.keys.map((e) { - bool isActive = stepsData.keys.toList().indexOf(e) == _position; - return Step( - title: Text( - e, - style: TextStyle(color: isActive ? Colors.blue : Colors.black), - ), - isActive: isActive, - state: _getState(stepsData.keys.toList().indexOf(e)), - content: SizedBox(height: 60, child: Text(stepsData[e]!)), - ); - }).toList()); - } - - StepState _getState(index) { - if (_position == index) return StepState.editing; - if (_position > index) return StepState.complete; - return StepState.indexed; - } -} diff --git a/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart deleted file mode 100644 index b7708e77..00000000 --- a/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 173, -// "name": 'StreamBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【stream】 : 子组件 【Stream】\n" -// "【initialData】 : 初始数据 【T】\n" -// "【builder】 : 点击事件 【AsyncWidgetBuilder】", -// } -class CustomStreamBuilder extends StatefulWidget { - const CustomStreamBuilder({Key? key}) : super(key: key); - - @override - _CustomStreamBuilderState createState() => _CustomStreamBuilderState(); -} - -class _CustomStreamBuilderState extends State { - final CountGenerator _generator = CountGenerator()..increment(); - - @override - void dispose() { - _generator.dispose(); //关闭控制器 - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - child: const Icon( - Icons.add, - color: Colors.white, - ), - onPressed: () async { - await _generator.increment(); - }, - ), - _buildStreamBuilder(), - ElevatedButton( - style: ElevatedButton.styleFrom( - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - child: const Icon( - Icons.remove, - color: Colors.white, - ), - onPressed: () async { - await _generator.minus(); - }, - ), - ], - ); - } - - Widget _buildStreamBuilder() => StreamBuilder( - stream: _generator.state, - builder: (BuildContext context, AsyncSnapshot snap) { - print(snap); - if (snap.connectionState == ConnectionState.done) { - return const Text('Done'); - } - if (snap.connectionState == ConnectionState.active) { - return Text( - snap.data.toString(), - style: Theme.of(context).textTheme.bodyText2, - ); - } - if (snap.connectionState == ConnectionState.waiting) { - return const CircularProgressIndicator(); - } - if (snap.hasError) { - return const Text('Error'); - } - return Container(); - }); -} - -class CountGenerator { - int _count = 0; //计数器数据 - final StreamController _controller = StreamController(); //控制器 - - Stream get state => _controller.stream; //获取状态流 - int get count => _count; //获取计数器数据 - - void dispose() {//关闭控制器 - _controller.close(); - } - - Future increment() async {//增加记数方法 - _controller.add(++_count); - } - - Future minus() async {//增加记数方法 - _controller.add(--_count); - } -} diff --git a/packages/widgets/lib/StatefulWidget/Switch/node1_base.dart b/packages/widgets/lib/StatefulWidget/Switch/node1_base.dart deleted file mode 100644 index 65421274..00000000 --- a/packages/widgets/lib/StatefulWidget/Switch/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-14 -/// contact me by email 1981462002@qq.com -/// 说明: - -/// { -// "widgetId": 40, -// "name": 'Switch基础用法', -// "priority": 1, -// "subtitle": -// "【inactiveThumbColor】 : 未选中小圈颜色 【Color】\n" -// "【inactiveTrackColor】 : 未选中滑槽颜色 【Color】\n" -// "【activeColor】 : 选中时小圈颜色 【Color】\n" -// "【activeTrackColor】 : 选中时滑槽颜色 【Color】\n" -// "【onChanged】 : 切换回调 【Function(double)】" -// " onChanged时,回调true、null、false三种状态", -// } -class CustomSwitch extends StatefulWidget { - const CustomSwitch({Key? key}) : super(key: key); - - @override - _CustomSwitchState createState() => _CustomSwitchState(); -} - -class _CustomSwitchState extends State { - final List colors = const[ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - bool _checked = false; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: colors - .map((e) => Switch( - value: _checked, - inactiveThumbColor: e, - inactiveTrackColor: Colors.grey.withAlpha(88), - activeColor: Colors.green, - activeTrackColor: Colors.orange, - onChanged: (v) { - setState(() => _checked = v); - })) - .toList(), - ); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/Switch/node2_image.dart b/packages/widgets/lib/StatefulWidget/Switch/node2_image.dart deleted file mode 100644 index ce5d7225..00000000 --- a/packages/widgets/lib/StatefulWidget/Switch/node2_image.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-14 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 40, -// "name": 'Switch图片', -// "priority": 2, -// "subtitle": -// "【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】\n" -// "【activeThumbImage】 : 选中小圈图片 【ImageProvider】", -// } -class ImageSwitch extends StatefulWidget { - const ImageSwitch({Key? key}) : super(key: key); - - @override - _ImageSwitchState createState() => _ImageSwitchState(); -} - -class _ImageSwitchState extends State { - final List imgs = const [ - "assets/images/head_icon/icon_5.webp", - "assets/images/head_icon/icon_6.webp", - "assets/images/head_icon/icon_7.webp", - "assets/images/head_icon/icon_8.webp" - ]; - bool _checked = false; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: imgs - .map((e) => - Switch( - value: _checked, - inactiveThumbImage: AssetImage(e), - activeThumbImage: const AssetImage('assets/images/icon_head.webp'), - onChanged: (v) { - setState(() => _checked = v); - })) - .toList(), - ); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/TabBarView/node1_base.dart b/packages/widgets/lib/StatefulWidget/TabBarView/node1_base.dart deleted file mode 100644 index b284591e..00000000 --- a/packages/widgets/lib/StatefulWidget/TabBarView/node1_base.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 59, -// "name": 'TabBarView需要与TabBar联用', -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TabController】\n" -// "【children】 : 孩子们 【指示器颜色】\n" -// "【physics】 : 表现 【ScrollPhysics】", -// } -class CustomTabBarView extends StatefulWidget { - const CustomTabBarView({Key? key}) : super(key: key); - - @override - _CustomTabBarViewState createState() => _CustomTabBarViewState(); -} - -class _CustomTabBarViewState extends State with SingleTickerProviderStateMixin { - final List tabs = const [ - '风画庭', - '雨韵舍', - '雷鸣殿', - '电疾堂', - '霜寒阁', - '雪月楼', - ]; - late TabController _tabController; - - @override - void initState() { - super.initState(); - _tabController = TabController(vsync: this, length: tabs.length); - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildTabBar(), - Container( - color: Colors.purple, - width: MediaQuery.of(context).size.width, - height: 200, - child: _buildTableBarView()) - ], - ); - } - - Widget _buildTabBar() => TabBar( - onTap: (tab) => print(tab), - labelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - unselectedLabelStyle: const TextStyle(fontSize: 16), - isScrollable: true, - controller: _tabController, - labelColor: Colors.blue, - indicatorWeight: 3, - indicatorPadding: const EdgeInsets.symmetric(horizontal: 10), - unselectedLabelColor: Colors.grey, - indicatorColor: Colors.orangeAccent, - tabs: tabs.map((e) => Tab(text: e)).toList(), - ); - - Widget _buildTableBarView() => TabBarView( - controller: _tabController, - children: tabs.map((e) => Center( - child: Text( - e, - style: const TextStyle( - color: Colors.white, - fontSize: 20, - ), - ))).toList()); -} diff --git a/packages/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart b/packages/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart deleted file mode 100644 index 9750631d..00000000 --- a/packages/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart +++ /dev/null @@ -1,92 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 151, -// "name": 'TableRowInkWell基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", -// } -class CustomTableRowInkWell extends StatelessWidget { - const CustomTableRowInkWell({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - _ItemBean title = _ItemBean("单位称", "量纲", "单位", "单位名称", "单位符号"); - _ItemBean m = _ItemBean("长度", "L", "1m", "米", "m"); - _ItemBean kg = _ItemBean("质量", "M", "1Kg", "千克", "Kg"); - _ItemBean s = _ItemBean("时间", "T", "1s", "秒", "s"); - _ItemBean a = _ItemBean("安培", "Ι", "1A", "安培", "A"); - _ItemBean k = _ItemBean("热力学温度", "θ", "1K", "开尔文", "K"); - _ItemBean mol = _ItemBean("物质的量", "N", "1mol", "摩尔", "mol"); - _ItemBean cd = _ItemBean("发光强度", "J", "1cd", "坎德拉", "cd"); - - List<_ItemBean> data = [title, m, kg, s, a, k, mol, cd]; - - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Table( - columnWidths: const { - 0: FixedColumnWidth(80.0), - 1: FixedColumnWidth(80.0), - 2: FixedColumnWidth(80.0), - 3: FixedColumnWidth(80.0), - 4: FixedColumnWidth(80.0), - }, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - border: TableBorder.all( - color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid), - children: data - .map((item) => TableRow(children: [ - TableRowInkWell( - onTap: () => print('onTap'), - onDoubleTap: () => print('onDoubleTap'), - onLongPress: () => print('onLongPress'), - onHighlightChanged: (v) => print('onHighlightChanged:$v'), - child: Center( - child: Text( - item.name, - style: const TextStyle(color: Colors.blue), - )), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.symbol)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unitSymbol)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unitName)), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: Text(item.unit)), - ), - ])) - .toList(), - ), - ); - } -} - -class _ItemBean { - String name; - String symbol; - String unit; - String unitName; - String unitSymbol; - - _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol); -} - diff --git a/packages/widgets/lib/StatefulWidget/TextButton/node1_base.dart b/packages/widgets/lib/StatefulWidget/TextButton/node1_base.dart deleted file mode 100644 index 66673861..00000000 --- a/packages/widgets/lib/StatefulWidget/TextButton/node1_base.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 353 TextButton Material风格的文字按钮,默认只有文字,点击时有水波纹。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 353, -// "name": 'TextButton基本使用', -// "priority": 1, -// "subtitle": "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } - -class TextButtonDemo extends StatelessWidget { - const TextButtonDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - height: 60, - child: Wrap( - spacing: 20, - children: [ - TextButton( - child: const Text('TextButton 文字'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - const TextButton( - child: Text('TextButton 禁用'), - onPressed: null, - onLongPress: null, - ), - ], - )); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart deleted file mode 100644 index 7bb672ea..00000000 --- a/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 353, -// "name": 'TextButton样式', -// "priority": 2, -// "subtitle": "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } - -class TextButtonStyleDemo extends StatelessWidget { - const TextButtonStyleDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - child: Wrap( - spacing: 10, - children: [ - TextButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - padding: const EdgeInsets.symmetric(horizontal: 8), - primary: Colors.white, - elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('TextButton 样式'), - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - TextButton( - style: TextButton.styleFrom( - backgroundColor: Colors.white, - primary: Colors.black, - side: const BorderSide(color: Colors.blue, width: 1), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - // elevation: 2, - shadowColor: Colors.orangeAccent), - child: const Text('TextButton 边线'), - autofocus: false, - onPressed: _onPressed, - onLongPress: _onLongPress, - ), - ], - ), - ); - } - - void _onPressed() {} - - void _onLongPress() {} -} diff --git a/packages/widgets/lib/StatefulWidget/TextField/node1_base.dart b/packages/widgets/lib/StatefulWidget/TextField/node1_base.dart deleted file mode 100644 index e95678ce..00000000 --- a/packages/widgets/lib/StatefulWidget/TextField/node1_base.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'TextField基本用法', -// "priority": 1, -// "subtitle": -// "【controller】 : 控制器 【TextEditingController】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【decoration】 : 装饰线 【InputDecoration】\n" -// "【onEditingComplete】 : 输入完成事件 【Function()】\n" -// "【onSubmitted】 : 提交事件 【Function(String)】\n" -// "【onChanged】 : 输入事件 【Function(String)】", -// } -class CustomTextField extends StatefulWidget { - const CustomTextField({Key? key}) : super(key: key); - - @override - _CustomTextFieldState createState() => _CustomTextFieldState(); -} - -class _CustomTextFieldState extends State { - final FocusNode _focusNode = FocusNode(); - late TextEditingController _controller; - - @override - void initState() { - super.initState(); - _controller = TextEditingController(); - } - - @override - void dispose() { - _controller.dispose(); - _focusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 300, - child: TextField( - controller: _controller, - style: const TextStyle(color: Colors.blue), - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'username', - ), - onEditingComplete: () { - print('onEditingComplete'); - }, - onChanged: (v) { - print('onChanged:' + v); - }, - onSubmitted: (v) { - FocusScope.of(context).requestFocus(_focusNode); - print('onSubmitted:' + v); - _controller.clear(); - }, - )); - } -} - diff --git a/packages/widgets/lib/StatefulWidget/TextField/node2_cursor.dart b/packages/widgets/lib/StatefulWidget/TextField/node2_cursor.dart deleted file mode 100644 index db685901..00000000 --- a/packages/widgets/lib/StatefulWidget/TextField/node2_cursor.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'TextField行数和cursor', -// "priority": 2, -// "subtitle": -// "【minLines】 : 最小行数 【int】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【cursorRadius】 : 光标半径 【Radius】\n" -// "【cursorColor】 : 光标颜色 【Color】\n" -// "【cursorWidth】 : 光标宽度 【double】\n" -// "【showCursor】 : 是否显示光标 【bool】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } -class CursorTextField extends StatefulWidget { - const CursorTextField({Key? key}) : super(key: key); - - @override - _CursorTextFieldState createState() => _CursorTextFieldState(); -} - -class _CursorTextFieldState extends State { - final FocusNode _focusNode = FocusNode(); - - @override - void dispose() { - _focusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - _buildSubmitBtn(), - _buildTextField(context), - ], - ); - } - - Widget _buildTextField(BuildContext context) { - return SizedBox( - width: 300, - child: TextField( - style: const TextStyle(color: Colors.blue), - minLines: 3, - maxLines: 5, - cursorColor: Colors.green, - cursorRadius: const Radius.circular(3), - cursorWidth: 5, - showCursor: true, - decoration: const InputDecoration( - contentPadding: EdgeInsets.all(10), - hintText: "请输入...", - border: OutlineInputBorder(), - ), - onChanged: (v) {}, - ), - ); - } - - Widget _buildSubmitBtn() => ElevatedButton( - child: const Text( - "提交", - style: TextStyle(color: Colors.white, fontSize: 16), - ), - onPressed: () => FocusScope.of(context).requestFocus(_focusNode)); -} diff --git a/packages/widgets/lib/StatefulWidget/TextField/node3_decoration.dart b/packages/widgets/lib/StatefulWidget/TextField/node3_decoration.dart deleted file mode 100644 index 72b4e60d..00000000 --- a/packages/widgets/lib/StatefulWidget/TextField/node3_decoration.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'decoration的复杂装饰', -// "priority": 3, -// "subtitle": -// "InputDecoration有非常多的装饰点,对应点缀见代码:\n" -// "border: 边线相关\n" -// "helper: 左下角相关提示\n" -// "counter: 右下角相关提示\n" -// "prefix: 输入框内部最左侧\n" -// "suffix: 输入框内部最右侧\n" -// "label: 无焦点时文字\n" -// "label: 无焦点时文字\n" -// "hint: 提示文字相关\n" -// "border: 边线相关", -// } -class ComplexTextField extends StatelessWidget { - const ComplexTextField({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const TextField( - decoration: InputDecoration( - border: OutlineInputBorder(), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.blue), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.deepPurpleAccent), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))), - labelText: 'username', - labelStyle: TextStyle(color: Colors.purple), - helperText: "help me", - helperStyle: TextStyle(color: Colors.blue), - - suffixText: "suffix", - suffixIcon: Icon(Icons.done), - suffixStyle: TextStyle(color: Colors.green), - - counterText: "counter", - counterStyle: TextStyle(color: Colors.orange), - - prefixText: "ID ", - prefixStyle: TextStyle(color: Colors.blue), - prefixIcon: Icon(Icons.language), - - fillColor: Color(0x110099ee), - filled: true, - - // errorText: "error", - // errorMaxLines: 1, - // errorStyle: TextStyle(color: Colors.red), - // errorBorder: UnderlineInputBorder(), - - hintText: "请输入用户名", - hintMaxLines: 1, - hintStyle: TextStyle(color: Colors.black38), - icon: Icon(Icons.assignment_ind), - )); - } -} diff --git a/packages/widgets/lib/StatefulWidget/TextFormField/node1_base.dart b/packages/widgets/lib/StatefulWidget/TextFormField/node1_base.dart deleted file mode 100644 index 9b2b372b..00000000 --- a/packages/widgets/lib/StatefulWidget/TextFormField/node1_base.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 199, -// "name": 'TextFormField基本使用', -// "priority": 1, -// "subtitle": -// " 基本属性和TextField一致,详见之\n" -// "【validator】 : 验证函数 【FormFieldValidator 】\n" -// "【onFieldSubmitted】 : 提交回调 【ValueChanged】\n" -// "【onSaved】 : 表单save时回调 【FormFieldSetter】", -// } -class CustomTextFormField extends StatefulWidget { - const CustomTextFormField({Key? key}) : super(key: key); - - @override - _CustomTextFormFieldState createState() => _CustomTextFormFieldState(); -} - -class _CustomTextFormFieldState extends State { - final GlobalKey _formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - const SizedBox(width: 40), - Expanded( - child: TextFormField( - style: const TextStyle(textBaseline: TextBaseline.alphabetic), - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'username', - ), - validator: _validateUsername, - onFieldSubmitted: _onFieldSubmitted, - onSaved: _onSaved, - ), - ), - _buildSubmitButton(context), - ], - ); - } - - String? _validateUsername(value) { - if (value.isEmpty) { - return '用户名不能为空'; - } - return null; - } - - void _onSaved(value) { - print('onSaved:' + value); - } - - void _onFieldSubmitted(value) { - print('onFieldSubmitted:' + value); - } - - Widget _buildSubmitButton(BuildContext context) => ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )), - onPressed: _onSubmit, - child: const Icon( - Icons.check, - color: Colors.white, - ), - ); - - void _onSubmit() { - if (_formKey.currentState == null) return; - _formKey.currentState!.save(); - if (_formKey.currentState!.validate()) { - FocusScope.of(context).requestFocus(FocusNode()); - } - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatefulWidget/Tooltip/node1_base.dart b/packages/widgets/lib/StatefulWidget/Tooltip/node1_base.dart deleted file mode 100644 index 4246fab4..00000000 --- a/packages/widgets/lib/StatefulWidget/Tooltip/node1_base.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 50, -// "name": 'Tooltip基本使用', -// "priority": 1, -// "subtitle": -// "【preferBelow】 : 是否首选下方 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【message】 : 消息内容 【String】\n" -// "【showDuration】 : 展示时间 【Duration】\n" -// "【waitDuration】 : 悬浮出现时间 【Duration】\n" -// "【child】 : 孩子 【Widget】", -// } -class CustomTooltip extends StatelessWidget { - const CustomTooltip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Tooltip( - preferBelow: true, - padding: EdgeInsets.all(5), - margin: EdgeInsets.all(5), - message: "天王盖地虎", - showDuration: Duration(seconds: 3), - waitDuration: Duration(milliseconds: 200), - child: Icon(Icons.info_outline), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart deleted file mode 100644 index 262fd484..00000000 --- a/packages/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart +++ /dev/null @@ -1,62 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 226 TweenAnimationBuilder 渐变动画构造器 -/// 通过渐变器 Tween 对相关属性进行渐变动画,通过 builder 进行局部构建,减少刷新范围。不需要自定义动画器,可指定动画时长、曲线、结束回调。 -/// -// { -// "widgetId": 226, -// "name": 'TweenAnimationBuilder 使用案例', -// "priority": 1, -// "subtitle": -// "【tween】 : *渐变器 【Tween】\n" -// "【duration】 : *时长 【Duration】\n" -// "【builder】 : *构造器 【ValueWidgetBuilder】\n" -// "【curve】 : 动画曲线 【Curve】\n" -// "【onEnd】 : 结束回调 【VoidCallback】\n" -// "【child】 : 子组件 【Widget】", -// } - -class TweenAnimationBuilderDemo extends StatefulWidget { - const TweenAnimationBuilderDemo({Key? key}) : super(key: key); - - @override - _TweenAnimationBuilderDemoState createState() => - _TweenAnimationBuilderDemoState(); -} - -class _TweenAnimationBuilderDemoState extends State { - Color _value = Colors.red; - - @override - Widget build(BuildContext context) { - return TweenAnimationBuilder( - tween: ColorTween(begin: Colors.blue, end: _value), - duration: const Duration(milliseconds: 800), - builder: (BuildContext context, Color? color, Widget? child) { - return GestureDetector( - onTap: () { - setState(() { - _value = _value == Colors.red ? Colors.blue : Colors.red; - }); - }, - child: Container( - width: 40, - height: 40, - child: child, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(5) - ), - ), - ); - }, - child: const Icon( - Icons.android_outlined, - color: Colors.white, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart b/packages/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart deleted file mode 100644 index 39ecd1dc..00000000 --- a/packages/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 243 UniqueWidget 唯一组件 -/// 抽象类,必须提供一个 GlobalKey 进行身份标识,该类型组件只会 inflated 一个实例,同一时刻也只会有一个状态,可以通过 currentState 属性获取状态。 -/// -// { -// "widgetId": 243, -// "name": 'UniqueWidget 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } - -class UniqueWidgetDemo extends StatelessWidget { - const UniqueWidgetDemo({Key? key}) : super(key: key); - - final String info = - '该类是抽象类,在 Flutter 框架层没有实现类,也没有其他源码使用到它,说明它基本上没啥用。' - '本质上它也非常简单,就是为组件添加一个 GlobalKey,在 Element#inflateWidget 时,会校验组件是否有 GlobalKey ,' - '如果有,则根据 key 找到之前的对应的 Element,就不会触发 Widget#createElement。为了方便获取 State,该类暴露 currentState 属性。' - '你瞄一下源码,就能看到这个组件是多么简单,简单到可以自己完成,以至于没什么大用。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart deleted file mode 100644 index a2a44aea..00000000 --- a/packages/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/21 -/// contact me by email 1981462002@qq.com -/// 说明: 255 ValueListenableBuilder 1 可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。 -// { -// "widgetId": 255, -// "name": 'ValueListenableBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】: 组件构造器 【ValueWidgetBuilder】\n" -// "【valueListenable】: 监听值 【ValueListenable】\n" -// "【child】: 子组件 【Widget】", -// } - -class ValueListenableBuilderDemo extends StatelessWidget { - ValueListenableBuilderDemo({Key? key}) : super(key: key); - - final ValueNotifier _counter = ValueNotifier(0); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Scaffold( - appBar: AppBar(title: const Text("ValueListenableBuilder")), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - ValueListenableBuilder( - builder: _buildWithValue, - valueListenable: _counter, - child: const Text('I am Child!'), - ) - ], - ), - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.plus_one), - onPressed: () => _counter.value += 1, - ), - ), - ); - } - - Widget _buildWithValue(BuildContext context, int value, Widget? child) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text('$value'), - child ?? const SizedBox.shrink(), - ], - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/packages/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart deleted file mode 100644 index f44c6116..00000000 --- a/packages/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/8/16 -/// contact me by email 1981462002@qq.com -/// 说明: 234 WidgetInspector 该组件可以让你很方便地查看子组件层级结构,是Flutter Inspector插件的功能之一。 -// { -// "widgetId": 234, -// "name": "WidgetInspector基本使用", -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【selectButtonBuilder】: *选择按钮构造器 【InspectorSelectButtonBuilder】", -// } -class WidgetInspectorDemo extends StatelessWidget { - const WidgetInspectorDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: WidgetInspector( - child: const HomePage(), - selectButtonBuilder: _selectButtonBuilder, - ), - ); - } - - Widget _selectButtonBuilder(BuildContext context, onPressed) { - onPressed(); - return Container(); - } -} - -class HomePage extends StatefulWidget { - const HomePage({Key? key}) : super(key: key); - - @override - _HomePageState createState() => _HomePageState(); -} - -class _HomePageState extends State { - int _count = 0; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - alignment: const Alignment(0, 0.7), - child: Text( - '你点击了$_count次', - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () { - setState(() { - _count++; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart b/packages/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart deleted file mode 100644 index 0a671a60..00000000 --- a/packages/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart +++ /dev/null @@ -1,132 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/8/16 -/// contact me by email 1981462002@qq.com -/// 说明: 236 WidgetsApp 集合一个应用程序需要的部件,如路由、语言、一些调试开关等。也是实现MaterialApp和CupertinoApp的核心组件。 -// { -// "widgetId": 236, -// "name": "WidgetsApp基本使用", -// "priority": 1, -// "subtitle": "【pageRouteBuilder】 : *路由构造器 【PageRouteFactory】\n" -// "【color】: *颜色 【Color】\n" -// "【debugShowWidgetInspector】: 是否显示z组件查看器 【bool】\n" -// "其他属性基本上同MaterialApp,详见之。", -// } -class WidgetsAppDemo extends StatefulWidget { - const WidgetsAppDemo({Key? key}) : super(key: key); - - @override - _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); -} - -class _WidgetsAppDemoState extends State { - bool _debugShowCheckedModeBanner = false; - bool _debugShowWidgetInspector = false; - bool _showPerformanceOverlay = false; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildSwitchers(), - SizedBox( - height: 250, - child: WidgetsApp( - color: Colors.blue, - debugShowCheckedModeBanner: _debugShowCheckedModeBanner, - showPerformanceOverlay: _showPerformanceOverlay, - debugShowWidgetInspector: _debugShowWidgetInspector, - pageRouteBuilder: - (RouteSettings settings, WidgetBuilder builder) { - return MaterialPageRoute(settings: settings, builder: builder); - }, - home: const HomePage(), - ), - ), - ], - ); - } - - Widget _buildSwitchers() { - return DefaultTextStyle( - style: const TextStyle(color: Colors.blue), - child: Wrap( - spacing: 10, - children: [ - Column( - children: [ - Switch( - value: _showPerformanceOverlay, - onChanged: (v) { - setState(() { - _showPerformanceOverlay = v; - }); - }, - ), - const Text('性能浮层') - ], - ), - Column( - children: [ - Switch( - value: _debugShowCheckedModeBanner, - onChanged: (v) { - setState(() { - _debugShowCheckedModeBanner = v; - }); - }, - ), - const Text('开启角标') - ], - ), - Column( - children: [ - Switch( - value: _debugShowWidgetInspector, - onChanged: (v) { - setState(() { - _debugShowWidgetInspector = v; - }); - }, - ), - const Text('检查器') - ], - ) - ], - ), - ); - } -} - -class HomePage extends StatefulWidget { - const HomePage({Key? key}) : super(key: key); - - @override - _HomePageState createState() => _HomePageState(); -} - -class _HomePageState extends State { - int _count = 0; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - alignment: const Alignment(0, 0.7), - child: Text( - '你点击了$_count次', - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () { - setState(() { - _count++; - }); - }, - ), - ); - } -} diff --git a/packages/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart b/packages/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart deleted file mode 100644 index e81e2f59..00000000 --- a/packages/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 170, -// "name": 'WillPopScope使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onWillPop】 : 返回回调 【WillPopCallback】", -// } -class CustomWillPopScope extends StatelessWidget { - const CustomWillPopScope({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return WillPopScope( - child: const BackButton(), - onWillPop: () => _willPop(context), - ); - } - - Future _willPop(context) async { - bool? exit = await showDialog( - context: context, - builder: (ctx) => AlertDialog( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - title: const Text('提示'), - content: const Text('你确定要离开此页吗?'), - actions: [ - ElevatedButton( - onPressed: () => Navigator.of(ctx).pop(true), - child: const Text('确定'), - ), - ElevatedButton( - onPressed: () => Navigator.of(ctx).pop(false), - child: const Text('取消'), - ), - ], - ), - ); - print('====_willPop==:$exit========'); - - return exit??false; - } -} diff --git a/packages/widgets/lib/StatefulWidget/YearPicker/node1_base.dart b/packages/widgets/lib/StatefulWidget/YearPicker/node1_base.dart deleted file mode 100644 index 886a2837..00000000 --- a/packages/widgets/lib/StatefulWidget/YearPicker/node1_base.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 136, -// "name": 'YearPicker基本使用', -// "priority": 1, -// "subtitle": "【selectedDate】 : 选中日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } -class CustomYearPicker extends StatefulWidget { - const CustomYearPicker({Key? key}) : super(key: key); - - @override - _CustomYearPickerState createState() => _CustomYearPickerState(); -} - -class _CustomYearPickerState extends State { - DateTime _date = DateTime.now(); - - @override - Widget build(BuildContext context) { - return SizedBox( - height:150, - child: YearPicker( - selectedDate: _date, - onChanged: (date) => setState(() => _date = date), - firstDate: DateTime(2018), - lastDate: DateTime(2030), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart deleted file mode 100644 index 470f0e8f..00000000 --- a/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 130, -// "name": 'AboutDialog基本使用', -// "priority": 1, -// "subtitle": -// "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】\n" -// "【children】 : 子组件列表 【List】", -// } - -class CustomAboutDialog extends StatelessWidget { - const CustomAboutDialog({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - _buildAboutDialog(), - Positioned(top: 50, right: 20, child: _buildRaisedButton(context)), - ], - ); - } - - Widget _buildRaisedButton(BuildContext context) => ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () { - showDialog(context: context, builder: (ctx) => _buildAboutDialog()); - }, - child: const Text( - 'Just Show It', - style: TextStyle(color: Colors.white), - ), - ); - - AboutDialog _buildAboutDialog() { - return AboutDialog( - applicationIcon: const FlutterLogo(), - applicationVersion: 'v0.0.1', - applicationName: 'Flutter Unit', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', - children: [ - Container( - margin: const EdgeInsets.only(top: 20), - width: 80, - height: 80, - child: Image.asset('assets/images/icon_head.webp')), - Container( - margin: const EdgeInsets.only(top: 10), - alignment: Alignment.center, - child: const Text( - 'The King Of Coder.', - style: TextStyle( - color: Colors.white, - fontSize: 20, - shadows: [ - Shadow( - color: Colors.blue, offset: Offset(.5, .5), blurRadius: 3) - ], - ), - )) - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart deleted file mode 100644 index 3d057702..00000000 --- a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 193, -// "name": 'AboutListTile基本使用', -// "priority": 1, -// "subtitle": -// "【icon】 : 左图标 【Widget】\n" -// "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】\n" -// "【aboutBoxChildren】 : 弹框内容组件 【List】", -// } - -import 'package:flutter/material.dart'; - -class AboutListTileDemo extends StatelessWidget { - const AboutListTileDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const AboutListTile( - icon: Icon(Icons.info), - applicationIcon: FlutterLogo(), - applicationName: 'Flutter Unit', - applicationVersion: 'v0.0.1', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', - aboutBoxChildren: [ - Padding( - padding: EdgeInsets.all(10.0), - child: Text( - ' FlutterUnit是【张风捷特烈】的开源项目,' - '收录Flutter的200+组件,并附加详细介绍以及操作交互,' - '希望帮助广大编程爱好者入门Flutter。' - '更多知识可以关注掘金账号、公众号【编程之王】。', - style: TextStyle(color: Color(0xff999999), fontSize: 16), - textAlign: TextAlign.justify, - ), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ActionChip/node1_base.dart b/packages/widgets/lib/StatelessWidget/ActionChip/node1_base.dart deleted file mode 100644 index e73d2e37..00000000 --- a/packages/widgets/lib/StatelessWidget/ActionChip/node1_base.dart +++ /dev/null @@ -1,38 +0,0 @@ - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -/// "widgetId": 13, -// "priority": 1, -// "name": "ActionChip的普通表现如下", -// "subtitle": "【onPressed】: 点击事件 【Function】\n" -// "【pressElevation】: 按下时影深 【double】\n" -// "其他属性同Chip组件,无右侧组件。", -// } -/// - - -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - - -class CustomActionChip extends StatelessWidget { - const CustomActionChip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ActionChip( - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - label: const Text("This is a ActionChip."), - backgroundColor: Colors.grey.withAlpha(66), - avatar: Image.asset("assets/images/icon_head.webp"), - shadowColor: Colors.orangeAccent, - elevation: 3, - pressElevation: 5, - onPressed: ()=> DialogAbout.show(context), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart deleted file mode 100644 index 233be35f..00000000 --- a/packages/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart +++ /dev/null @@ -1,116 +0,0 @@ - - -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 127, -// "name": 'AlertDialog基本使用', -// "priority": 1, -// "subtitle": -// "【title】 : 顶部组件 【Widget】\n" -// "【content】 : 内容组件 【Widget】\n" -// "【titleTextStyle】 : 顶部文字样式 【TextStyle】\n" -// "【contentTextStyle】 : 内容文字样式 【TextStyle】\n" -// "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n" -// "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n" -// "【actions】 : 右下角组件列表 【List】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } - -import 'package:flutter/material.dart'; - -class CustomAlertDialog extends StatelessWidget { - const CustomAlertDialog({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildRaisedButton(context), - _buildAlertDialog(), - ], - ); - } - - Widget _buildRaisedButton(BuildContext context) => ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () { - showDialog(context: context, builder: (ctx) => _buildAlertDialog()); - }, - child: const Text( - 'Just Show It !', - style: TextStyle(color: Colors.white), - ), - ); - - Widget _buildAlertDialog() { - return AlertDialog( - title: _buildTitle(), - titleTextStyle: const TextStyle(fontSize: 20, color: Colors.black), - titlePadding: const EdgeInsets.only( - top: 5, - left: 20, - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 5), - backgroundColor: Colors.white, - content: _buildContent(), - actions: const [ - Icon(Icons.android, color: Colors.blue,), - Icon(Icons.add, color: Colors.blue,), - Icon(Icons.g_translate, color: Colors.blue,), - Icon(Icons.games, color: Colors.blue,), - ], - elevation: 4, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - ); - } - - Widget _buildTitle() { - return Row( - //标题 - children: [ - Image.asset( - "assets/images/icon_head.webp", - width: 30, - height: 30, - ), - const SizedBox(width: 10,), - const Expanded( - child: Text( - "关于", - style: TextStyle(fontSize: 18), - )), - const CloseButton() - ], - ); - } - - Widget _buildContent() { - return Column( - mainAxisSize: MainAxisSize.min, - children: const [ - Padding( - padding: EdgeInsets.all(10.0), - child: Text( - ' FlutterUnit是【张风捷特烈】的开源项目,' - '收录Flutter的200+组件,并附加详细介绍以及操作交互,' - '希望帮助广大编程爱好者入门Flutter。' - '更多知识可以关注掘金账号、公众号【编程之王】。', - style: TextStyle(color: Color(0xff999999), fontSize: 16), - textAlign: TextAlign.justify, - ), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart deleted file mode 100644 index 3621c672..00000000 --- a/packages/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 125, -// "name": 'AnimatedIcon基本使用', -// "priority": 1, -// "subtitle": -// "【icon】 : 动画图标数据 【AnimatedIcons】\n" -// "【size】 : 大小 【double】\n" -// "【color】 : 颜色 【Color】\n" -// "【progress】 : 动画 【Animation】", -// } -class CustomAnimatedIcon extends StatefulWidget { - const CustomAnimatedIcon({Key? key}) : super(key: key); - - @override - _CustomAnimatedIconState createState() => _CustomAnimatedIconState(); -} - -class _CustomAnimatedIconState extends State - with SingleTickerProviderStateMixin { - late AnimationController _ctrl; - - @override - void initState() { - _ctrl = AnimationController(vsync: this, duration: const Duration(seconds: 1)); - _ctrl.forward(); - super.initState(); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _ctrl.forward(from: 0), - child: Wrap( - runSpacing: 30, - children: _buildChildren(), - ), - ); - } - - final Map data = { - Colors.orange: AnimatedIcons.menu_arrow, - Colors.blue: AnimatedIcons.ellipsis_search, - Colors.red: AnimatedIcons.close_menu, - Colors.green: AnimatedIcons.arrow_menu, - Colors.cyanAccent: AnimatedIcons.play_pause, - Colors.purple: AnimatedIcons.pause_play, - }; - - List _buildChildren() => - data.keys - .map((Color color) => AnimatedIcon( - size: 50, - color: color, - icon: data[color]!, - progress: _ctrl, - )) - .toList(); -} diff --git a/packages/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart b/packages/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart deleted file mode 100644 index 52c906ba..00000000 --- a/packages/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2022-04-18 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 356, -// "name": 'Autocomplete基本使用', -// "priority": 1, -// "subtitle": "【optionsBuilder】 : 选项构造器 【AutocompleteOptionsBuilder】\n" -// "【onSelected】 : 选择时回调 【AutocompleteOnSelected】", -// } -class AutocompleteDemo extends StatelessWidget { - const AutocompleteDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Autocomplete( - optionsBuilder: buildOptions, - onSelected: onSelected, - ); - } - - void onSelected(String selection) { - debugPrint('当前选择了 $selection'); - } - - Future> buildOptions( - TextEditingValue textEditingValue, - ) async { - if (textEditingValue.text == '') { - return const Iterable.empty(); - } - return searchByArgs(textEditingValue.text); - } - - Future> searchByArgs(String args) async{ - // 模拟网络请求 - await Future.delayed(const Duration(milliseconds: 200)); - const List data = [ - 'toly', 'toly49', 'toly42', 'toly56', - 'card', 'ls', 'alex', 'fan sha', - ]; - return data.where((String name) => name.contains(args)); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart b/packages/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart deleted file mode 100644 index 66ac2124..00000000 --- a/packages/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart +++ /dev/null @@ -1,227 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2022-04-18 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 356, -// "name": 'Autocomplete的泛型', -// "priority": 2, -// "subtitle": "【optionsViewBuilder】 : 面板构造器 【AutocompleteOptionsViewBuilder】\n" -// "【fieldViewBuilder】 : 输入构造器 【AutocompleteFieldViewBuilder】\n" -// "【displayStringForOption】 : 文字展示 【AutocompleteOptionToString】\n", -// } -class AutocompleteType extends StatefulWidget { - const AutocompleteType({Key? key}) : super(key: key); - - @override - State createState() => _AutocompleteTypeState(); -} - -class _AutocompleteTypeState extends State { - late TextEditingController _controller; - User? user; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - title: buildAutocomplete(), - ), - body: Center( - child: Text( - user != null ? user!.name : '未选择', - style: const TextStyle(fontSize: 40), - )), - ), - ); - } - - Widget buildAutocomplete() { - return Autocomplete( - optionsBuilder: buildOptions, - onSelected: onSelected, - optionsViewBuilder: _buildOptionsView, - fieldViewBuilder: _buildFieldView, - displayStringForOption: (user) => user.name, - ); - } - - @override - void dispose() { - // _controller.dispose(); - super.dispose(); - } - - void onSelected(User selection) { - debugPrint('当前选择了 $selection'); - setState(() { - user = selection; - }); - } - - Future> buildOptions( - TextEditingValue textEditingValue, - ) async { - if (textEditingValue.text == '') { - return const Iterable.empty(); - } - return searchByArgs(textEditingValue.text); - } - - Future> searchByArgs(String args) async { - // 模拟网络请求 - await Future.delayed(const Duration(milliseconds: 200)); - const List data = [ - User('toly', true, 'icon_5.webp'), - User('toly49', false, 'icon_6.webp'), - User('toly42', true, 'icon_7.webp'), - User('toly56', false, 'icon_8.webp'), - User('card', true, 'icon_5.webp'), - User('ls', true, 'icon_6.webp'), - User('alex', true, 'icon_7.webp'), - User('fan sha', false, 'icon_8.webp'), - ]; - return data.where((User user) => user.name.contains(args)); - } - - Widget _buildFieldView( - BuildContext context, - TextEditingController textEditingController, - FocusNode focusNode, - VoidCallback onFieldSubmitted) { - _controller = textEditingController; - return SizedBox( - height: 34, - child: TextFormField( - controller: textEditingController, - decoration: const InputDecoration( - filled: true, - fillColor: Color(0xffF7F8FA), - prefixIcon: Icon(Icons.search), - contentPadding: EdgeInsets.only(top: 1), - border: UnderlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(19)), - ), - hintText: "输入用户名 (toly)", - hintStyle: TextStyle(fontSize: 13)), - focusNode: focusNode, - onFieldSubmitted: (String value) { - onFieldSubmitted(); - }, - ), - ); - } - - Widget _buildOptionsView(BuildContext context, - AutocompleteOnSelected onSelected, Iterable options) { - return Align( - alignment: Alignment.topCenter, - child: Padding( - padding: const EdgeInsets.only(top: 20), - child: Material( - child: ConstrainedBox( - constraints: BoxConstraints(maxHeight: 150), - child: ListView.builder( - padding: EdgeInsets.zero, - itemBuilder: (_, index) { - final User option = options.elementAt(index); - return _UserItem( - onSelected: onSelected, - user: option, - args: _controller.text, - ); - }, - itemCount: options.length, - ), - ), - ), - ), - ); - } -} - -class _UserItem extends StatelessWidget { - final AutocompleteOnSelected? onSelected; - final String args; - final User user; - - const _UserItem({ - Key? key, - this.onSelected, - required this.user, - required this.args, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: () => onSelected?.call(user), - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 6), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - CircleAvatar( - foregroundColor: Colors.transparent, - backgroundImage: - AssetImage('assets/images/head_icon/${user.image}'), - ), - const SizedBox(width: 20), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text.rich(formSpan(user.name, args)), - Text( - '性别: ${user.man ? '男' : '女'}', - style: const TextStyle(color: Colors.grey), - ), - ], - ), - ], - ), - ), - ); - } - - final TextStyle lightTextStyle = const TextStyle( - color: Colors.blue, - fontWeight: FontWeight.bold, - ); - - InlineSpan formSpan(String src, String pattern) { - List span = []; - List parts = src.split(pattern); - if (parts.length > 1) { - for (int i = 0; i < parts.length; i++) { - span.add(TextSpan(text: parts[i])); - if (i != parts.length - 1) { - span.add(TextSpan(text: pattern, style: lightTextStyle)); - } - } - } else { - span.add(TextSpan(text: src)); - } - return TextSpan(children: span); - } -} - -class User { - final String name; - final bool man; - final String image; - - const User(this.name, this.man, this.image); - - @override - String toString() { - return 'User{name: $name, man: $man, image: $image}'; - } -} diff --git a/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart deleted file mode 100644 index f6a1aaaa..00000000 --- a/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 31, -// "priority": 1, -// "name": "BackButton属性", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【onPressed】: 点击事件 【Function】\n" -// " onPressed为空会退出当前栈", -// } -class CustomBackButton extends StatelessWidget { - CustomBackButton({Key? key}) : super(key: key); - - final List data = [ - Colors.red, - Colors.yellow, - Colors.blue, - Colors.green - ]; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: data - .map((e) => BackButton( - color: e, - )) - .toList()); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_1.dart b/packages/widgets/lib/StatelessWidget/Badge/node_1.dart deleted file mode 100644 index 126023c3..00000000 --- a/packages/widgets/lib/StatelessWidget/Badge/node_1.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2023/01/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 258, -// "name": 'Badge 基本使用', -// "priority": 1, -// "subtitle": "【backgroundColor】 : 背景色 【Color?】\n" -// "【textStyle】 : 标题颜色 【TextStyle?】\n" -// "【textColor】 : 标题样式 【Color?】\n" -// "【padding】 : 标题边距 【EdgeInsetsGeometry?】\n" -// "【alignment】 : 标题偏移 【AlignmentDirectional?】\n" -// "【smallSize】 : 无标签时尺寸 【double?】\n" -// "【largeSize】 : 有标签时高度 【double?】\n" -// "【label】 : 标题组件 【Widget?】\n" -// "【child】 : 子组件 【Widget?】", -// } - -class BadgeDemo extends StatelessWidget { - const BadgeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: const [ - Badge( - backgroundColor: Colors.redAccent, - alignment: AlignmentDirectional(0,-2), - smallSize: 10, - child: Icon(Icons.update,size: 36,color: Colors.green,), - ), - Badge( - backgroundColor: Colors.red, - label: Text('99'), - alignment: AlignmentDirectional(36-16,-2), - largeSize: 14, - smallSize: 6, - child: Icon(Icons.message,size: 36,), - ), - Badge( - backgroundColor: Colors.orange, - label: Text('999+'), - alignment: AlignmentDirectional(36-16,-2), - largeSize: 14, - smallSize: 6, - child: Icon(Icons.supervised_user_circle,size: 36,), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_2.dart b/packages/widgets/lib/StatelessWidget/Badge/node_2.dart deleted file mode 100644 index 4f681df3..00000000 --- a/packages/widgets/lib/StatelessWidget/Badge/node_2.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2023/01/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 258, -// "name": 'Badge 标签不可视', -// "priority": 2, -// "subtitle": "【isLabelVisible】 : 是否显示标题 【bool?】\n" -// "该案例在点击时让标签消失", -// } - -class BadgeVisibleDemo extends StatefulWidget { - const BadgeVisibleDemo({Key? key}) : super(key: key); - - @override - State createState() => _BadgeVisibleDemoState(); -} - -class _BadgeVisibleDemoState extends State { - - bool _visible = true; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: _onTap, - child: Badge( - backgroundColor: Colors.red, - label: Text('99+'), - alignment: AlignmentDirectional(36-16,-2), - largeSize: 14, - smallSize: 6, - isLabelVisible: _visible, - child: Icon(Icons.supervised_user_circle,size: 36,), - ), - ); - } - - void _onTap() { - setState(() { - _visible = false; - }); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Banner/node1_base.dart b/packages/widgets/lib/StatelessWidget/Banner/node1_base.dart deleted file mode 100644 index 22a1938d..00000000 --- a/packages/widgets/lib/StatelessWidget/Banner/node1_base.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 5, -// "priority": 1, -// "name": "用于显示一个角标", -// "subtitle": "【message】 : 显示的文字信息 【String】\n" -// "【location】 : 位置*4 【BannerLocation】\n" -// "【color】: 角标颜色 【Color】\n" -// "【child】: 孩子 【Widget】\n" -// "【textStyle】: 文字样式 【TextStyle】", -// } - -class CustomBanner extends StatelessWidget { - CustomBanner({Key? key}) : super(key: key); - - final Map data = { - BannerLocation.topStart: Colors.red, - BannerLocation.topEnd: Colors.blue, - BannerLocation.bottomStart: Colors.green, - BannerLocation.bottomEnd: Colors.yellow, - }; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - runSpacing: 10, - children: data.keys - .map((BannerLocation location) => Container( - color: const Color(0xffD8F5FF), - width: 150, - height: 150 * 0.618, - child: Banner( - message: "Flutter 2.2.3发布", - location: location, - color: data[location]!, - child: const Padding( - padding: EdgeInsets.all(20), - child: FlutterLogo( - textColor: Colors.blue, - style: FlutterLogoStyle.horizontal, - )), - ), - )).toList()); - } -} diff --git a/packages/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart b/packages/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart deleted file mode 100644 index 0020befe..00000000 --- a/packages/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart +++ /dev/null @@ -1,64 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 142, -// "name": 'BottomSheet基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【WidgetBuilder】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【onClosing】 : 关闭回调 【Function()】", -// } - -import 'package:flutter/material.dart'; - -class CustomBottomSheet extends StatefulWidget { - const CustomBottomSheet({Key? key}) : super(key: key); - - @override - _CustomBottomSheetState createState() => _CustomBottomSheetState(); -} - -class _CustomBottomSheetState extends State { - bool opened = false; - - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: () { - opened = !opened; - opened - ? Scaffold.of(context).showBottomSheet((_) => _buildBottomSheet()) - : Navigator.of(context).pop(); - }, - child: const Text( - '点我显隐BottomSheet', - style: TextStyle(color: Colors.white), - )); - } - - Widget _buildBottomSheet() => BottomSheet( - enableDrag: true, - elevation: 4, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topRight: Radius.circular(60), - topLeft: Radius.circular(60), - )), - backgroundColor: Colors.transparent, - onClosing: () => print('onClosing'), - builder: (_) => (Container( - height: 250, - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/sabar_bar.webp'), - fit: BoxFit.cover), - borderRadius: BorderRadius.only( - topRight: Radius.circular(60), - topLeft: Radius.circular(60), - )), - ))); -} diff --git a/packages/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart b/packages/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart deleted file mode 100644 index afa8a1f3..00000000 --- a/packages/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 350 BoxScrollView 盒滑动视图 -/// BoxScrollView 类是一个继承自 ScrollView 的抽象类,所以无法直接使用,它的子类有 ListView、GridView。一般不自己实现子类使用它。 -/// link 183,162,163 -/// -// { -// "widgetId": 350, -// "name": 'BoxScrollView 介绍', -// "priority": 1, -// "subtitle": -// "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【cacheExtent】 : 缓存长 【double】\n" -// "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】\n" -// "【clipBehavior】 : 裁剪行为 【ClipBehavior】\n" -// "【controller】 : 控制器 【ScrollController】", -// } - -class BoxScrollViewDemo extends StatelessWidget { - const BoxScrollViewDemo({Key? key}) : super(key: key); - - final String info = - 'BoxScrollView 是 ScrollView 的子类,实现了它的抽象方法,且暴露出另一个抽象方法 buildChildLayout,返回 Sliver 家族 Widget,' - '其子类有 ListView 和 GridView,分别使用 Sliver 家族相关List、Gird列表组件实现的。'; - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: Column( - children: [ - Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ), - Expanded(child: MyBoxScrollView()), - ], - ), - ); - } -} - -class MyBoxScrollView extends BoxScrollView { - MyBoxScrollView({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; - - @override - Widget buildChildLayout(BuildContext context)=> SliverFixedExtentList( - itemExtent: 60, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); -} diff --git a/packages/widgets/lib/StatelessWidget/Builder/node1_base.dart b/packages/widgets/lib/StatelessWidget/Builder/node1_base.dart deleted file mode 100644 index 452b0697..00000000 --- a/packages/widgets/lib/StatelessWidget/Builder/node1_base.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/5/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 202, -// "name": 'Builder的使用', -// "priority": 1, -// "subtitle": "【builder】 : 组件构造器 【WidgetBuilder】\n" -// "同一个类中使用`XXX.of(context)`获取某类状态对象方法会存在`上下文滞后`的错误,使用Builder解决。", -// } - -class BuilderDemo extends StatelessWidget { - const BuilderDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Scaffold( - appBar: AppBar( - title: const Text('Builder'), - ), - floatingActionButton: Builder( - builder: (ctx) => FloatingActionButton( - onPressed: () { - ScaffoldMessenger.of(ctx).showSnackBar(const SnackBar(content: Text('hello builder'))); - }, - child: const Icon(Icons.add), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart b/packages/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart deleted file mode 100644 index 70eb7e03..00000000 --- a/packages/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart +++ /dev/null @@ -1,38 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 29, -// "priority": 1, -// "name": "ButtonBar对齐方式", -// "subtitle": "【alignment】: 对齐方式 【MainAxisAlignment】\n" -// "【children】: 子组件集 【List】", -// } - -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - - -class CustomButtonBar extends StatelessWidget { - const CustomButtonBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ButtonBar( - alignment: MainAxisAlignment.center, - children: [ - ElevatedButton( - child: const Text("ElevatedButton"), - onPressed: () => DialogAbout.show(context)), - OutlinedButton( - child: const Text("Outlined"), - onPressed: () => DialogAbout.show(context)), - TextButton( - onPressed: () => DialogAbout.show(context), - child: const Text("TextButton"), - ) - ], - ); - } -} - diff --git a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart b/packages/widgets/lib/StatelessWidget/Card/node1_base.dart deleted file mode 100644 index f14412a3..00000000 --- a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ - - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 3, -// "priority": 1, -// "name": "Card可以让一个组件卡片化", -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【margin】: 外边距 【double】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 孩子 【Widget】", -// } -import 'package:flutter/material.dart'; - -class CustomCard extends StatelessWidget { - const CustomCard({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Card( - color: const Color(0xffB3FE65), - elevation: 4, - margin: const EdgeInsets.all(10), - child: Container( - alignment: Alignment.topLeft, - width: 200, - height: 0.618*200, - margin: const EdgeInsets.all(10), - child: const Text("Card", style: TextStyle(fontSize: 20)), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Card/node2_shape.dart b/packages/widgets/lib/StatelessWidget/Card/node2_shape.dart deleted file mode 100644 index 25bbca87..00000000 --- a/packages/widgets/lib/StatelessWidget/Card/node2_shape.dart +++ /dev/null @@ -1,59 +0,0 @@ - - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 3, -// "priority": 2, -// "name": "可以通过shape属性实现裁切效果", -// "subtitle": "【shape】 : 形状 【ShapeBorder】\n" -// "【margin】: 外边距 【double】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 孩子 【Widget】", -// } - -import 'package:flutter/material.dart'; -import 'package:widgets/utils/pather.dart'; - -class ShapeCard extends StatelessWidget { - const ShapeCard({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Card( - color: const Color(0xffB3FE65), - elevation: 6, - shape: StarShapeBorder(), - child: Container( - alignment: Alignment.center, - width: 100, - height: 100, - child: const Text("Card", style: TextStyle(fontSize: 20)), - ), - ); - } -} - -class StarShapeBorder extends ShapeBorder { - @override - EdgeInsetsGeometry get dimensions => EdgeInsets.zero; - - @override - Path getInnerPath(Rect rect, {TextDirection? textDirection}) { - return Path(); - } - - @override - Path getOuterPath(Rect rect, {TextDirection? textDirection}) => - Pather.create.nStarPath(9, 50, 40, dx: 50, dy: 50); - - @override - void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) { - } - - @override - ShapeBorder scale(double t) { - return this; - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart deleted file mode 100644 index 8ffe39fe..00000000 --- a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart +++ /dev/null @@ -1,45 +0,0 @@ - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 17, -// "priority": 1, -// "name": "CheckBoxListTile的基本表现如下", -// "subtitle": "【secondary】: 左侧组件 【Widget】\n" -// "【checkColor】: ✔️颜色 【Color】\n" -// "【activeColor】: 选中时外框颜色 【Color】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【onChanged】: 选中事件 【Function(bool)】", -// } -import 'package:flutter/material.dart'; - -class CustomCheckBoxListTile extends StatefulWidget { - const CustomCheckBoxListTile({Key? key}) : super(key: key); - - @override - _CustomCheckBoxListTileState createState() => _CustomCheckBoxListTileState(); -} - -class _CustomCheckBoxListTileState extends State { - bool _selected = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: CheckboxListTile( - value: _selected, - checkColor: Colors.yellow, - activeColor: Colors.orangeAccent, - secondary: Image.asset("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _selected = !_selected), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart b/packages/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart deleted file mode 100644 index 9b626012..00000000 --- a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart +++ /dev/null @@ -1,41 +0,0 @@ - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 17, -// "priority": 2, -// "name": "CheckBoxListTile的选中效果", -// "subtitle": "【selected】: 是否选中 【bool】", -// } -import 'package:flutter/material.dart'; - -class SelectCheckBoxListTile extends StatefulWidget { - const SelectCheckBoxListTile({Key? key}) : super(key: key); - - @override - _SelectCheckBoxListTileState createState() => _SelectCheckBoxListTileState(); -} - -class _SelectCheckBoxListTileState extends State { - bool _selected = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: CheckboxListTile( - value: _selected, - selected: _selected, - checkColor: Colors.yellow, - activeColor: Colors.orangeAccent, - secondary: Image.asset("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _selected = !_selected), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart b/packages/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart deleted file mode 100644 index 5f990ffe..00000000 --- a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart +++ /dev/null @@ -1,41 +0,0 @@ -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 17, -// "priority": 3, -// "name": "CheckBoxListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } - -import 'package:flutter/material.dart'; - -class DenseCheckBoxListTile extends StatefulWidget { - const DenseCheckBoxListTile({Key? key}) : super(key: key); - - @override - _DenseCheckBoxListTileState createState() => _DenseCheckBoxListTileState(); -} - -class _DenseCheckBoxListTileState extends State { - bool _selected = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: CheckboxListTile( - value: _selected, - dense: true, - checkColor: Colors.yellow, - activeColor: Colors.orangeAccent, - secondary: Image.asset("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _selected = !_selected), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart b/packages/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart deleted file mode 100644 index f2d853a7..00000000 --- a/packages/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 215 CheckedModeBanner 仅在debug运行模式中显示右上角角标,没什么太大卵用。在 MaterialApp 组件源码中有使用场景。 -// { -// "widgetId": 215, -// "name": 'CheckedModeBanner基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】", -// } - -class CheckedModeBannerDemo extends StatelessWidget { - const CheckedModeBannerDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return CheckedModeBanner( - child: Container( - alignment: Alignment.center, - width: 250, - height: 150, - color: Theme.of(context).primaryColor, - child: const Text( - "CheckedModeBanner", - style: TextStyle(color: Colors.white, fontSize: 20), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Chip/node1_base.dart b/packages/widgets/lib/StatelessWidget/Chip/node1_base.dart deleted file mode 100644 index a0d18340..00000000 --- a/packages/widgets/lib/StatelessWidget/Chip/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ - - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 11, -// "priority": 1, -// "name": "Chip的普通表现如下", -// "subtitle": "【avatar】: 左侧组件 【Widget】\n" -// "【label】: 中间组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【labelPadding】: label边距 【EdgeInsetsGeometry】", -// } - -import 'package:flutter/material.dart'; -class CustomChip extends StatelessWidget { - const CustomChip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - Chip( - avatar: Image.asset("assets/images/icon_head.webp"), - label: const Text("张风捷特烈"), - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(5), - ), - const Chip( - avatar: CircleAvatar( - backgroundImage: - AssetImage("assets/images/wy_200x300.webp")), - label: Text("百里巫缨"), - padding: EdgeInsets.all(8), - labelPadding: EdgeInsets.all(6), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Chip/node2_color.dart b/packages/widgets/lib/StatelessWidget/Chip/node2_color.dart deleted file mode 100644 index 3b49e4ef..00000000 --- a/packages/widgets/lib/StatelessWidget/Chip/node2_color.dart +++ /dev/null @@ -1,45 +0,0 @@ - - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 11, -// "priority": 2, -// "name": "可以设置颜色和阴影", -// "subtitle": "【backgroundColor】: 背景色 【Color】\n" -// "【shadowColor】: 阴影色 【Color】\n" -// "【elevation】: 影深 【double】", -// } -import 'package:flutter/material.dart'; -class ColorOfChip extends StatelessWidget { - const ColorOfChip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - Chip( - avatar: Image.asset("assets/images/icon_head.webp"), - label: const Text("张风捷特烈"), - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(5), - backgroundColor: Colors.grey.withAlpha(66), - shadowColor: Colors.orangeAccent, - elevation: 3, - ), - Chip( - avatar: Image.asset("assets/images/icon_head.webp"), - label: const Text("张风捷特烈"), - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(5), - backgroundColor: Colors.cyanAccent.withAlpha(11), - shadowColor: Colors.blue.withAlpha(88), - elevation: 4, - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Chip/node3_delete.dart b/packages/widgets/lib/StatelessWidget/Chip/node3_delete.dart deleted file mode 100644 index 3ebe27b8..00000000 --- a/packages/widgets/lib/StatelessWidget/Chip/node3_delete.dart +++ /dev/null @@ -1,36 +0,0 @@ - - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 11, -// "priority": 3, -// "name": "可以设置右侧点击按钮", -// "subtitle": "【deleteIcon】: 右侧组件(通常为Icon) 【Widget】\n" -// "【deleteIconColor】: 右侧组件颜色 【Color】\n" -// "【onDeleted】: 右侧组件点击事件 【Function】", -// } -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - -class DeleteOfChip extends StatelessWidget { - const DeleteOfChip({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Chip( - avatar: Image.asset("assets/images/icon_head.webp"), - label: const Text("张风捷特烈"), - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - backgroundColor: Colors.grey.withAlpha(66), - shadowColor: Colors.orangeAccent, -// deleteIcon: Icon(Icons.close,size: 18), - deleteIconColor: Colors.red, - onDeleted: () => DialogAbout.show(context), - elevation: 3, - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart b/packages/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart deleted file mode 100644 index 6d136447..00000000 --- a/packages/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart +++ /dev/null @@ -1,48 +0,0 @@ - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 12, -// "priority": 1, -// "name": "ChoiceChip的普通表现如下", -// "subtitle": "【selectedColor】: 选中时颜色 【Color】\n" -// "【selectedShadowColor】: 选中时阴影颜色 【Color】\n" -// "【onSelected】: 选中事件 【Fuction(bool)】\n" -// " 其他属性同Chip组件,无右侧组件。", -// } - -import 'package:flutter/material.dart'; - -class CustomChoiceChip extends StatefulWidget { - const CustomChoiceChip({Key? key}) : super(key: key); - - @override - _CustomChoiceChipState createState() => _CustomChoiceChipState(); -} - -class _CustomChoiceChipState extends State { - bool _select = false; - - @override - Widget build(BuildContext context) { - return ChoiceChip( - selected: _select, - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(5), - label: Text( - _select ? - "You are selected it." : - "This is a ChoiceChip.", - style: const TextStyle(fontSize: 16), - ), - backgroundColor: Colors.grey.withAlpha(66), - avatar: Image.asset("assets/images/icon_head.webp"), - selectedColor: Colors.orangeAccent.withAlpha(44), - selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, - elevation: 3, - onSelected: (value) => setState(() => _select = value), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart b/packages/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart deleted file mode 100644 index ff2fd147..00000000 --- a/packages/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 9, -// "priority": 1, -// "name": "CircleAvatar的表现", -// "subtitle": "【radius】 : 半径 【double】\n" -// "【backgroundImage】 : 图片资源 【ImageProvider】\n" -// "【foregroundColor】: 前景色 【Color】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【minRadius】: 最小半径 【double】\n" -// "【maxRadius】: 最大半径 【double】\n" -// "【child】: 孩子组件 【Child】", -// } - -import 'package:flutter/material.dart'; - -class CustomCircleAvatar extends StatelessWidget { - const CustomCircleAvatar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const CircleAvatar( - radius: 50, - backgroundImage: AssetImage("assets/images/wy_200x300.webp"), - foregroundColor: Colors.white, - child: Icon( - Icons.check, - size: 50, - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart deleted file mode 100644 index 958b9f3b..00000000 --- a/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart +++ /dev/null @@ -1,20 +0,0 @@ -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 32, -// "priority": 1, -// "name": "CloseButton点击事件", -// "subtitle": " 点击时会退出当前栈", -// } - -import 'package:flutter/material.dart'; - -class CustomCloseButton extends StatelessWidget { - const CustomCloseButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const CloseButton(); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Container/node1_base.dart b/packages/widgets/lib/StatelessWidget/Container/node1_base.dart deleted file mode 100644 index eee3ff0f..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node1_base.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可用于显示一个指定宽高的区域', -// "priority": 1, -// "subtitle": "【width】 : 宽 【int】\n" -// "【高】: 外边距 【int】\n" -// "【color】: 子组件 【Color】", -// } -class CustomContainer extends StatelessWidget { - const CustomContainer({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.topLeft, - width: 200, - height: 200 * 0.618, - color: Colors.red.withAlpha(88), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Container/node2_child.dart b/packages/widgets/lib/StatelessWidget/Container/node2_child.dart deleted file mode 100644 index 1c77f689..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node2_child.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可以在区域中放入一个子组件', -// "priority": 2, -// "subtitle": "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【margin】: 外边距 【EdgeInsetsGeometry】\n" -// "【child】: 子组件 【Widget】", -// } -class ContainerWithChild extends StatelessWidget { - const ContainerWithChild({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.all(20), - margin: const EdgeInsets.all(10), - width: 200, - height: 200 * 0.618, - color: Colors.grey.withAlpha(88), - child: const Icon(Icons.android), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Container/node3_alignment.dart b/packages/widgets/lib/StatelessWidget/Container/node3_alignment.dart deleted file mode 100644 index af324e07..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node3_alignment.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可对子组件进行对齐定位', -// "priority": 3, -// "subtitle": "【alignment】 : 对齐定位 【AlignmentGeometry】", -// } -class ContainerAlignment extends StatelessWidget { - const ContainerAlignment({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.bottomRight, - width: 200, - height: 200 * 0.618, - color: Colors.grey.withAlpha(88), - child: const Icon( - Icons.android, - color: Colors.green, - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Container/node4_decoration.dart b/packages/widgets/lib/StatelessWidget/Container/node4_decoration.dart deleted file mode 100644 index 96e94caa..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node4_decoration.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可对子组件进行装饰', -// "priority": 4, -// "subtitle": -// "【decoration】 : 装饰 【Decoration】\n " -// "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容", -// } -class ContainerDecoration extends StatelessWidget { - ContainerDecoration({Key? key}) : super(key: key); - - final List rainbow = [ - 0xffff0000, - 0xffFF7F00, - 0xffFFFF00, - 0xff00FF00, - 0xff00FFFF, - 0xff0000FF, - 0xff8B00FF - ]; - - final List stops = [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; - - @override - Widget build(BuildContext context) { - - return Container( - alignment: Alignment.center, - width: 200, - height: 200 * 0.618, - margin: const EdgeInsets.all(20), - padding: const EdgeInsets.all(20), - decoration: BoxDecoration(//添加渐变色 - gradient: LinearGradient( - stops: stops, - colors: rainbow.map((e) => Color(e)).toList()), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(50), - bottomRight: Radius.circular(50)), - boxShadow: const [ - BoxShadow( - color: Colors.grey, - offset: Offset(1, 1), - blurRadius: 10, - spreadRadius: 1), - ]), - child: const Text( - "Container", - style: TextStyle(fontSize: 20), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Container/node5_transform.dart b/packages/widgets/lib/StatelessWidget/Container/node5_transform.dart deleted file mode 100644 index a37e2189..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node5_transform.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": 'Container还具有变换性', -// "priority": 5, -// "subtitle": "【transform】 : 变换矩阵 【Matrix4】\n " -// "基于Matrix4的矩阵变换,变换详情见线性代数", -// } -class ContainerTransform extends StatelessWidget { - const ContainerTransform({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - color: Colors.cyanAccent, - width: 150, - height: 150 * 0.618, - transform: Matrix4.skew(-pi / 10, 0), - child: const Text( - "Container", - style: TextStyle(fontSize: 20), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Container/node6_constraints.dart b/packages/widgets/lib/StatelessWidget/Container/node6_constraints.dart deleted file mode 100644 index 3371138f..00000000 --- a/packages/widgets/lib/StatelessWidget/Container/node6_constraints.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": 'Container的约束性', -// "priority": 6, -// "subtitle": -// "【constraints】 : 约束 【BoxConstraints】\n " -// "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。", -// } -class ContainerConstraints extends StatelessWidget { - const ContainerConstraints({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue, - width: 200, - height: 200 * 0.618, - constraints: const BoxConstraints( - minWidth: 100, - maxWidth: 150, - minHeight: 20, - maxHeight: 100, - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart deleted file mode 100644 index 89f27834..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 131, -// "name": 'CupertinoActionSheet基本使用', -// "priority": 1, -// "subtitle": "【title】 : 第一行组件 【Widget】\n" -// "【message】 : 第二行组件 【Widget】\n" -// "【cancelButton】 : 取消按钮处组件 【Widget】\n" -// "【actions】 : 中间组件列表 【List】", -// } -class CustomCupertinoActionSheet extends StatelessWidget { - const CustomCupertinoActionSheet({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildRaisedButton(context), - _buildCupertinoActionSheet(context), - ], - ); - } - - Widget _buildCupertinoActionSheet(BuildContext context) => - Container( - alignment: Alignment.bottomCenter, - child: CupertinoActionSheet( - title: const Text("Please chose a language"), - message: const Text('the language you use in this application.'), - cancelButton: CupertinoActionSheetAction( - onPressed: () => Navigator.pop(context), child: const Text("Cancel")), - actions: [ - CupertinoActionSheetAction( - onPressed: () => Navigator.pop(context), - child: const Text('Dart')), - CupertinoActionSheetAction( - onPressed: () => Navigator.pop(context), - child: const Text('Java')), - CupertinoActionSheetAction( - onPressed: () => Navigator.pop(context), - child: const Text('Kotlin')), - ], - ), - ); - - Widget _buildRaisedButton(BuildContext context) => ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () => showDialog( - context: context, - builder: (ctx) => _buildCupertinoActionSheet(context)), - child: const Text( - 'Just Show It !', - style: TextStyle(color: Colors.white), - ), - ); -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart deleted file mode 100644 index 99003ba9..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:widgets/utils/dialog_about.dart'; - - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 132, -// "name": 'CupertinoActionSheetAction基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -class CustomCupertinoActionSheetAction extends StatelessWidget { - const CustomCupertinoActionSheetAction({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - margin: const EdgeInsets.all(5), - color: Colors.grey.withAlpha(33), - child: CupertinoActionSheetAction( - isDefaultAction: true, - onPressed: () => DialogAbout.show(context), - child: const Text('张风捷特烈')), - ), - Container( - color: Colors.grey.withAlpha(33), - margin: const EdgeInsets.all(5), - child: CupertinoActionSheetAction( - isDefaultAction: false, - onPressed: () => DialogAbout.show(context), - child: const Text('百里·巫缨')), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart deleted file mode 100644 index 41ec6801..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 132, -// "name": 'CupertinoActionSheetAction基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } - -class CustomCupertinoAlertDialog extends StatelessWidget { - const CustomCupertinoAlertDialog({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildRaisedButton(context), - _buildCupertinoAlertDialog(context), - ], - ); - } - - Widget _buildRaisedButton(BuildContext context) => - ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () { - showDialog( - context: context, - builder: (ctx) => _buildCupertinoAlertDialog(context)); - }, - child: const Text( - 'Just Show It !', - style: TextStyle(color: Colors.white), - ), - ); - - Widget _buildCupertinoAlertDialog(BuildContext context) { - return Material( - color: Colors.transparent, - child: CupertinoAlertDialog( - title: _buildTitle(context), - content: _buildContent(), - actions: [ - CupertinoButton( - child: const Text("Yes, Delete"), - onPressed: () => Navigator.pop(context), - ), - CupertinoButton( - child: const Text("Cancle"), - onPressed: () => Navigator.pop(context), - ), - ]), - ); - } - - Widget _buildTitle(context) { - return Row( - //标题 - children: [ - const Icon( - CupertinoIcons.delete_solid, - color: Colors.red, - ), - const Expanded( - child: Text( - 'Delete File', - style: TextStyle(color: Colors.red, fontSize: 20), - )), - InkWell( - child: const Icon(CupertinoIcons.clear_thick), - onTap: () => Navigator.pop(context), - ) - ]); - } - - Widget _buildContent() { - return Padding( - padding: const EdgeInsets.only(top: 18.0), - child: Column( - children: const[ - Text( - ' Hi toly! If you push the conform buttom ,' - ' You will lose this file. Are you sure wand to do that?', - style: TextStyle(color: Color(0xff999999), fontSize: 16), - textAlign: TextAlign.justify, - ), - ], - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart deleted file mode 100644 index 679eeeca..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 352 CupertinoDialogAction 0 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。 -// { -// "widgetId": 352, -// "name": "CupertinoDialogAction基本使用", -// "priority": 1, -// "subtitle": "【isDefaultAction】 : 是否是默认性操作 【bool】\n" -// "【isDestructiveAction】 : 是否是毁灭性操作 【bool】\n" -// "【textStyle】: 文字样式 【TextStyle】\n" -// "【onPressed】: 点击事件 【VoidCallback】\n" -// "【child】: 子组件 【Widget】", -// } -class CupertinoDialogActionDemo extends StatelessWidget { - const CupertinoDialogActionDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - CupertinoDialogAction( - isDestructiveAction: false, - onPressed: () => _toast(context), - child: const Text('CupertinoDialogAction'), - ), - CupertinoDialogAction( - isDestructiveAction: true, - onPressed: () => _toast(context), - child: const Text('CupertinoDialogAction'), - ), - ], - ); - } - - void _toast(BuildContext context) { - SnackBar snackBar = SnackBar( - backgroundColor: Theme.of(context).primaryColor, - content: const Text('CupertinoDialogAction'), - ); - - ScaffoldMessenger.of(context).showSnackBar(snackBar); - - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart deleted file mode 100644 index 8ff03dba..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/11 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 219 CupertinoFullscreenDialogTransition 0 全页面过渡变换 创建一个 iOS 风格的转换,用于唤出全屏对话框。link 216 -// { -// "widgetId": 219, -// "name": '组件介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【linearTransition】 : 是否线性转换 【bool】\n" -// "【primaryRouteAnimation】 : 初始路由动画 【Animation】\n" -// "【secondaryRouteAnimation】 : 第二路由动画 【Animation】", -// } - -class CupertinoFullscreenDialogTransitionDemo extends StatelessWidget { - const CupertinoFullscreenDialogTransitionDemo({Key? key}) : super(key: key); - - final String info = - '和 CupertinoPageTransition 一样,该组件底层基于 SlideTransition 组件实现,' - '主要用途是模仿 iOS 风格,用于唤出全屏对话框动画过渡效果。' - '源码中唯一的使用处是 CupertinoPageRoute 处理路由跳转动画时,一般不会单独使用。' - '当【route.fullscreenDialog】为 true 时,会使用 CupertinoFullscreenDialogTransition 组件,否则使用 CupertinoPageTransition 组件。' - '其中个属性信息和 CupertinoPageTransition 组件一致,详见之。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart deleted file mode 100644 index f87463ad..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 218 CupertinoNavigationBarBackButton Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。 -// { -// "widgetId": 218, -// "name": "返回按钮基本使用", -// "priority": 1, -// "subtitle": "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【color】: 颜色 【Color】", -// } - -class CupertinoNavigationBarBackButtonDemo extends StatelessWidget { - const CupertinoNavigationBarBackButtonDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return CupertinoNavigationBarBackButton( - color: Colors.deepPurpleAccent, - onPressed: () => Navigator.of(context).pop(), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart deleted file mode 100644 index 69a5524f..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/11 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 216 CupertinoPageTransition 0 风格的页面过渡动画变换 提供一个 iOS 风格的页面过渡动画。 link 219 -// { -// "widgetId": 216, -// "name": 'CupertinoPageTransition 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【linearTransition】 : 是否线性转换 【bool】\n" -// "【primaryRouteAnimation】 : 初始路由动画 【Animation】\n" -// "【secondaryRouteAnimation】 : 第二路由动画 【Animation】", -// } -class CupertinoPageTransitionDemo extends StatelessWidget { - const CupertinoPageTransitionDemo({Key? key}) : super(key: key); - - final String info = - '该组件底层基于 SlideTransition 组件实现,主要用途是模仿 iOS 风格,处理页面间跳转的过渡动画。' - '源码中唯一的使用处是 CupertinoPageRoute 处理路由跳转动画时,一般不会单独使用。' - '如 A 跳转到 B, primaryRouteAnimation 和 secondaryRouteAnimation 都是一个 0.0->1.0 的动画,' - '前者用于处理 B 界面进入过渡动画;后者用于处理 A 界面被覆盖的过渡动画。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart deleted file mode 100644 index 0b4b281a..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 217 CupertinoPopupSurface 模糊弹出层 -/// ios 弹出框的圆角矩形模糊背景,源码中应用于 Cupertino 风格的对话框中。 -/// -// { -// "widgetId": 217, -// "name": 'CupertinoPopupSurface 使用', -// "priority": 1, -// "subtitle": "【isSurfacePainted】 : 是否绘白 【bool】\n" -// "【child】 : 子组件 【Widget】\n" -// "测试效果左侧 isSurfacePainted = false,右侧 isSurfacePainted = true", -// } - -class CupertinoPopupSurfaceDemo extends StatelessWidget { - CupertinoPopupSurfaceDemo({Key? key}) : super(key: key); - - final List rainbow = [ - 0xffff0000, - 0xffFF7F00, - 0xffFFFF00, - 0xff00FF00, - 0xff00FFFF, - 0xff0000FF, - 0xff8B00FF - ]; - - final List stops = [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; - - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - gradient: RadialGradient( - radius: 1.8, - stops: stops, - colors: rainbow.map((e) => Color(e)).toList())), - padding: const EdgeInsets.all(10), - child: Wrap( - spacing: 10, - children: [ - buildCupertinoPopupSurface(false), - buildCupertinoPopupSurface(true), - ], - ), - ); - } - - Widget buildCupertinoPopupSurface(bool isSurfacePainted) { - return CupertinoPopupSurface( - isSurfacePainted: isSurfacePainted, - child: Container( - width: 150, - height: 100, - color: Colors.white.withOpacity(0.3), - alignment: Alignment.center, - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart b/packages/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart deleted file mode 100644 index b1334981..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 169, -// "name": '文字样式-TextTheme', -// "priority": 1, -// "subtitle": "后代组件可以通过CupertinoTheme.of获取主题的数据进行使用。", -// } -class TextCupertinoTheme extends StatelessWidget { - const TextCupertinoTheme({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - CupertinoTextThemeData queryData = CupertinoTheme.of(context).textTheme; - Map styles = { - "tabLabelTextStyle: ": queryData.tabLabelTextStyle, - "actionTextStyle: ": queryData.actionTextStyle, - "navActionTextStyle: ": queryData.navActionTextStyle, - "textStyle: ": queryData.textStyle, - "navTitleTextStyle: ": queryData.navTitleTextStyle, - "pickerTextStyle: ": queryData.pickerTextStyle, - "dateTimePickerTextStyle: ": queryData.dateTimePickerTextStyle, - "navLargeTitleTextStyle: ": queryData.navLargeTitleTextStyle, - }; - TextStyle style = - const TextStyle(fontSize: 16, fontWeight: FontWeight.bold); - return Column( - children: - styles.keys.map((e) => buildItem(e, style, styles[e]!)).toList(), - ); - } - - Widget buildItem(String label, TextStyle labelStyle, TextStyle style) => - Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(label, style: labelStyle), - Text("@toly", style: style) - ], - ), - ), - const Divider(height: 1) - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart b/packages/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart deleted file mode 100644 index 2a336d2a..00000000 --- a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 169, -// "name": 'CupertinoThemeData的使用', -// "priority": 2, -// "subtitle": -// "和Theme一样可以通过指定的属性,让它们在后代中共享,不过属性较少。注意如果需要使用主题,不能在当前的context中获取。", -// } - -class CustomCupertinoTheme extends StatelessWidget { - const CustomCupertinoTheme({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const CupertinoTheme( - data: CupertinoThemeData( - primaryColor: Colors.blue, primaryContrastingColor: Colors.green), - child: _ChildUseTheme()); - } -} - -class _ChildUseTheme extends StatelessWidget { - const _ChildUseTheme({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Container( - width: 50, - height: 50, - color: CupertinoTheme.of(context).primaryContrastingColor, - ), - SizedBox(width: 150, child: Slider(value: 0.8, onChanged: (v) => {})), - SizedBox( - width: 150, - child: Divider( - color: CupertinoTheme.of(context).primaryContrastingColor, - thickness: 1, - )) - ]); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/DataTable/node1_base.dart b/packages/widgets/lib/StatelessWidget/DataTable/node1_base.dart deleted file mode 100644 index 24f11f7a..00000000 --- a/packages/widgets/lib/StatelessWidget/DataTable/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-21 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 102, -// "name": 'DataTable基本使用', -// "priority": 1, -// "subtitle": -// "【columns】 : 列 【List】\n" -// "【rows】 : 行 【List】", -// } - -class _Bean { - final int id; - final String name; - final String type; - - _Bean(this.id, this.name, this.type); -} - -class CustomDataTable extends StatelessWidget { - CustomDataTable({Key? key}) : super(key: key); - - final List<_Bean> data = [ - _Bean(101, 'DataTable', 'StatelessWidget'), - _Bean(44, 'RangeSlider', 'StatefulWidget'), - _Bean(2, 'Text', 'StatelessWidget'), - _Bean(1, 'Image', 'StatefulWidget'), - ]; - - final List columns = ['id', '名称', '类型']; - - @override - Widget build(BuildContext context) { - return DataTable( - columns: columns - .map((String title) => DataColumn(label: Text(title))) - .toList(), - rows: data - .map((_Bean bean) => DataRow(cells: [ - DataCell(Text('${bean.id}')), - DataCell(Text(bean.name)), - DataCell(Text(bean.type)), - ])) - .toList()); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/DayPicker/node1_base.dart b/packages/widgets/lib/StatelessWidget/DayPicker/node1_base.dart deleted file mode 100644 index 5fc12937..00000000 --- a/packages/widgets/lib/StatelessWidget/DayPicker/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ - - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 134, -// "name": 'DayPicker基本使用', -// "priority": 1, -// "subtitle": -// "【selectedDate】 : 选中日期 【DateTime】\n" -// "【currentDate】 : 当前日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【displayedMonth】 : 当前展示的月份 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } -import 'package:flutter/material.dart'; - -class CustomDayPicker extends StatelessWidget{ - - const CustomDayPicker({Key? key}) : super(key: key); - - final String info = - 'DayPicker 日期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } - - // final DateTime _date = DateTime.now(); - // - // @override - // Widget build(BuildContext context) { - // return SizedBox( - // height: 350, - // child: DayPicker( - // selectedDate: _date, - // currentDate: DateTime.now(), - // onChanged: (date)=> setState(() => _date = date), - // firstDate: DateTime(2018), - // lastDate: DateTime(2030), - // displayedMonth: DateTime.now() - // ), - // ); - // } -} diff --git a/packages/widgets/lib/StatelessWidget/Dialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/Dialog/node1_base.dart deleted file mode 100644 index e5af212c..00000000 --- a/packages/widgets/lib/StatelessWidget/Dialog/node1_base.dart +++ /dev/null @@ -1,139 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 126, -// "name": 'Dialog基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 动画图标数据 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } -class CustomDialog extends StatelessWidget { - const CustomDialog({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildRaisedButton(context), - _buildDialog(), - ], - ); - } - - Widget _buildDialog() => const Dialog( - backgroundColor: Colors.white, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - child: SizedBox( - width: 50, - child: DeleteDialog(), - ), - ); - - Widget _buildRaisedButton(BuildContext context) => ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () { - showDialog(context: context, builder: (ctx) => _buildDialog()); - }, - child: const Text( - 'Just Show It !', - style: TextStyle(color: Colors.white), - ), - ); - -} - -class DeleteDialog extends StatelessWidget { - const DeleteDialog({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildBar(context), - _buildTitle(), - _buildContent(), - _buildFooter(context), - ], - ); - } - - Widget _buildTitle() { - return const Text( - 'Delete Doucument', - style: TextStyle(color: Color(0xff5CC5E9), fontSize: 24), - ); - } - - Widget _buildContent() { - return const Padding( - padding: EdgeInsets.all(15.0), - child: Text( - ' Hi toly! If you push the conform buttom ,' - ' You will lose this file. Are you sure wand to do that?', - style: TextStyle(color: Color(0xffCFCFCF), fontSize: 16), - textAlign: TextAlign.justify, - ), - ); - } - - Widget _buildFooter(context) { - return Padding( - padding: const EdgeInsets.only(bottom: 15.0, top: 10,left: 10,right: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - alignment: Alignment.center, - height: 40, - width: 100, - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30)), - color: Color(0xff73D1EE)), - child: const Text('Yes', - style: TextStyle(color: Colors.white, fontSize: 16)), - ), - InkWell( - onTap: ()=>Navigator.of(context).pop(), - child: Container( - alignment: Alignment.center, - height: 40, - width: 100, - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30)), - color: Colors.orangeAccent), - child: const Text('Cancle', - style: TextStyle(color: Colors.white, fontSize: 16)), - ), - ) - ], - ), - ); - } - - Widget _buildBar(context) => Container( - height: 30, - alignment: Alignment.centerRight, - margin: const EdgeInsets.only(right: 10, top: 5), - child: InkWell( - onTap: ()=>Navigator.of(context).pop(), - child: const Icon( - Icons.close, - color: Color(0xff82CAE3), - ), - ), - ); -} diff --git a/packages/widgets/lib/StatelessWidget/Divider/node1_base.dart b/packages/widgets/lib/StatelessWidget/Divider/node1_base.dart deleted file mode 100644 index 952f021b..00000000 --- a/packages/widgets/lib/StatelessWidget/Divider/node1_base.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 34, -// "priority": 1, -// "name": "Divider颜色和粗细", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【thickness】: 线粗细 【double】", -// } - -class CustomDivider extends StatelessWidget { - const CustomDivider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - List dataColor = [ - Colors.red, Colors.yellow, - Colors.blue, Colors.green]; - List dataThickness = [1.0, 2.0, 4.0, 6.0]; - Map data = Map.fromIterables(dataColor, dataThickness); - return Column( - children: dataColor - .map((e) => Divider( - color: e, - thickness: data[e], - )).toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Divider/node2_height.dart b/packages/widgets/lib/StatelessWidget/Divider/node2_height.dart deleted file mode 100644 index 1064d09b..00000000 --- a/packages/widgets/lib/StatelessWidget/Divider/node2_height.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 34, -// "priority": 2, -// "name": "Divider高度和空缺", -// "subtitle": "【indent】: 前面空缺长度 【double】\n" -// "【endIndent】: 后面空缺长度 【double】\n" -// "【height】: 占位高 【double】", -// } - - -class HeightDivider extends StatelessWidget { - const HeightDivider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - List dataThickness = [10.0, 20.0, 30.0, 40.0]; - List dataColor = [ - Colors.red, Colors.yellow, - Colors.blue, Colors.green]; - Map data = Map.fromIterables(dataColor, dataThickness); - - return Column( - children: dataColor - .map((Color color) => Divider( - color: color, - indent:data[color], - endIndent: data[color]!*2, - height: data[color], - thickness: data[color]!/10, - )) - .toList(), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart b/packages/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart deleted file mode 100644 index abc8a027..00000000 --- a/packages/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 221 DraggableScrollableActuator 拖滑重置器 它可以通知后代的 DraggableScrollableSheet,将其位置重置为初始状态。 -// { -// "widgetId": 221, -// "name": '基本使用方法', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "使用 DraggableScrollableActuator.reset(context) 重置后代 DraggableScrollableSheet 位初始位置。", -// } - -class DraggableScrollableActuatorDemo extends StatelessWidget { - const DraggableScrollableActuatorDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(10), - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DraggableScrollableActuatorPage()), - ); - }, - child: const Text("进入 DraggableScrollableActuator 测试页"), - ), - ); - } -} - -class DraggableScrollableActuatorPage extends StatelessWidget { - DraggableScrollableActuatorPage({Key? key}) : super(key: key); - - final List data = [ - Colors.orange[50]!, - Colors.orange[100]!, - Colors.orange[200]!, - Colors.orange[300]!, - Colors.orange[400]!, - Colors.orange[500]!, - Colors.orange[600]!, - Colors.orange[700]!, - Colors.orange[800]!, - Colors.orange[900]!, - Colors.red[50]!, - Colors.red[100]!, - Colors.red[200]!, - Colors.red[300]!, - Colors.red[400]!, - Colors.red[500]!, - Colors.red[600]!, - Colors.red[700]!, - Colors.red[800]!, - Colors.red[900]!, - ]; - - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("DraggableScrollableActuator"), - ), - body: DraggableScrollableActuator( - child: Builder( - builder: (ctx) => Column( - children: [ - ElevatedButton( - onPressed: () { - DraggableScrollableActuator.reset(ctx); - }, - child: const Text("重置位置"), - ), - Expanded( - child: buildSheet(), - ), - ], - ), - ), - ), - ); - } - - Widget buildSheet() => DraggableScrollableSheet( - initialChildSize: 0.3, - minChildSize: 0.2, - maxChildSize: 1, - expand: true, - builder: (BuildContext context, ScrollController scrollController) => - ListView.builder( - controller: scrollController, - itemCount: data.length, - itemBuilder: buildColorItem, - ), - ); - - Widget buildColorItem(BuildContext context, int index) { - return Container( - alignment: Alignment.center, - height: 60, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ]), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatelessWidget/Drawer/node1_base.dart b/packages/widgets/lib/StatelessWidget/Drawer/node1_base.dart deleted file mode 100644 index b57bc0de..00000000 --- a/packages/widgets/lib/StatelessWidget/Drawer/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 154, -// "name": 'Drawer基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 影深 【double】", -// } -import 'package:flutter/material.dart'; - -class CustomDrawer extends StatelessWidget { - const CustomDrawer({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 400, - child: Scaffold( - appBar: AppBar( - title: const Text('Flutter Unit'), - ), - drawer: Drawer( - elevation: 3, - child: _buildChild(), - ), - ), - ); - } - - Widget _buildChild() => ListView( - padding: EdgeInsets.zero, - children: const [ - DrawerHeader( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/caver.webp'), - fit: BoxFit.cover), - ), - child: Text( - '张风捷特烈', - style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3) - ]), - ), - ), - ListTile( - leading: Icon( - Icons.star, - color: Colors.blue, - ), - title: Text('我的收藏'), - ), - ListTile( - leading: Icon( - Icons.palette, - color: Colors.orangeAccent, - ), - title: Text('我的绘画'), - ), - ListTile( - leading: Icon( - Icons.insert_drive_file, - color: Colors.green, - ), - title: Text('我的文件'), - ), - ], - ); -} diff --git a/packages/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart b/packages/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart deleted file mode 100644 index 0b976fdb..00000000 --- a/packages/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart +++ /dev/null @@ -1,84 +0,0 @@ - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 155, -// "name": 'DrawerHeader基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } - -import 'package:flutter/material.dart'; -class CustomDrawerHeader extends StatelessWidget { - const CustomDrawerHeader({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 400, - child: Scaffold( - appBar: AppBar( - title: const Text('Flutter Unit'), - ), - drawer: Drawer( - elevation: 3, - child: _buildChild(), - ), - ), - ); - } - - Widget _buildChild() => ListView( - padding: EdgeInsets.zero, - children: [ - _buildHeader(), - const ListTile( - leading: Icon( - Icons.star, - color: Colors.blue, - ), - title: Text('我的收藏'), - ), - const ListTile( - leading: Icon( - Icons.palette, - color: Colors.orangeAccent, - ), - title: Text('我的绘画'), - ), - const ListTile( - leading: Icon( - Icons.insert_drive_file, - color: Colors.green, - ), - title: Text('我的文件'), - ), - ], - ); - - Widget _buildHeader() => const DrawerHeader( - margin: EdgeInsets.all(10), - padding: EdgeInsets.only(left: 20,top: 15), - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft:Radius.circular(40), - topRight:Radius.circular(40) - ), - image: DecorationImage( - image: AssetImage('assets/images/caver.webp'), - fit: BoxFit.cover), - ), - child: Text( - '张风捷特烈', - style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3) - ]), - ), - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart b/packages/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart deleted file mode 100644 index bd759cf2..00000000 --- a/packages/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 8, -// "priority": 1, -// "name": "FadeInImage.assetNetwork加载网络图片", -// "subtitle": "【placeholder】 : 展位图地址 【String】\n" -// "【image】 : 显示图地址 【String】\n" -// "【width】: 宽 【double】\n" -// "【height】: 高 【double】\n" -// "【fadeInDuration】: 淡入时长 【Duration】\n" -// "【fadeOutDuration】: 淡出时长 【Duration】\n" -// "【fadeInCurve】: 淡入曲线 【Cubic】\n" -// "【fadeOutCurve】: 淡出曲线 【Cubic】\n" -// "【fit】: 适应模式 【BoxFit】\n" -// "【alignment】: 对齐模式 【Alignment】\n" -// "【repeat】: 重复模式 【ImageRepeat】\n", -// } - -class CustomFadeInImage extends StatelessWidget { - const CustomFadeInImage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - String placeholder = "assets/images/icon_head.webp"; - String img = - "https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/" - "15739960c2da4de3a263eeabcb60057f~tplv-k3u1fbpfcp-zoom-crop-mark" - ":1304:1304:1304:734.awebp"; - return FadeInImage.assetNetwork( - placeholder: placeholder, - image: img, - width: 100, - height: 100, - fit: BoxFit.cover, - repeat:ImageRepeat.noRepeat, - alignment: Alignment.center, - fadeInDuration:const Duration(seconds: 5), - fadeInCurve: Curves.easeInCubic, - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/FilterChip/node1_base.dart b/packages/widgets/lib/StatelessWidget/FilterChip/node1_base.dart deleted file mode 100644 index f4db385a..00000000 --- a/packages/widgets/lib/StatelessWidget/FilterChip/node1_base.dart +++ /dev/null @@ -1,70 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 15, -// "priority": 1, -// "name": "FilterChip可接受选择事件", -// "subtitle": "【selected】: 是否选择 【bool】\n" -// "【onSelected】: 选择事件 【Function(bool)】\n" -// "【selectedColor】: 选择后的颜色 【Color】\n" -// "【selectedShadowColor】: 选择后的阴影颜色 【Color】\n", -// } -import 'package:flutter/material.dart'; - -class CustomFilterChip extends StatefulWidget { - const CustomFilterChip({Key? key}) : super(key: key); - - @override - _CustomFilterChipState createState() => _CustomFilterChipState(); -} - -class _CustomFilterChipState extends State { - final Map map = { - 'A': 'Ant', - 'B': 'Bug', - 'C': 'Cat', - 'D': 'Dog', - }; - final List _selected = []; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Wrap( - children: map.keys.map((key) => _buildChild(key)).toList(), - ), - Container( - padding: const EdgeInsets.all(10), - child: Text('您已选择: ${_selected.join(', ')}')), - ], - ); - } - - Padding _buildChild(String key) => Padding( - padding: const EdgeInsets.all(4.0), - child: FilterChip( - selectedColor: Colors.orange.withAlpha(55), - selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, - pressElevation: 5, - elevation: 3, - avatar: CircleAvatar(child: Text(key)), - label: Text(map[key]!), - selected: _selected.contains(map[key]), - onSelected: (bool value) => _onSelected(value, key), - ), - ); - - void _onSelected(bool value, String key) { - setState(() { - if (value) { - _selected.add(map[key]!); - } else { - _selected.removeWhere((name) => name == map[key]); - } - }); - } -} diff --git a/packages/widgets/lib/StatelessWidget/FlatButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/FlatButton/node1_base.dart deleted file mode 100644 index 856b6cf1..00000000 --- a/packages/widgets/lib/StatelessWidget/FlatButton/node1_base.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 25, -// "priority": 1, -// "name": "FlatButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } - -class CustomFlatButton extends StatelessWidget { - const CustomFlatButton({Key? key}) : super(key: key); - - final String info = - 'FlatButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } - -// @override -// Widget build(BuildContext context) { -// return FlatButton( -// onPressed: ()=>{}, -// padding: const EdgeInsets.all(8), -// splashColor: Colors.green, -// child: const Text("FlatButton"), -// textColor: const Color(0xffFfffff), -// color: Colors.blue, -// highlightColor: const Color(0xffF88B0A), -// ); -// } -} diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart deleted file mode 100644 index 9a5e7b34..00000000 --- a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart +++ /dev/null @@ -1,40 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 1, -// "name": "FloatingActionButton点击事件", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【tooltip】: 长按时提示文字 【String】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【foregroundColor】: 前景色 【Color】\n" -// "【elevation】: 影深 【double】\n" -// "【onPressed】: 点击事件 【Function】", -// } -import 'package:flutter/material.dart'; - -class CustomFAB extends StatelessWidget { - const CustomFAB({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Map data = { - Colors.red: Icons.add, - Colors.blue: Icons.bluetooth, - Colors.green: Icons.android, - }; - return Wrap( - spacing: 20, - children: data.keys - .map((e) => FloatingActionButton( - heroTag: e.toString()+"a", - onPressed: () {}, - backgroundColor: e, - foregroundColor: Colors.white, - child: Icon(data[e]), - tooltip: "android", - elevation: 5, //z-阴影盖度 - )).toList()); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart b/packages/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart deleted file mode 100644 index 276d6043..00000000 --- a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart +++ /dev/null @@ -1,63 +0,0 @@ - - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 3, -// "name": "shape属性", -// "subtitle": "【shape】: 形状 【ShapeBorder】", -// } - -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:widgets/utils/pather.dart'; - -class ShapeFAB extends StatelessWidget { - const ShapeFAB({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Map data = { - Colors.red: Icons.add, - Colors.blue: Icons.bluetooth, - Colors.green: Icons.android, - }; - return Wrap( - spacing: 20, - children: data.keys - .map((e) => FloatingActionButton( - heroTag: e.toString()+"c", - onPressed: () {}, - backgroundColor: e, - shape: StarBorder(), - foregroundColor: Colors.white, - child: Icon(data[e]), - tooltip: "android", - elevation: 5, - )).toList()); - } -} - -/// 边线形状类 -class StarBorder extends ShapeBorder { - @override - EdgeInsetsGeometry get dimensions => EdgeInsets.zero; - - @override - Path getInnerPath(Rect rect, {TextDirection? textDirection}) => Path(); - - @override - Path getOuterPath(Rect rect, {TextDirection? textDirection}) { - return Pather.create.nStarPath(20, 25, 25 * cos((360 / 9 / 2) * pi / 180), - dx: rect.height / 2, dy: rect.width / 2); - } - - @override - void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {} - - @override - ShapeBorder scale(double t) => this; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart b/packages/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart deleted file mode 100644 index d45dad47..00000000 --- a/packages/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart +++ /dev/null @@ -1,35 +0,0 @@ - - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 4, -// "priority": 1, -// "name": "用于显示一个FlutterLogo", -// "subtitle": "【size】 : 大小 【double】\n" -// "【colors】: 颜色 【MaterialColor】", -// } -import 'package:flutter/material.dart'; - -class CustomFlutterLogo extends StatelessWidget { - const CustomFlutterLogo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - - Map data = { - Colors.blue:50.0, - Colors.red:60.0, - Colors.green:70.0, - Colors.yellow:80.0, - }; - return Wrap( - children: data.keys - .map((e) => FlutterLogo( - size: data[e], - textColor: e, - )).toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart b/packages/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart deleted file mode 100644 index 3e9f4197..00000000 --- a/packages/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-26 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 4, -// "priority": 2, -// "name": "样式用于显示文字", -// "subtitle": "【style】 : 样式-3种枚举 【FlutterLogoStyle】\n" -// "【textColor】: 文字颜色 【Color】", -// } -class FlutterLogoWithText extends StatelessWidget { - const FlutterLogoWithText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final Map data = { - FlutterLogoStyle.horizontal: Colors.blue, - FlutterLogoStyle.markOnly: Colors.red, - FlutterLogoStyle.stacked: Colors.green, - }; - - return Wrap( - spacing: 20, - children: data.keys - .map((FlutterLogoStyle style) => FlutterLogo( - size: 80, - style: style, - textColor: data[style]!, - )) - .toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart b/packages/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart deleted file mode 100644 index 697fdca8..00000000 --- a/packages/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 146, -// "name": 'GestureDetector基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【GestureTapCallback】\n" -// "【onLongPress】 : 长按事件 【GestureLongPressCallback】", -// } - -class CustomGestureDetector extends StatefulWidget { - const CustomGestureDetector({Key? key}) : super(key: key); - - @override - _CustomGestureDetectorState createState() => _CustomGestureDetectorState(); -} - -class _CustomGestureDetectorState extends State { - String _info = ''; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => setState(() => _info = 'onTap'), - onDoubleTap: () => setState(() => _info = 'onDoubleTap'), - onLongPress: () => setState(() => _info = 'onLongPress'), - child: Container( - alignment: Alignment.center, - width: 300, - height: 300 * 0.4, - color: Colors.grey.withAlpha(33), - child: Text( - _info, - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart b/packages/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart deleted file mode 100644 index 63522f2d..00000000 --- a/packages/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 146, -// "name": 'GestureDetector详情信息', -// "priority": 2, -// "subtitle": -// "【onTapDown】 : 按下回调 【GestureTapDownCallback】\n" -// "【onTapUp】 : 点击抬起回调 【GestureTapUpCallback】\n" -// "【onTapCancel】 : 点击取消 【GestureTapCancelCallback】", -// } -class TapGestureDetector extends StatefulWidget { - const TapGestureDetector({Key? key}) : super(key: key); - - @override - _TapGestureDetectorState createState() => _TapGestureDetectorState(); -} - -class _TapGestureDetectorState extends State { - String _info = ''; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTapDown: (detail) => setState(() => _info = - 'onTapDown:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), - onTapUp: (detail) => setState(() => _info = - 'onTapUp:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), - onTapCancel: () => setState(() => _info = 'onTapCancel'), - child: Container( - alignment: Alignment.center, - width: 300, - height: 300 * 0.618, - color: Colors.grey.withAlpha(33), - child: Text( - _info, - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart b/packages/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart deleted file mode 100644 index 18a05900..00000000 --- a/packages/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 146, -// "name": 'GestureDetector的Pan事件', -// "priority": 3, -// "subtitle": -// "【onPanDown】 : 按下回调 【GestureDragDownCallback】\n" -// "【onPanEnd】 : 拖动结束 【GestureDragEndCallback】\n" -// "【onPanStart】 : 开始拖动 【GestureDragStartCallback】\n" -// "【onPanUpdate】 : 拖动更新 【GestureDragUpdateCallback】\n" -// "【onPanCancel】 : 拖动取消 【GestureDragCancelCallback】", -// } -class PanGestureDetector extends StatefulWidget { - const PanGestureDetector({Key? key}) : super(key: key); - - @override - _PanGestureDetectorState createState() => _PanGestureDetectorState(); -} - -class _PanGestureDetectorState extends State { - String _info = ''; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onPanDown: (detail) => setState(() => _info = - 'onPanDown:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), - onPanEnd: (detail) => setState(() => _info = - 'onPanEnd:\n初速度:${detail.primaryVelocity}\n最终速度:${detail.velocity}'), - onPanUpdate: (detail) => setState(() => _info = - 'onPanUpdate:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), - onPanStart: (detail) => setState(() => _info = - 'onPanStart:\n相对落点:${detail.localPosition}\n绝对落点:${detail.globalPosition}'), - onPanCancel: () => setState(() => _info = 'onTapCancel'), - child: SingleChildScrollView( - child: Container( - alignment: Alignment.center, - width: 300, - height: 300 * 0.618, - color: Colors.grey.withAlpha(33), - child: Text( - _info, - style: const TextStyle(fontSize: 18, color: Colors.blue), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node1_base.dart b/packages/widgets/lib/StatelessWidget/GirdView/node1_base.dart deleted file mode 100644 index 49b729d4..00000000 --- a/packages/widgets/lib/StatelessWidget/GirdView/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 163, -// "name": 'GridView.count构造', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【crossAxisCount】 : 主轴一行box数量 【int】\n" -// "【mainAxisSpacing】 : 主轴每行间距 【double】\n" -// "【crossAxisSpacing】 : 交叉轴每行间距 【double】\n" -// "【childAspectRatio】 : box主长/交叉轴长 【double】\n" -// "【crossAxisCount】 : 主轴一行数量 【int】", -// } -class CustomGridView extends StatelessWidget { - CustomGridView({Key? key}) : super(key: key); - - final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: GridView.count( - crossAxisCount: 4, - mainAxisSpacing: 2, - crossAxisSpacing: 2, - childAspectRatio: 1 / 0.618, - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - Container _buildItem(Color color) => Container( - alignment: Alignment.center, - width: 100, - height: 30, - color: color, - child: Text( - colorString(color), - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ], - ), - ), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node2_direction.dart b/packages/widgets/lib/StatelessWidget/GirdView/node2_direction.dart deleted file mode 100644 index 51f72338..00000000 --- a/packages/widgets/lib/StatelessWidget/GirdView/node2_direction.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 163, -// "name": 'GridView滑动方向', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向滑动 【bool】\n" -// "【shrinkWrap】 : 无边界时是否包裹 【bool】", -// } -class HorizontalGridView extends StatelessWidget { - HorizontalGridView({Key? key}) : super(key: key); - - final List data = List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: GridView.count( - scrollDirection: Axis.horizontal, - reverse: true, - crossAxisCount: 4, - mainAxisSpacing: 2, - crossAxisSpacing: 2, - childAspectRatio: 0.618, - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - Container _buildItem(Color color) => Container( - alignment: Alignment.center, - width: 100, - height: 30, - color: color, - child: Text( - colorString(color), - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ], - ), - ), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node3_extend.dart b/packages/widgets/lib/StatelessWidget/GirdView/node3_extend.dart deleted file mode 100644 index a7da1abc..00000000 --- a/packages/widgets/lib/StatelessWidget/GirdView/node3_extend.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 163, -// "name": 'GridView.extent构造', -// "priority": 3, -// "subtitle": -// "【maxCrossAxisExtent】 : box轴向长度 【double】\n" -// "【reverse】 : 是否反向滑动 【bool】\n" -// "【shrinkWrap】 : 无边界时是否包裹 【bool】", -// } -class ExtentGridView extends StatelessWidget { - ExtentGridView({Key? key}) : super(key: key); - - final List data = List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: GridView.extent( - scrollDirection: Axis.horizontal, - maxCrossAxisExtent: 80.0, - mainAxisSpacing: 2, - crossAxisSpacing: 2, - childAspectRatio: 0.618, - children: data.map((color) => _buildItem(color)).toList(), - ), - ); - } - - Container _buildItem(Color color) => Container( - alignment: Alignment.center, - width: 100, - height: 30, - color: color, - child: Text( - colorString(color), - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ], - ), - ), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart b/packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart deleted file mode 100644 index 12955197..00000000 --- a/packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 37, -// "priority": 1, -// "name": "GridPager 基础属性", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【color】: 颜色 【Color】\n" -// "【interval】: 小块边长 【double】", -// } -class CustomGridPage extends StatelessWidget { - const CustomGridPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 100, - child: GridPaper( - color: Colors.red, - interval: 50, - child: Image.asset( - "assets/images/wy_300x200.webp", - fit: BoxFit.cover, - ))); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart b/packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart deleted file mode 100644 index 82d4eada..00000000 --- a/packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 37, -// "priority": 2, -// "name": "GridPager 再分割", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【color】: 颜色 【Color】\n" -// "【subdivisions】: 小块中子块个数 【int】\n" -// "【divisions】: 小块中子块的分割数 【int】", -// } -class DivisionsGridPage extends StatelessWidget { - const DivisionsGridPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 100, - child: GridPaper( - color: Colors.red, - interval: 50, - divisions: 4, - subdivisions: 4, - child: Image.asset( - "assets/images/wy_300x200.webp", - fit: BoxFit.cover, - ))); - } -} diff --git a/packages/widgets/lib/StatelessWidget/GridTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/GridTile/node1_base.dart deleted file mode 100644 index 80d58f8a..00000000 --- a/packages/widgets/lib/StatelessWidget/GridTile/node1_base.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 21, -// "priority": 1, -// "name": "GridTile的基本表现如下", -// "subtitle": "【header】: 头组件 【Widget】\n" -// "【child】: 子组件 【Widget】\n" -// "【footer】: 脚组件 【Widget】", -// } - -class CustomGridTile extends StatelessWidget { - const CustomGridTile({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 200, - child: GridTile( - header: GridTileBar( - backgroundColor: Colors.blue.withAlpha(120), - trailing: const Icon(Icons.star, color: Colors.red), - leading: const CircleAvatar( - backgroundImage: AssetImage("assets/images/wy_200x300.webp"), - ), - title: const Text("百里·巫缨"), - subtitle: const Text("倾国必倾城"), - ), - child: Opacity( - opacity: 0.5, - child: Image.asset("assets/images/sabar.webp", fit: BoxFit.cover), - ), - footer: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "ID:z\$ySX32&29", - style: TextStyle( - shadows: [ - Shadow( - color: Colors.blue, offset: Offset(.1, .1), blurRadius: 2), - ], - ), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart b/packages/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart deleted file mode 100644 index 62c394dd..00000000 --- a/packages/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 20, -// "priority": 1, -// "name": "GridTileBar的基本表现如下", -// "subtitle": "【leading】: 左侧组件 【Widget】\n" -// "【trailing】: 尾组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【backgroundColor】: 背景色 【Color】", -// } - - -class CustomGridTileBar extends StatelessWidget { - const CustomGridTileBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return GridTileBar( - backgroundColor: Colors.blue.withAlpha(120), - trailing: const Icon(Icons.star, color: Colors.red), - leading: const CircleAvatar( - backgroundImage: AssetImage("assets/images/wy_200x300.webp"), - ), - title: const Text("百里·巫缨"), - subtitle: const Text("倾国必倾城"), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart b/packages/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart deleted file mode 100644 index a3960a62..00000000 --- a/packages/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/11 -/// contact me by email 1981462002@qq.com -/// -/// 说明: 213 HtmlElementView 0 在 Flutter Web 的 Widget 层次结构中嵌入一个 HTML 元素。 -// { -// "widgetId": 213, -// "name": 'HtmlElementView 介绍', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【child】\n" -// "【viewType】 : html元素唯一表识 【String】", -// } -class HtmlElementViewDemo extends StatelessWidget { - const HtmlElementViewDemo({Key? key}) : super(key: key); - - final String info = - '该组件只能用于 Flutter Web 中,嵌入 Html 元素的较为昂贵。' - '内部基于 PlatformViewLink 和 PlatformViewSurface 组件实现。'; - - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Icon/node1_base.dart b/packages/widgets/lib/StatelessWidget/Icon/node1_base.dart deleted file mode 100644 index 522ecbf7..00000000 --- a/packages/widgets/lib/StatelessWidget/Icon/node1_base.dart +++ /dev/null @@ -1,32 +0,0 @@ - - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 6, -// "priority": 1, -// "name": "用于显示一个图标", -// "subtitle": "【入参】 :图标数据 【IconData】\n" -// "【size】 : 大小 【double】\n" -// "【color】: 颜色 【Color】", -// } - - -class CustomIcon extends StatelessWidget { - const CustomIcon({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - Icon(Icons.send, color: Colors.orange, size: 60), - Icon(Icons.android, color: Colors.green, size: 100), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart b/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart deleted file mode 100644 index 42b415b1..00000000 --- a/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:app_config/app_config.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 6, -// "priority": 2, -// "name": "使用自定义图标", -// "subtitle": "可在iconfont网站中下载图标字体进行使用", -// } - - -class MyIcon extends StatelessWidget { - const MyIcon({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - TolyIcon.icon_search, - TolyIcon.icon_star, - TolyIcon.icon_layout, - TolyIcon.icon_star_ok - ].map((e) => Icon( - e, - color: Colors.green, - size: 60, - ),).toList(), - ); - } -} - diff --git a/packages/widgets/lib/StatelessWidget/IconButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/IconButton/node1_base.dart deleted file mode 100644 index 12bdf2e5..00000000 --- a/packages/widgets/lib/StatelessWidget/IconButton/node1_base.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 30, -// "priority": 1, -// "name": "IconButton属性", -// "subtitle": "【icon】: 图标组件 【Widget】\n" -// "【tooltip】: 长按提示文字 【String】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【splashColor】: 水波纹色 【Color】\n" -// "【onPressed】: 点击事件 【Function】", -// } - -class CustomIconButton extends StatelessWidget { - const CustomIconButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: IconButton( - padding: const EdgeInsets.only(), - onPressed: () {}, - icon: const Icon(Icons.android, size: 40, color: Colors.green), - tooltip: "android", - highlightColor: Colors.orangeAccent, - splashColor: Colors.blue, - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart deleted file mode 100644 index 36f24f6a..00000000 --- a/packages/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 7, -// "priority": 1, -// "name": "用于显示一个纯色图片", -// "subtitle": "【入参】 : 图片资源 【ImageProvider】\n" -// "【size】 : 大小 【double】\n" -// "【color】: 角标颜色 【Color】", -// } - -class CustomImageIcon extends StatelessWidget { - const CustomImageIcon({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Map data = { - Colors.blue: 50.0, - Colors.red: 60.0, - Colors.green: 70.0, - Colors.yellow: 80.0, - }; - return Wrap( - spacing: 10, - children: data.keys - .map((e) => ImageIcon( - const AssetImage("assets/images/leaf.webp"), - color: e, - size: data[e], - )) - .toList(), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/InputChip/node1_base.dart b/packages/widgets/lib/StatelessWidget/InputChip/node1_base.dart deleted file mode 100644 index 441d9bc3..00000000 --- a/packages/widgets/lib/StatelessWidget/InputChip/node1_base.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 14, -// "priority": 1, -// "name": "可以接受点击、删除事件", -// "subtitle": "【onPressed】: 点击事件 【Function()】\n" -// "【onDeleted】: 删除事件 【Function()】", -// } - -class PressInputChip extends StatefulWidget { - const PressInputChip({Key? key}) : super(key: key); - - @override - _PressInputChipState createState() => _PressInputChipState(); -} - -class _PressInputChipState extends State { - bool _delete = false; - - @override - Widget build(BuildContext context) { - return InputChip( - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - label: Text( - !_delete ? - "This is a InputChip." : - "You are clicked delete icon."), - backgroundColor: Colors.grey.withAlpha(66), - avatar: Image.asset("assets/images/icon_head.webp"), - selectedColor: Colors.orangeAccent.withAlpha(88), - selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, - elevation: 3, - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - onDeleted: () => setState(() => _delete = !_delete)); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/InputChip/node2_select.dart b/packages/widgets/lib/StatelessWidget/InputChip/node2_select.dart deleted file mode 100644 index 4b659cf1..00000000 --- a/packages/widgets/lib/StatelessWidget/InputChip/node2_select.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; - - - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 14, -// "priority": 2, -// "name": "可以接受选中事件", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【onSelected】: 选中事件 【Function(bool)】", -// } - -class SelectInputChip extends StatefulWidget { - const SelectInputChip({Key? key}) : super(key: key); - - @override - _SelectInputChipState createState() => _SelectInputChipState(); -} - -class _SelectInputChipState extends State { - bool _select = false; - - @override - Widget build(BuildContext context) { - return InputChip( - selected: _select, - padding: const EdgeInsets.all(5), - labelPadding: const EdgeInsets.all(3), - label: const Text("This is a InputChip."), - backgroundColor: Colors.grey.withAlpha(66), - avatar: Image.asset("assets/images/icon_head.webp"), - selectedColor: Colors.orangeAccent.withAlpha(88), - selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, - elevation: 3, - onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), - onSelected: (bool value) { - setState(() { - _select = value; - }); - print("onSelected"); - }, - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/ListTile/node1_base.dart deleted file mode 100644 index 4ee09902..00000000 --- a/packages/widgets/lib/StatelessWidget/ListTile/node1_base.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 16, -// "priority": 1, -// "name": "ListTile的基本表现如下", -// "subtitle": "【leading】: 左侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【trailing】: 尾组件 【Widget】\n" -// "【contentPadding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onLongPress】: 点击事件 【Function()】", -// } -class CustomListTile extends StatelessWidget { - const CustomListTile({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - title: const Text("以梦为马"), - subtitle: const Text("海子"), - contentPadding: const EdgeInsets.all(5), - trailing: const Icon(Icons.more_vert), - onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node2_select.dart b/packages/widgets/lib/StatelessWidget/ListTile/node2_select.dart deleted file mode 100644 index b45d37c2..00000000 --- a/packages/widgets/lib/StatelessWidget/ListTile/node2_select.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 16, -// "priority": 2, -// "name": "ListTile选中效果和长按事件", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【onTap】: 点击事件 【Function()】", -// } -class SelectListTile extends StatefulWidget { - const SelectListTile({Key? key}) : super(key: key); - - @override - _SelectListTileState createState() => _SelectListTileState(); -} - -class _SelectListTileState extends State { - bool _selected = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - selected: _selected, - title: const Text("以梦为马"), - subtitle: const Text("海子"), - contentPadding: const EdgeInsets.all(5), - trailing: const Icon(Icons.more_vert), - onTap: () => setState(() => _selected = !_selected), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node3_dense.dart b/packages/widgets/lib/StatelessWidget/ListTile/node3_dense.dart deleted file mode 100644 index a176f586..00000000 --- a/packages/widgets/lib/StatelessWidget/ListTile/node3_dense.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 16, -// "priority": 3, -// "name": "ListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } -class DenseListTile extends StatefulWidget { - const DenseListTile({Key? key}) : super(key: key); - - @override - _DenseListTileState createState() => _DenseListTileState(); -} - -class _DenseListTileState extends State { - bool _dense = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: ListTile( - leading: Image.asset("assets/images/icon_head.webp"), - title: const Text("以梦为马"), - subtitle: const Text("海子"), - selected: false, - contentPadding: const EdgeInsets.all(5), - trailing: const Icon(Icons.more_vert), - dense: _dense, - onTap: () => setState(() => _dense = !_dense), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/ListView/node1_base.dart b/packages/widgets/lib/StatelessWidget/ListView/node1_base.dart deleted file mode 100644 index 45afd5a6..00000000 --- a/packages/widgets/lib/StatelessWidget/ListView/node1_base.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-27 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomListView extends StatelessWidget { - CustomListView({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - TextStyle get textStyle => const TextStyle( - color: Colors.white, - shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ], - ); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 5), - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ListView/node2_direction.dart b/packages/widgets/lib/StatelessWidget/ListView/node2_direction.dart deleted file mode 100644 index 081ded31..00000000 --- a/packages/widgets/lib/StatelessWidget/ListView/node2_direction.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 162, -// "name": 'ListView横向滑动', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向滑动 【bool】\n" -// "【shrinkWrap】 : 无边界时是否包裹 【bool】", -// } -class HorizontalListView extends StatelessWidget { - HorizontalListView({Key? key}) : super(key: key); - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - TextStyle get textStyle => const TextStyle( - color: Colors.white, - shadows: [ - Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) - ], - ); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: ListView( - reverse: true, - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Listener/node1_base.dart b/packages/widgets/lib/StatelessWidget/Listener/node1_base.dart deleted file mode 100644 index 894cc42e..00000000 --- a/packages/widgets/lib/StatelessWidget/Listener/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 147, -// "name": 'Listener基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onPointerDown】 : 按下事件 【Function(PointerDownEvent)】\n" -// "【onPointerMove】 : 移动事件 【Function(PointerMoveEvent)】\n" -// "【onPointerMove】 : 抬起事件 【Function(PointerUpEvent)】\n" -// "【onPointerCancel】 : 取消事件 【Function(PointerUpEvent)】", -// } - -class CustomListener extends StatefulWidget { - const CustomListener({Key? key}) : super(key: key); - - @override - _CustomListenerState createState() => _CustomListenerState(); -} - -class _CustomListenerState extends State { - String _info = ''; - - @override - Widget build(BuildContext context) { - return Listener( - onPointerDown: (detail) => setState(() => _info = detail.toString()), - onPointerMove: (detail) => setState(() => _info = detail.toString()), - onPointerUp: (detail) => setState(() => _info = detail.toString()), - onPointerCancel: (detail) => setState(() => _info = detail.toString()), - - child: Container( - alignment: Alignment.center, - width: 300, - height: 300 * 0.618, - color: Colors.grey.withAlpha(33), - child: Text( - _info, - style: const TextStyle(fontSize: 16, color: Colors.blue), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart b/packages/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart deleted file mode 100644 index 236ac64f..00000000 --- a/packages/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/21 -/// contact me by email 1981462002@qq.com -/// 说明: 211 MaterialBanner Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等。 - -// { -// "widgetId": 211, -// "name": 'MaterialBanner一行的使用', -// "priority": 1, -// "subtitle": "【content】 : 中间组件 【Widget】\n" -// "【leading】: 左侧组件 【Widget】\n" -// "【actions】: 右侧组件列表 【List】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【forceActionsBelow】: 是否按钮在下方 【bool】\n" -// "【backgroundColor】: 背景色 【Color】", -// } -class MaterialBannerDemo extends StatelessWidget { - const MaterialBannerDemo({Key? key}) : super(key: key); - - final String info = 'Welcome to Flutter Unit!'; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - MaterialBanner( - content: Text( - info, - style: const TextStyle(color: Colors.white), - ), - backgroundColor: Colors.purple, - leading: const Icon(Icons.info, color: Colors.lightBlueAccent), - padding: const EdgeInsetsDirectional.only(start: 16.0, top: 2.0), - forceActionsBelow: false, - // 默认false - actions: const [ - Text( - 'I KNOW', - style: TextStyle( - color: Colors.orange, - fontWeight: FontWeight.bold, - fontSize: 14), - ) - ], - )], - ); - } - -} diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart deleted file mode 100644 index ad46dc97..00000000 --- a/packages/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 23, -// "priority": 1, -// "name": "MaterialButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【height】: 高 【double】\n" -// "【elevation】: 影深 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } - -class CustomMaterialButton extends StatelessWidget { - const CustomMaterialButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialButton( - height: 40, - elevation: 5, - color: Colors.orangeAccent, - textColor: Colors.white, - splashColor: Colors.blue, - padding: const EdgeInsets.all(8), - child: const Text("MaterialButton"), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart b/packages/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart deleted file mode 100644 index fba95a72..00000000 --- a/packages/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 23, -// "priority": 2, -// "name": "MaterialButton长按事件", -// "subtitle": "【highlightColor】: 长按高亮色 【Color】\n" -// "【onLongPress】: 长按事件 【Function】", -// } - -class LongPressMaterialButton extends StatelessWidget { - const LongPressMaterialButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialButton( - height: 40, - elevation: 5, - color: Colors.blue, - highlightColor: Colors.green, - textColor: Colors.white, - padding: const EdgeInsets.all(8), - child: const Text("MaterialButton"), - onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart b/packages/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart deleted file mode 100644 index 9ab3246c..00000000 --- a/packages/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 23, -// "priority": 3, -// "name": "MaterialButton的自定义形状", -// "subtitle": "【shape】: 形状 【ShapeBorder】", -// } - -class ShapeMaterialButton extends StatelessWidget { - const ShapeMaterialButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 20, - children: [ - SizedBox( - width: 40, - height: 40, - child: MaterialButton( - padding: const EdgeInsets.all(0), - textColor: const Color(0xffFfffff), - elevation: 3, - color: Colors.blue, - highlightColor: const Color(0xffF88B0A), - splashColor: Colors.red, - child: const Icon( - Icons.add, - color: Colors.white, - ), - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - ), - onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), - ), - SizedBox( - width: 100, - height: 40, - child: MaterialButton( - padding: const EdgeInsets.all(0), - textColor: const Color(0xffFfffff), - elevation: 3, - color: Colors.blue, - highlightColor: const Color(0xffF88B0A), - splashColor: Colors.red, - child: const Icon( - Icons.remove, - color: Colors.white, - ), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(15))), - onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart b/packages/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart deleted file mode 100644 index bdabc296..00000000 --- a/packages/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-01 -/// contact me by email 1981462002@qq.com -/// 说明: 212 ModalBarrier 屏障模 -/// 相当于一块幕布,防止用户与其背后的 Widget 交互,可以通过 dismissible 决定点击时,是否触发返回栈。源码中用于 Dialog 相关组件。 -/// link: 227,126,127,128 -// { -// "widgetId": 212, -// "name": 'ModalBarrier 介绍', -// "priority": 1, -// "subtitle": -// "【dismissible】 : 点击是否返回 【bool】\n" -// "【color】 : 颜色 【Color】", -// } -class ModalBarrierDemo extends StatelessWidget { - const ModalBarrierDemo({Key? key}) : super(key: key); - - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - height: 100, - child: Stack(alignment: Alignment.center, children: [ - ModalBarrier( - dismissible: true, - color: Colors.grey.withOpacity(0.3), - ), - const Text('点击背景返回') - ]), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart b/packages/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart deleted file mode 100644 index 7789c819..00000000 --- a/packages/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/20 -/// contact me by email 1981462002@qq.com -/// 说明: NavigationToolbar 214 左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。 -// { -// "widgetId": 214, -// "name": 'NavigationToolbar基本使用', -// "priority": 1, -// "subtitle": "【leading】 : 左侧组件 【Widget】\n" -// "【middle】: 中间组件 【Widget】\n" -// "【trailing】: 右侧组件组件 【Widget】\n" -// "【centerMiddle】: 中间组件是否居中 【bool】\n" -// "【middleSpacing】: 中间组件距左距离 【double】", -// } -class NavigationToolbarDemo extends StatelessWidget { - const NavigationToolbarDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: const [ - SizedBox( - height: 60, - child: NavigationToolbar( - leading: Icon(Icons.ac_unit), - middle: Text('middleSpacing#true'), - middleSpacing: 20, - centerMiddle: true, - trailing: Icon(Icons.more_vert), - ), - ), - SizedBox( - height: 60, - child: NavigationToolbar( - leading: Icon(Icons.ac_unit), - middle: Text('middleSpacing#false'), - middleSpacing: 20, - centerMiddle: false, - trailing: Icon(Icons.more_vert), - ), - ), - ], - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart b/packages/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart deleted file mode 100644 index 4231b996..00000000 --- a/packages/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/8/14 -/// contact me by email 1981462002@qq.com -/// 说明: NotificationListener 220 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 -// { -// "widgetId": 220, -// "name": "监听OverscrollIndicatorNotification", -// "priority": 1, -// "subtitle": "该通知之后在滑动到最顶和最底是回调,通过leading属性判断是顶部还是底部。另外通过notification#disallowGlow(),可以去除顶底滑动蓝色阴影", -// } - -class NotificationListenerDemo extends StatefulWidget { - const NotificationListenerDemo({Key? key}) : super(key: key); - - @override - _NotificationListenerDemoState createState() => _NotificationListenerDemoState(); -} - -class _NotificationListenerDemoState extends State { - final List data = List.generate(30, (i) => '第${i + 1}条'); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 250, - child: NotificationListener( - onNotification: _onNotification, - child: CupertinoScrollbar( - child: ListView.separated( - itemBuilder: _buildItem, - itemCount: data.length, - separatorBuilder: (_,__)=>const Divider(height: 5,), - ), - )), - ); - } - - bool _onNotification(OverscrollIndicatorNotification notification) { - if (notification.leading) { - notification.disallowIndicator(); - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text('已滑到顶部'), - backgroundColor: Colors.blue, - duration: Duration(milliseconds: 200), - )); - } else { - notification.disallowIndicator(); - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text('已滑到底部'), - duration: Duration(milliseconds: 200), - backgroundColor: Colors.blue, - )); - } - - return true; - } - - Widget _buildItem(BuildContext context, int index) { - return Container( - height: 50, - alignment: Alignment.center, - child: Text(data[index],style: TextStyle(color: Theme.of(context).primaryColor,fontSize: 18),), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart b/packages/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart deleted file mode 100644 index 22968e88..00000000 --- a/packages/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/21 -/// contact me by email 1981462002@qq.com -/// 说明: 203 OrientationBuilder 能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。 -// { -// "widgetId": 203, -// "name": 'OrientationBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】 : 方向组件构造器 【OrientationWidgetBuilder】", -// } -class OrientationBuilderDemo extends StatefulWidget { - const OrientationBuilderDemo({Key? key}) : super(key: key); - - @override - _OrientationBuilderDemoState createState() => _OrientationBuilderDemoState(); -} - -class _OrientationBuilderDemoState extends State { - double _width = 200; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - width: _width, - height: 200, - child: OrientationBuilder(builder: _builder), - color: Colors.orange, - ), - _buildSlider() - ], - ); - } - - //根据回调的orientation返回组件 - Widget _builder(BuildContext context, Orientation orientation) { - switch(orientation){ - case Orientation.portrait: - return const Icon(Icons.phone_android,size: 60,); - case Orientation.landscape: - return const RotatedBox( - quarterTurns: 1, - child: Icon(Icons.phone_android,size: 60,)); - default: return Container(); - } - } - - Widget _buildSlider() =>Slider( - value: _width, - max: 350.0, - min: 80.0, - divisions: 17, - onChanged: (v)=> setState(() => _width= v), - ); -} diff --git a/packages/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart deleted file mode 100644 index bba68e82..00000000 --- a/packages/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 27, -// "priority": 1, -// "name": "OutlineButton点击事件", -// "subtitle": "【textColor】: 子组件文字颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【highlightedBorderColor】: 高亮时框色 【Color】\n" -// "【child】: 子组件 【Widget】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【borderSide】: 边线 【BorderSide】\n" -// "【onPressed】: 点击事件 【Function】", -// } - -class CustomOutlineButton extends StatelessWidget { - const CustomOutlineButton({Key? key}) : super(key: key); - - final String info = - 'OutlineButton 按钮于 Flutter3.0 退出历史舞台。取代者为 OutlinedButton 按钮。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } - - // @override - // Widget build(BuildContext context) { - // return OutlineButton(//边线按钮 - // onPressed: () {}, - // child: const Text("OutlineButton"), - // padding: const EdgeInsets.all(8), - // splashColor: Colors.green, - // highlightColor: Colors.orangeAccent, - // highlightedBorderColor: Colors.grey, - // textColor: const Color(0xff000000), - // borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2), - // ); - // } -} diff --git a/packages/widgets/lib/StatelessWidget/PageStorage/node1_base.dart b/packages/widgets/lib/StatelessWidget/PageStorage/node1_base.dart deleted file mode 100644 index 2f62074c..00000000 --- a/packages/widgets/lib/StatelessWidget/PageStorage/node1_base.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/8/14 -/// contact me by email 1981462002@qq.com -/// 说明: PageStorage 210 0 页面存储器 可以将页面状态进行存储,在切页时可以保持状态。源码中在ScrollView、PageView、ExpansionTile等皆有应用。 -// { -// "widgetId": 210, -// "name": "PageStorage基本使用", -// "priority": 1, -// "subtitle": "【bucket】 : 存储区 【PageStorageBucket】\n" -// "【child】: 子组件 【Widget】\n" -// "上面切换界面初始化组件时并不会将状态重置。如上CountWidget,子组件需要在初始化时从存储器中读取状态,在改变状态时将状态量写入存储器。另外,如果使用MaterialApp已经内置了PageStorage,不过你也可以创建PageStorage。", -// } - -class PageStorageDemo extends StatefulWidget { - const PageStorageDemo({Key? key}) : super(key: key); - - @override - _PageStorageDemoState createState() => _PageStorageDemoState(); -} - -class _PageStorageDemoState extends State { - int _pageIndex = 0; - final PageStorageBucket _bucket = PageStorageBucket(); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Scaffold( - body: PageStorage( - child: _buildContentByIndex(), - bucket: _bucket, - ), - bottomNavigationBar: BottomNavigationBar( - elevation: 0, - backgroundColor: Colors.blueAccent.withAlpha(55), - currentIndex: _pageIndex, - onTap: (int index) { - setState(() { - _pageIndex = index; - }); - }, - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.settings), - label: 'Setting', - ), - ], - ), - ), - ); - } - - Widget _buildContentByIndex() { - if (_pageIndex == 0) { - return const CountWidget(key: PageStorageKey('CountWidget1')); - } - - if (_pageIndex == 1) { - return const CountWidget(key: PageStorageKey('CountWidget2')); - } - - return ListView(); - } -} - -class CountWidget extends StatefulWidget { - const CountWidget({Key? key}) : super(key: key); - - @override - _CountWidgetState createState() => _CountWidgetState(); -} - -class _CountWidgetState extends State { - int _count = 0; - - @override - void initState() { - super.initState(); - _count = PageStorage.of(context)?.readState(context); - } - - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('点击了$_count次'), - MaterialButton( - onPressed: _addCount, - child: const Icon( - Icons.add, - color: Colors.white, - ), - color: Colors.green, - shape: const CircleBorder( - side: BorderSide(width: 2.0, color: Color(0xFFDFDFDF)), - )) - ], - ), - ); - } - - void _addCount() { - setState(() { - _count++; - PageStorage.of(context)?.writeState(context, _count); - }); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Placeholder/node1_base.dart b/packages/widgets/lib/StatelessWidget/Placeholder/node1_base.dart deleted file mode 100644 index c7f8f680..00000000 --- a/packages/widgets/lib/StatelessWidget/Placeholder/node1_base.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 36, -// "priority": 1, -// "name": "Placeholder基础属性", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【strokeWidth】: 线粗 【double】", -// } -class CustomPlaceholder extends StatelessWidget { - const CustomPlaceholder({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const SizedBox( - width: 100, - height: 100*0.618, - child: Placeholder( - color: Colors.orangeAccent, - strokeWidth: 2, - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart b/packages/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart deleted file mode 100644 index 63030673..00000000 --- a/packages/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 36, -// "priority": 2, -// "name": "Placeholder的fallback属性", -// "subtitle": " 当所在区域无宽高约束时,占位组件的宽高。" -// "【fallbackHeight】: 高 【double】\n" -// "【fallbackWidth】: 宽 【double】", -// } -class FallbackPlaceholder extends StatelessWidget { - const FallbackPlaceholder({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const UnconstrainedBox( - child: Placeholder( - color: Colors.blue, - strokeWidth: 2, - fallbackHeight: 100, - fallbackWidth: 150, - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart b/packages/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart deleted file mode 100644 index 73ac81bd..00000000 --- a/packages/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 159, -// "name": 'PositionedDirectional基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【end】 : 到父右距离 【double】\n" -// "【start】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } -class CustomPositionedDirectional extends StatelessWidget { - const CustomPositionedDirectional({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - Widget yellowBox = Container( - color: Colors.yellow, - height: 100, - width: 100, - ); - - Widget redBox = Container( - color: Colors.red, - height: 90, - width: 90, - ); - - Widget greenBox = Container( - color: Colors.green, - height: 80, - width: 80, - ); - - Widget cyanBox = Container( - color: Colors.cyanAccent, - height: 70, - width: 70, - ); - - return Container( - width: 200, - height: 120, - color: Colors.grey.withAlpha(33), - child: Stack( - children: [ - yellowBox, - redBox, - PositionedDirectional(top: 20, start: 20, child: greenBox), - PositionedDirectional( - child: cyanBox, - bottom: 10, - end: 10, - ) - ], - )); - } -} diff --git a/packages/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart b/packages/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart deleted file mode 100644 index bad7a866..00000000 --- a/packages/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/5/3 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 204, -// "name": 'PreferredSize调整AppBar高度', -// "priority": 1, -// "subtitle": "【preferredSize】 : 尺寸 【Size】", -// } -class CustomPreferredSize extends StatelessWidget { - const CustomPreferredSize({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(150), - child: AppBar( - title: const Text('PreferredSize'), - ), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart deleted file mode 100644 index 1ed6c0a5..00000000 --- a/packages/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 19, -// "priority": 1, -// "name": "RadioListTile需要一个泛型T", -// "subtitle": "【value】 : 条目对象 【T】\n" -// "【groupValue】 : 选中对象 【T】\n" -// "【selected】: 是否选中 【bool】\n" -// "【secondary】: 右侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【onChanged】: 切换事件 【Function(T)】", -// } - -enum ItemType { - java, - kotlin, - dart, -} - -class ItemBean { - final String title; - final String subTitle; - final String imgUrl; - - ItemBean(this.title, this.subTitle, this.imgUrl); -} - -class CustomRadioListTile extends StatefulWidget { - const CustomRadioListTile({Key? key}) : super(key: key); - - @override - _CustomRadioListTileState createState() => _CustomRadioListTileState(); -} - -class _CustomRadioListTileState extends State { - final Map languages = { - ItemType.java: - ItemBean("Java", "曾经世界上最流行的语言", "assets/images/java.webp"), - ItemType.kotlin: - ItemBean("Kotlin", "未来世界上最流行的语言", "assets/images/kotlin.webp"), - ItemType.dart: - ItemBean("Dart", "世界上最优雅的语言", "assets/images/dart.webp"), - }; - ItemType _type = ItemType.java; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.grey.withAlpha(11), - child: Column( - mainAxisSize: MainAxisSize.min, - children: languages.keys - .map((type) => RadioListTile( - value: type, - groupValue: _type, - title: Text(languages[type]!.title), - subtitle: Text(languages[type]!.subTitle), - selected: _type == type, - secondary: CircleAvatar( - backgroundImage: AssetImage(languages[type]!.imgUrl), - ), - onChanged: (ItemType? type) => setState(() => _type = type?? _type), - )) - .toList()), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart deleted file mode 100644 index e375c2c0..00000000 --- a/packages/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 26, -// "priority": 1, -// "name": "RaisedButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【elevation】: 影深 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } - -class CustomRaisedButton extends StatelessWidget { - const CustomRaisedButton({Key? key}) : super(key: key); - - final String info = - 'RaisedButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。'; - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ); - } - - // @override - // Widget build(BuildContext context) { - // return RaisedButton( - // color: Colors.blue, - // splashColor: Colors.green, - // onPressed: () {}, - // child: const Text("RaisedButton"), - // textColor: const Color(0xffFfffff), - // padding: const EdgeInsets.all(8), - // elevation: 5, - // highlightColor: const Color(0xffF88B0A), - // ); - // } -} diff --git a/packages/widgets/lib/StatelessWidget/SafeArea/node1_base.dart b/packages/widgets/lib/StatelessWidget/SafeArea/node1_base.dart deleted file mode 100644 index bfeb97e8..00000000 --- a/packages/widgets/lib/StatelessWidget/SafeArea/node1_base.dart +++ /dev/null @@ -1,127 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 207 SafeArea 安全区 通过添加内边距,来适配一些手机本身特殊性(圆角、刘海屏等)而所造成的布局问题。 -// { -// "widgetId": 207, -// "name": 'SafeArea 使用测试', -// "priority": 1, -// "subtitle": -// "【left】 : 左侧是否启用 【bool】\n" -// "【top】 : 上方是否启用 【bool】\n" -// "【bottom】 : 下方是否启用 【bool】\n" -// "【right】 : 右侧是否启用 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } - -class SafeAreaDemo extends StatelessWidget { - const SafeAreaDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(10), - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SafeAreaPage()), - ); - }, - child: const Text("进入 SafeArea 测试页"), - ), - ); - } -} - -class SafeAreaPage extends StatefulWidget { - const SafeAreaPage({Key? key}) : super(key: key); - - @override - _SafeAreaPageState createState() => _SafeAreaPageState(); -} - -class _SafeAreaPageState extends State { - bool _top = true; - bool _left = true; - bool _right = true; - bool _bottom = true; - - @override - Widget build(BuildContext context) { - return SafeArea( - top: _top, - left: _left, - right: _right, - bottom: _bottom, - child: Scaffold( - appBar: AppBar( - title: const Text( - 'SafeArea 测试', - ), - ), - body: Column( - children: [ - ..._buildSlider(), - Expanded( - child: ListView.separated( - itemCount: 20, - separatorBuilder: (_, __) => const Divider( - height: 1, - ), - itemBuilder: (_, index) => Container( - color: Colors.blue, - // padding: EdgeInsets.only(left: 20), - alignment: Alignment.center, - height: 50, - child: Text( - "第$index个", - style: const TextStyle(fontSize: 24, color: Colors.white), - ), - ), - ), - ), - ], - ), - ), - ); - } - - List _buildSlider()=>[Row( - children: [ - Switch( - value: _top, - onChanged: (v) => setState(() => _top = v), - ), - Text("top: $_top") - ], - ), - Row( - children: [ - Switch( - value: _left, - onChanged: (v) => setState(() => _left = v), - ), - Text("left: $_left") - ], - ), - Row( - children: [ - Switch( - value: _right, - onChanged: (v) => setState(() => _right = v), - ), - Text("right: $_right") - ], - ), - Row( - children: [ - Switch( - value: _bottom, - onChanged: (v) => setState(() => _bottom = v), - ), - Text("bottom: $_bottom") - ], - ),]; -} diff --git a/packages/widgets/lib/StatelessWidget/ScrollView/node1_base.dart b/packages/widgets/lib/StatelessWidget/ScrollView/node1_base.dart deleted file mode 100644 index 5211f615..00000000 --- a/packages/widgets/lib/StatelessWidget/ScrollView/node1_base.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 -/// contact me by email 1981462002@qq.com -/// 说明: 349 ScrollView 滑动视图 -/// 该组件用于滑动的支持,该类是一个抽象类,所以无法直接使用,它有很多实现类,如 CustomScrollView、BoxScrollView、ListView、GridView。 -/// link 183,162,163,253,340 -/// -// { -// "widgetId": 349, -// "name": 'ScrollView 介绍', -// "priority": 1, -// "subtitle": "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【cacheExtent】 : 缓存长 【double】\n" -// "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】\n" -// "【clipBehavior】 : 裁剪行为 【ClipBehavior】\n" -// "【controller】 : 控制器 【ScrollController】", -// } - -class ScrollViewDemo extends StatelessWidget { - const ScrollViewDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 300, - child: MyScrollView(), - ); - } -} - -class MyScrollView extends ScrollView { - MyScrollView({Key? key}) : super(key: key); - - final String info = - 'ScrollView 其内部依靠 Viewport + Scrollable 实现滑动。它只有一个 buildSlivers 的抽象方法,返回 Sliver 家族 Widget 列表,' - '其子类最简单的是 CustomScrollView,将 slivers 交由用户传递,自身打个酱油。' - 'ListView 和 GridView 在底层源码中也是使用 Sliver 家族相关组件实现的。'; - - final List data = [ - Colors.purple[50]!, - Colors.purple[100]!, - Colors.purple[200]!, - Colors.purple[300]!, - Colors.purple[400]!, - Colors.purple[500]!, - Colors.purple[600]!, - Colors.purple[700]!, - Colors.purple[800]!, - Colors.purple[900]!, - ]; - - @override - List buildSlivers(BuildContext context) { - return [ - _buildSliverAppBar(), - SliverToBoxAdapter( - child: Container( - color: Colors.blue.withOpacity(0.1), - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.all(10), - child: Text(info), - ), - ), - _buildSliverFixedExtentList() - ]; - } - - _buildSliverAppBar() { - return SliverAppBar( - expandedHeight: 190.0, - leading: Container( - margin: const EdgeInsets.all(10), - child: Image.asset('assets/images/icon_head.webp')), - flexibleSpace: FlexibleSpaceBar(//伸展处布局 - titlePadding: const EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - title: const Text( - '张风捷特烈', - style: TextStyle(color: Colors.black, //标题 - shadows: [ - Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2) - ]), - ), - background: Image.asset( - "assets/images/caver.webp", - fit: BoxFit.cover, - ), - ), - ); - } - - Widget _buildSliverFixedExtentList() => SliverFixedExtentList( - itemExtent: 60, - delegate: SliverChildBuilderDelegate( - (_, int index) => Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: data[index], - child: Text( - colorString(data[index]), - style: const TextStyle(color: Colors.white, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2) - ]), - ), - ), - childCount: data.length), - ); - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} diff --git a/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart deleted file mode 100644 index 565e9870..00000000 --- a/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart +++ /dev/null @@ -1,124 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-24 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 128, -// "name": 'SimpleDialog基本使用', -// "priority": 1, -// "subtitle": -// "【title】 : 顶部组件 【Widget】\n" -// "【children】 : 子组件列表 【List】\n" -// "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n" -// "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } -class CustomSimpleDialog extends StatelessWidget { - const CustomSimpleDialog({Key? key}) : super(key: key); - - final List info = const [ - '性别: 男 未婚', - '微信: zdl1994328', - "掘金: 张风捷特烈", - "github_model: toly1994328", - "邮箱: 1981462008@qq.com", - ]; - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - _buildSimpleDialog(context), - Positioned( - top: 70, - right: 30, - child: _buildRaisedButton(context)), - - ], - ); - } - Widget _buildRaisedButton(BuildContext context) => ElevatedButton( - style: TextButton.styleFrom( - backgroundColor: Colors.blue, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ), - ), - onPressed: () { - showDialog(context: context, builder: (ctx) => _buildSimpleDialog(ctx)); - }, - child: const Text( - 'Just Show It', - style: TextStyle(color: Colors.white), - ), - ); - - SimpleDialog _buildSimpleDialog(BuildContext context) { - return SimpleDialog( - title: _buildTitle(), - titlePadding: const EdgeInsets.only( - top: 5, - left: 20, - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 5), - children: _buildChild(context), - backgroundColor: Colors.white, - elevation: 4, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10))), - ); - } - - List _buildChild(BuildContext context) { - return info - .map((str) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SimpleDialogOption( - onPressed: () => print(str), - child: SizedBox( - width: double.infinity, - child: Text( - str, - style: const TextStyle( - color: Color(0xff999999), fontSize: 16), - ), - ), - ), - Divider( - indent: 20, - height: 12, - color: info.indexOf(str) == info.length - 1 - ? Colors.transparent - : Theme.of(context).dividerColor, - ) - ], - )) - .toList(); - } - - Widget _buildTitle() { - return Row(//标题 - children: [ - Image.asset( - "assets/images/icon_head.webp", - width: 30, - height: 30, - ), - const SizedBox( - width: 10, - ), - const Expanded( - child: Text( - "张风捷特烈", - style: TextStyle(fontSize: 18), - )), - const CloseButton() - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart b/packages/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart deleted file mode 100644 index a5ca6e83..00000000 --- a/packages/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 133, -// "name": 'SimpleDialogOption基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } -class CustomSimpleDialogOption extends StatelessWidget { - const CustomSimpleDialogOption({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - alignment: Alignment.center, - width: double.infinity, - height: 50, - margin: const EdgeInsets.all(5), - color: Colors.grey.withAlpha(33), - child: SimpleDialogOption( - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - child: const Text('张风捷特烈')), - ), - Container( - height: 50, - alignment: Alignment.center, - width: double.infinity, - color: Colors.grey.withAlpha(33), - margin: const EdgeInsets.all(5), - child: SimpleDialogOption( - onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), - child: const Text('百里·巫缨')), - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart b/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart deleted file mode 100644 index 8ea25ad0..00000000 --- a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-28 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 164, -// "name": 'SingleChildScrollView基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } -class CustomSingleChildScrollView extends StatelessWidget { - CustomSingleChildScrollView({Key? key}) : super(key: key); - - final List data = [ - Colors.blue[50]!, - Colors.blue[100]!, - Colors.blue[200]!, - Colors.blue[300]!, - Colors.blue[400]!, - Colors.blue[500]!, - Colors.blue[600]!, - Colors.blue[700]!, - Colors.blue[800]!, - Colors.blue[900]!, - ]; - - TextStyle get textStyle => const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ], - ); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Column( - children: data - .map((color) => Container( - alignment: Alignment.center, - height: 50, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart b/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart deleted file mode 100644 index 030dfe9e..00000000 --- a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 164, -// "name": 'SingleChildScrollView滑动方向', -// "priority": 2, -// "subtitle": "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【Axis】", -// } -class DirectionSingleChildScrollView extends StatelessWidget { - DirectionSingleChildScrollView({Key? key}) : super(key: key); - - final List data = [ - Colors.blue[50]!, - Colors.blue[100]!, - Colors.blue[200]!, - Colors.blue[300]!, - Colors.blue[400]!, - Colors.blue[500]!, - Colors.blue[600]!, - Colors.blue[700]!, - Colors.blue[800]!, - Colors.blue[900]!, - ]; - - TextStyle get textStyle => const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ) - ], - ); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - reverse: true, - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - children: data - .map((color) => Container( - alignment: Alignment.center, - width: 90, - color: color, - child: Text( - colorString(color), - style: textStyle, - ), - )) - .toList(), - ), - - ), - ); - } - - String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/SnackBar/node1_base.dart b/packages/widgets/lib/StatelessWidget/SnackBar/node1_base.dart deleted file mode 100644 index 48b2896e..00000000 --- a/packages/widgets/lib/StatelessWidget/SnackBar/node1_base.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 140, -// "name": 'SnackBar基本使用', -// "priority": 1, -// "subtitle": -// "【content】 : 中间内容组件 【Widget】\n" -// "【action】 : 右侧按钮 【SnackBarAction】\n" -// "【duration】 : 持续时长 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【onVisible】 : 显示时回调 【Function()】", -// } -class CustomSnackBar extends StatefulWidget { - const CustomSnackBar({Key? key}) : super(key: key); - - @override - _CustomSnackBarState createState() => _CustomSnackBarState(); -} - -class _CustomSnackBarState extends State { - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: () => - ScaffoldMessenger.of(context).showSnackBar(_buildSnackBar()), - child: const Text( - '点我弹出SnackBar', - style: TextStyle(color: Colors.white), - )); - } - - SnackBar _buildSnackBar() { - return SnackBar( - elevation: 3, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(10), topRight: Radius.circular(10))), - content: const Text('Wellcome to for join Flutter Unit!'), - duration: const Duration(seconds: 3), - //持续时间 - backgroundColor: Colors.red, - onVisible: () => print('onVisible'), - action: SnackBarAction( - textColor: Colors.white, label: '确定', onPressed: () {}), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart b/packages/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart deleted file mode 100644 index 2e8fa368..00000000 --- a/packages/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 141, -// "name": 'SnackBarAction基本使用', -// "priority": 1, -// "subtitle": -// "【label】 : 标签 【String】\n" -// "【textColor】 : 文字颜色 【Color】\n" -// "【disabledTextColor】 : 文字失效色 【Color】\n" -// "【onPressed】 : 点击回调 【Function()】", -// } -class CustomSnackBarAction extends StatelessWidget { - const CustomSnackBarAction({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SnackBarAction( - disabledTextColor: Colors.red, - textColor: Colors.blue, - label: '确定', - onPressed: () => print('onPressed'), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Spacer/node1_base.dart b/packages/widgets/lib/StatelessWidget/Spacer/node1_base.dart deleted file mode 100644 index 8423188d..00000000 --- a/packages/widgets/lib/StatelessWidget/Spacer/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-22 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 107, -// "name": 'Spacer基本使用', -// "priority": 1, -// "subtitle": -// "一个Spacer会占据可延伸区域", -// } -class OneSpacer extends StatelessWidget { - const OneSpacer({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return - Container( - color: Colors.grey.withAlpha(33), - child: Row(children: [ - Container( - alignment: Alignment.center, - width: 100, - height: 50, - color: Colors.red, - ), - const Spacer(), - Container( - alignment: Alignment.center, - width: 60, - height: 50, - color: Colors.blue, - ), - ],), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart deleted file mode 100644 index 716cfad9..00000000 --- a/packages/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 1, -// "name": "SwitchListTile的基本表现如下", -// "subtitle": "【secondary】: 左侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【inactiveThumbColor】: 未选中时圆圈颜色 【Color】\n" -// "【inactiveTrackColor】: 未选中滑槽颜色 【Color】\n" -// "【activeColor】: 选中时圆圈颜色 【Color】\n" -// "【activeTrackColor】: 选中滑槽颜色 【Color】\n" -// "【onChanged】: 选中事件 【Function(bool)】", -// } -class CustomSwitchListTile extends StatefulWidget { - const CustomSwitchListTile({Key? key}) : super(key: key); - - @override - _CustomSwitchListTileState createState() => _CustomSwitchListTileState(); -} - -class _CustomSwitchListTileState extends State { - var _value=false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: SwitchListTile( - value: _value, - inactiveThumbColor:Colors.cyanAccent , - inactiveTrackColor: Colors.blue.withAlpha(88), - activeColor: Colors.orangeAccent, - activeTrackColor: Colors.orange, - secondary: Image.asset("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _value = !_value), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart b/packages/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart deleted file mode 100644 index 8b9743e9..00000000 --- a/packages/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart +++ /dev/null @@ -1,43 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 2, -// "name": "SwitchListTile的选中效果", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【inactiveThumbImage】: 未选中时圆圈图片 【ImageProvider】\n" -// "【activeThumbImage】: 选中时圆圈图片 【ImageProvider】", -// } -class SelectSwitchListTile extends StatefulWidget { - const SelectSwitchListTile({Key? key}) : super(key: key); - - @override - _SelectSwitchListTileState createState() => _SelectSwitchListTileState(); -} - -class _SelectSwitchListTileState extends State { - bool _value=false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: SwitchListTile( - value: _value, - selected: _value, - activeColor: Colors.orangeAccent, - secondary: Image.asset("assets/images/icon_head.webp"), - inactiveThumbImage: const AssetImage("assets/images/head_icon/icon_5.webp"), - activeThumbImage: const AssetImage("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _value = !_value), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart b/packages/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart deleted file mode 100644 index a34580af..00000000 --- a/packages/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart +++ /dev/null @@ -1,40 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 3, -// "name": "SwitchListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } -class DenseSwitchListTile extends StatefulWidget { - const DenseSwitchListTile({Key? key}) : super(key: key); - - @override - _DenseSwitchListTileState createState() => _DenseSwitchListTileState(); -} - -class _DenseSwitchListTileState extends State { - bool _value = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(10), - color: Colors.grey.withAlpha(22), - child: SwitchListTile( - value: _value, - dense: true, - selected: _value, - activeColor: Colors.orangeAccent, - secondary: Image.asset("assets/images/icon_head.webp"), - title: const Text("张风捷特烈"), - subtitle: const Text("@万花过尽知无物"), - onChanged: (v) => setState(() => _value = !_value), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Tab/node1_base.dart b/packages/widgets/lib/StatelessWidget/Tab/node1_base.dart deleted file mode 100644 index 77d476bc..00000000 --- a/packages/widgets/lib/StatelessWidget/Tab/node1_base.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 148, -// "name": 'Tab基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【text】 : 文字 【String】\n" -// "【icon】 : 下方组件 【Widgit】\n" -// " text和child不能同时存在", -// } - -class CustomTab extends StatelessWidget { - const CustomTab({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: const [ - Tab( - icon:Icon( Icons.add,color: Colors.blue,), - child: Text('添加'), - ), - Tab( - icon:Icon( Icons.close,color: Colors.red,), - text: '删除', - ), - Tab( - icon:Icon( Icons.refresh,color: Colors.green), - text: '更新', - ), - ], - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/TabBar/node1_base.dart b/packages/widgets/lib/StatelessWidget/TabBar/node1_base.dart deleted file mode 100644 index 56f08961..00000000 --- a/packages/widgets/lib/StatelessWidget/TabBar/node1_base.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-16 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 58, -// "name": 'TabBar基本使用', -// "priority": 1, -// "subtitle": -// "【controller】 : 控制器 【TabController】\n" -// "【indicatorColor】 : 指示器颜色 【指示器颜色】\n" -// "【indicatorWeight】 : 指示器高 【double】\n" -// "【indicatorPadding】 : 指示器边距 【EdgeInsetsGeometry】\n" -// "【labelStyle】 : 页签文字样式 【TextStyle】\n" -// "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n" -// "【isScrollable】 : 是否可滑动 【bool】\n" -// "【onTap】 : 页签点击回调 【Function(int)】\n" -// "【tabs】 : 标签组件 【List】", -// } -class CustomTabBar extends StatefulWidget { - const CustomTabBar({Key? key}) : super(key: key); - - @override - _CustomTabBarState createState() => _CustomTabBarState(); -} - -class _CustomTabBarState extends State - with SingleTickerProviderStateMixin { - final List tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; - late TabController _tabController; - - @override - void initState() { - super.initState(); - _tabController = TabController(vsync: this, length: tabs.length); - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return TabBar( - onTap: (tab) => print(tab), - labelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - unselectedLabelStyle: const TextStyle(fontSize: 16), - isScrollable: true, - controller: _tabController, - labelColor: Colors.blue, - indicatorWeight: 3, - indicatorPadding: const EdgeInsets.symmetric(horizontal: 10), - unselectedLabelColor: Colors.grey, - indicatorColor: Colors.orangeAccent, - tabs: tabs.map((e) => Tab(text: e)).toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart b/packages/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart deleted file mode 100644 index ab504e0c..00000000 --- a/packages/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 205 TabPageSelector 通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。 - -// { -// "widgetId": 205, -// "name": "TabPageSelector基本使用", -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TabController】\n" -// "【indicatorSize】: 指示器大小 【double】\n" -// "【selectedColor】: 选中色 【Color】\n" -// "【color】: 颜色 【Color】", -// } - -class TabPageSelectorDemo extends StatefulWidget { - const TabPageSelectorDemo({Key? key}) : super(key: key); - - @override - _TabPageSelectorDemoState createState() => _TabPageSelectorDemoState(); -} - -class _TabPageSelectorDemoState extends State - with SingleTickerProviderStateMixin { - final List tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼']; - late TabController _tabController; - - @override - void initState() { - super.initState(); - _tabController = TabController(vsync: this, length: tabs.length); - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 200, - child: Stack( - alignment: Alignment.center, - children: [ - Container(color: Colors.purple, child: _buildTableBarView()), - Positioned( - bottom: 10, - child: buildTabPageSelector(), - ), - ], - ), - ); - } - - Widget buildTabPageSelector() => TabPageSelector( - controller: _tabController, - color: Colors.white, - indicatorSize: 10, - selectedColor: Colors.orangeAccent, - ); - - Widget _buildTableBarView() => TabBarView( - controller: _tabController, - children: tabs - .map((e) => Center( - child: Text( - e, - style: const TextStyle(color: Colors.white, fontSize: 20), - ))) - .toList()); -} diff --git a/packages/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart b/packages/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart deleted file mode 100644 index 6b377b3d..00000000 --- a/packages/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - - - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 206 TabPageSelectorIndicator 一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。 - -// { -// "widgetId": 206, -// "name": "TabPageSelectorIndicator基本使用", -// "priority": 1, -// "subtitle": "【size】: 大小 【double】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【borderColor】: 边线色 【Color】", -// } - -class TabPageSelectorIndicatorDemo extends StatelessWidget { - const TabPageSelectorIndicatorDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children:const [ - TabPageSelectorIndicator( - backgroundColor: Colors.greenAccent, - borderColor: Colors.deepPurpleAccent, - size: 15, - ), - TabPageSelectorIndicator( - backgroundColor: Colors.blue, - borderColor: Colors.grey, - size: 20, - ), - TabPageSelectorIndicator( - backgroundColor: Colors.green, - borderColor: Colors.red, - size: 25, - ), - TabPageSelectorIndicator( - backgroundColor: Colors.yellow, - borderColor: Colors.brown, - size: 30, - ), - TabPageSelectorIndicator( - backgroundColor: Colors.amber, - borderColor: Colors.purpleAccent, - size: 35, - ), - ], - ); - } - -} - diff --git a/packages/widgets/lib/StatelessWidget/Text/node1_base.dart b/packages/widgets/lib/StatelessWidget/Text/node1_base.dart deleted file mode 100644 index fc27085b..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node1_base.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 1, -// "name": "文字的基本样式", -// "subtitle": "【入参】 : 文字 【String】\n" -// "【style】: 文字样式 【TextStyle】\n" -// "【color】: 文字样式 【Color】\n" -// "【fontSize】: 文字大小 【double】\n" -// "【fontWeight】: 字重 【FontWeight】\n" -// "【fontStyle】: 字体样式 【fontStyle】\n" -// "【letterSpacing】: 字距 【double】", -// } -class CustomText extends StatelessWidget { - const CustomText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - TextStyle style = const TextStyle( - color: Colors.blue, - fontSize: 20, - fontWeight: FontWeight.bold, - fontStyle: FontStyle.italic, - letterSpacing: 10, - ); - return Container( - width: 200, - color: Colors.cyanAccent.withAlpha(33), - height: 200 * 0.618 * 0.618, - child: Text("toly-张风捷特烈-1994`", style: style), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Text/node2_shadows.dart b/packages/widgets/lib/StatelessWidget/Text/node2_shadows.dart deleted file mode 100644 index a7bf9414..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node2_shadows.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 2, -// "name": "文字阴影", -// "subtitle": "【shadows】 : 文字 【List】\n" -// "【backgroundColor】: 背景颜色 【Color】", -// } -class ShadowText extends StatelessWidget { - const ShadowText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Text( - "张风捷特烈", - style: TextStyle( - fontSize: 50, - color: Colors.white, - backgroundColor: Colors.black, - shadows: [ - Shadow( - color: Colors.cyanAccent, - offset: Offset(1, 1), - blurRadius: 10), - Shadow( - color: Colors.blue, - offset: Offset(-0.1, 0.1), - blurRadius: 10), - ]), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Text/node3_decoration.dart b/packages/widgets/lib/StatelessWidget/Text/node3_decoration.dart deleted file mode 100644 index 1aee5c8e..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node3_decoration.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 3, -// "name": "文字装饰线", -// "subtitle": "【fontFamily】 : 文字字体 【String】\n" -// "【decoration】: 装饰线 【TextDecoration】\n" -// "【decorationColor】: 装饰线颜色 【Color】\n" -// "【decorationThickness】: 装饰线粗 【double】\n" -// "【decorationStyle】: 装饰线样式 【TextDecorationStyle】", -// } -class DecorationText extends StatelessWidget { - const DecorationText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Text( - "19940328", - style: TextStyle( - fontSize: 50, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - decorationThickness: 3, - decorationStyle: TextDecorationStyle.wavy, - decorationColor: Colors.blue, - fontStyle: FontStyle.italic, - fontFamily: "DancingScript", - letterSpacing: 10), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Text/node4_textAlign.dart b/packages/widgets/lib/StatelessWidget/Text/node4_textAlign.dart deleted file mode 100644 index 11b8b2ce..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node4_textAlign.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 4, -// "name": "文字对齐方式", -// "subtitle": "【textAlign】: 对齐方式 【TextAlign】\n" -// "下面依次是:left、right、center、justify、start、end ", -// } -class TextAlignText extends StatelessWidget { - const TextAlignText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - runSpacing: 10, - children: TextAlign.values - .map((TextAlign textAlign) => Container( - width: 120, - color: Colors.cyanAccent.withAlpha(33), - height: 120 * 0.618, - child: Text( - " 张风捷特烈 toly " * 3, - textAlign: textAlign, - ), - )) - .toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Text/node5_textDirection.dart b/packages/widgets/lib/StatelessWidget/Text/node5_textDirection.dart deleted file mode 100644 index da2ce798..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node5_textDirection.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 5, -// "name": "文字方向与最大行数", -// "subtitle": "【maxLines】 : 最大行数 【int】\n" -// "【textDirection】 : 文字方向 【TextDirection】\n" -// "下面依次是:rtl、ltr ", -// } -class TextDirectionText extends StatelessWidget { - const TextDirectionText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 40, - runSpacing: 10, - children: TextDirection.values - .map((TextDirection direction) => Container( - width: 120, - color: Colors.cyanAccent.withAlpha(33), - height: 120 * 0.618, - child: Text( - " 张风捷特烈 toly " * 10, - textDirection: direction, - maxLines: 3, - overflow: TextOverflow.ellipsis, - ), - )) - .toList(), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Text/node6_softWrap.dart b/packages/widgets/lib/StatelessWidget/Text/node6_softWrap.dart deleted file mode 100644 index cc80eb61..00000000 --- a/packages/widgets/lib/StatelessWidget/Text/node6_softWrap.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: - - -// { -// "widgetId": 2, -// "priority": 6, -// "name": "是否包裹与越界效果", -// "subtitle": "【softWrap】 : 是否换行 【bool】\n" -// "【overflow】 : 越界效果 【TextOverflow】\n" -// "下面softWrap=false; overflow依次是:clip、fade、ellipsis、visible ", -// } -class SoftWrapText extends StatelessWidget { - const SoftWrapText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - runSpacing: 10, - children: TextOverflow.values - .map((TextOverflow textOverflow) => Container( - width: 150, - color: Colors.cyanAccent.withAlpha(33), - height: 150 * 0.618 * 0.618, - child: Text( - " 张风捷特烈 toly " * 5, - overflow: textOverflow, - softWrap: false, - ), - )) - .toList(), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart b/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart deleted file mode 100644 index d16b467f..00000000 --- a/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 168, -// "name": '文字样式-ThemeData#TextTheme', -// "priority": 1, -// "subtitle": -// "子组件可以通过ThemeData.of获取主题的数据进行使用。", -// } -class TextThemeDemo extends StatelessWidget { - const TextThemeDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - TextTheme queryData = Theme.of(context).textTheme; - Map styles = { - "headline1: ": queryData.headline1!, - "headline2: ": queryData.headline2!, - "headline3: ": queryData.headline3!, - "headline4: ": queryData.headline4!, - "headline5: ": queryData.headline5!, - "headline6: ": queryData.headline6!, - "button: ": queryData.button!, - "overline: ": queryData.overline!, - "subtitle1: ": queryData.subtitle1!, - "subtitle2: ": queryData.subtitle2!, - "caption: ": queryData.caption!, - "bodyText1: ": queryData.bodyText1!, - "bodyText2: ": queryData.bodyText2!, - }; - - return Column( - children: styles.keys - .map((String styleInfo) => buildItem(styleInfo, styles[styleInfo]!)) - .toList(), - ); - } - - TextStyle get textStyle => const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ); - - Widget buildItem(String styleInfo, TextStyle style) => Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(styleInfo, style: textStyle), - Text("@toly", style: style) - ], - ), - ), - const Divider(height: 1) - ], - ); -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Theme/node2_use.dart b/packages/widgets/lib/StatelessWidget/Theme/node2_use.dart deleted file mode 100644 index 89d1d3ec..00000000 --- a/packages/widgets/lib/StatelessWidget/Theme/node2_use.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 168, -// "name": 'Theme的用法', -// "priority": 2, -// "subtitle": -// "使用Theme,可以指定非常多的属性作为主题,这些属性将应用于所有的后代组件,如指定字体、滑块、卡片、文字、分割线、按钮等属性。", -// } -class CustomTheme extends StatelessWidget { - const CustomTheme({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Theme( - data: ThemeData( - cardTheme: const CardTheme( - color: Colors.red, - elevation: 4, - ), - dividerTheme: const DividerThemeData( - color: Colors.blue, - thickness: 2, - ), - sliderTheme: const SliderThemeData( - thumbColor: Colors.red, - activeTrackColor: Colors.green, - inactiveTrackColor: Colors.grey, - )), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Card( - child: Container( - width: 50, - height: 50, - color: Colors.transparent, - ), - ), - const SizedBox( - width: 150, - child: Slider(value: 0.8, onChanged: null), - ), - const SizedBox(width: 150, child: Divider()) - ])); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/Title/node1_base.dart b/packages/widgets/lib/StatelessWidget/Title/node1_base.dart deleted file mode 100644 index 40287758..00000000 --- a/packages/widgets/lib/StatelessWidget/Title/node1_base.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/7/22 -/// contact me by email 1981462002@qq.com -/// 说明: 208 Title 0 该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。 -// { -// "widgetId": 208, -// "name": "Title基本使用", -// "priority": 1, -// "subtitle": "【title】 : 名称 【int】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 子组件 【Widget】", -// } -class TitleDemo extends StatelessWidget { - const TitleDemo({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Title( - title: '张风捷特烈', - color: const Color(0xFF9C27B0), - child: const Center( - child: Text('应用菜单栏中该页的名称为: 张风捷特烈'), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart b/packages/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart deleted file mode 100644 index 8b0c6533..00000000 --- a/packages/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 33, -// "priority": 1, -// "name": "ToggleButtons单选切换", -// "subtitle": "【children】: 子组件集 【List】\n" -// "【borderWidth】: 边线宽 【double】\n" -// "【borderRadius】: 圆角 【BorderRadius】\n" -// "【isSelected】: 是否选中集 【List】\n" -// "【onPressed】: 点击事件 【Function(int)】", -// } -class CustomToggleButtons extends StatefulWidget { - const CustomToggleButtons({Key? key}) : super(key: key); - - @override - _CustomToggleButtonsState createState() => _CustomToggleButtonsState(); -} - -class _CustomToggleButtonsState extends State { - List _isSelected = [true, false, false]; - - @override - Widget build(BuildContext context) { - return ToggleButtons( - children: const [ - Icon(Icons.skip_previous), - Icon(Icons.pause), - Icon(Icons.skip_next), - ], - borderWidth: 1, - borderRadius: BorderRadius.circular(10), - isSelected: _isSelected, - onPressed: (value) => setState(() { - _isSelected = _isSelected.map((e) => false).toList(); - _isSelected[value] = true; - }), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart b/packages/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart deleted file mode 100644 index 733409e2..00000000 --- a/packages/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart +++ /dev/null @@ -1,51 +0,0 @@ - - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 33, -// "priority": 2, -// "name": "ToggleButtons颜色属性", -// "subtitle": "【borderColor】: 边线色 【Color】\n" -// "【selectedBorderColor】: 选中边线色 【Color】\n" -// "【selectedColor】: 选中时组件色 【Color】\n" -// "【fillColor】: 选中时填充色 【Color】\n" -// "【splashColor】: 水波纹色 【Color】", -// } -class ColorToggleButtons extends StatefulWidget { - const ColorToggleButtons({Key? key}) : super(key: key); - - @override - _ColorToggleButtonsState createState() => _ColorToggleButtonsState(); -} - -class _ColorToggleButtonsState extends State { - List _isSelected = [true, false, false]; - - @override - Widget build(BuildContext context) { - return ToggleButtons( - children: const [ - Icon(Icons.skip_previous), - Icon(Icons.pause), - Icon(Icons.skip_next), - ], - borderWidth: 1, - borderColor: Colors.orangeAccent, - selectedBorderColor: Colors.blue, - splashColor: Colors.purple.withAlpha(66), - borderRadius: BorderRadius.circular(10), - selectedColor: Colors.red, - fillColor: Colors.green.withAlpha(11), - isSelected: _isSelected, - onPressed: (value) => setState(() { - _isSelected = _isSelected.map((e) => false).toList(); - _isSelected[value] = true; - }), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart b/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart deleted file mode 100644 index 64c4c7c7..00000000 --- a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 22, -// "priority": 1, -// "name": "该组件的基本表现如下", -// "subtitle": "【currentAccountPicture】: 上组件 【Widget】\n" -// "【accountName】: 中组件 【Widget】\n" -// "【accountEmail】: 下组件 【Widget】\n" -// "【decoration】: 装饰 【Decoration】", -// } - -class CustomUAGHP extends StatelessWidget { - const CustomUAGHP({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: MediaQuery.of(context).size.width / 3 * 2, - child: UserAccountsDrawerHeader( - accountName: Container( - padding: const EdgeInsets.all(8.0), - child: const Text( - "张风捷特烈", - style: - TextStyle(color: Colors.orangeAccent, fontSize: 22, shadows: [ - Shadow( - color: Colors.black, - offset: Offset(.5, .5), - blurRadius: 2, - ), - ]), - ), - ), - accountEmail: const Padding( - padding: EdgeInsets.all(8.0), - child: Text("1981462002@qq.com", - style: TextStyle(color: Colors.white, fontSize: 14, shadows: [ - Shadow( - color: Colors.orangeAccent, - offset: Offset(.5, .5), - blurRadius: 2), - ])), - ), - currentAccountPicture: Container( - padding: const EdgeInsets.all(15.0), - child: const CircleAvatar( - backgroundImage: AssetImage("assets/images/icon_head.webp"), - ), - ), - decoration: const BoxDecoration( - image: DecorationImage(image: AssetImage("assets/images/caver.webp")), - ), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart b/packages/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart deleted file mode 100644 index 434136f4..00000000 --- a/packages/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 35, -// "priority": 1, -// "name": "VerticalDivider颜色和粗细", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【thickness】: 线粗细 【double】", -// } -class CustomVerticalDivider extends StatelessWidget { - const CustomVerticalDivider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - List dataColor = [ - Colors.red, Colors.yellow, - Colors.blue, Colors.green]; - List dataThickness = [1.0, 2.0, 4.0, 6.0]; - Map data = Map.fromIterables(dataColor, dataThickness); - return SizedBox( - height: 150, - child: Row( - mainAxisSize: MainAxisSize.min, - children: dataColor - .map((e) => VerticalDivider( - color: e, - thickness: data[e], - )).toList(), - ), - ); - } -} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart b/packages/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart deleted file mode 100644 index 9943c976..00000000 --- a/packages/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart +++ /dev/null @@ -1,43 +0,0 @@ - - -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 35, -// "priority": 2, -// "name": "VerticalDivider宽度和空缺", -// "subtitle": "【indent】: 前面空缺长度 【double】\n" -// "【endIndent】: 后面空缺长度 【double】\n" -// "【width】: 占位宽 【double】", -// } -class WidthVerticalDivider extends StatelessWidget { - const WidthVerticalDivider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - List dataColor = [ - Colors.red, Colors.yellow, - Colors.blue, Colors.green]; - List dataThickness = [10.0, 20.0, 30.0, 40.0]; - Map data = Map.fromIterables(dataColor, dataThickness); - return SizedBox( - height: 150, - child: Row( - mainAxisSize: MainAxisSize.min, - children: dataColor - .map((e) => VerticalDivider( - color: e, - indent:data[e], - endIndent: data[e]!*2, - width: data[e], - thickness: data[e]!/10, - )) - .toList(), - ), - ); - } -} diff --git a/packages/widgets/lib/StatelessWidget/Visibility/node1_base.dart b/packages/widgets/lib/StatelessWidget/Visibility/node1_base.dart deleted file mode 100644 index 5d0bbe32..00000000 --- a/packages/widgets/lib/StatelessWidget/Visibility/node1_base.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -/// create by 张风捷特烈 on 2020/4/27 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 10, -// "priority": 1, -// "name": "根据visible控制内部子组件的显隐情况", -// "subtitle": "【visible】 : 是否显示 【bool】\n" -// "【child】: 孩子 【Widget】\n" -// "默认孩子隐藏时会失去原来所在区域。", -// } -class CustomVisibility extends StatelessWidget { - const CustomVisibility({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 10, - children: [ - _buildVisibility(true), - _buildVisibility(false), - ], - ); - } - - Widget _buildVisibility(bool visible) { - Widget box = Container( - height: 30, - width: 30, - color: Colors.blue, - ); - return Container( - width: 150, - height: 150 * 0.618, - color: Colors.cyanAccent.withAlpha(33), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - box, - Visibility( - visible: visible, - child: Container( - alignment: Alignment.center, - height: 80 * 0.618, - width: 80, - color: Colors.red, - child: const Text( - "visible\ntrue", - style: TextStyle(fontSize: 20), - ), - )), - box, - ], - ), - ); - } -} diff --git a/packages/widgets/lib/exp/proxy_unit.dart b/packages/widgets/lib/exp/proxy_unit.dart deleted file mode 100644 index fdc1ec8a..00000000 --- a/packages/widgets/lib/exp/proxy_unit.dart +++ /dev/null @@ -1,36 +0,0 @@ -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -library proxy_widget_unit.dart; - - -export '../ProxyWidget/DropdownButtonHideUnderline/node1_base.dart'; -export '../ProxyWidget/Flexible/node1_base.dart'; -export '../ProxyWidget/MediaQuery/node1_base.dart'; -export '../ProxyWidget/ButtonTheme/node1_base.dart'; -export '../ProxyWidget/DefaultTextStyle/node1_base.dart'; -export '../ProxyWidget/SliderTheme/node1_base.dart'; -export '../ProxyWidget/SliderTheme/node2_diy.dart'; -export '../ProxyWidget/DividerTheme/node1_base.dart'; -export '../ProxyWidget/IconTheme/node1_base.dart'; -export '../ProxyWidget/ScrollConfiguration/node1_base.dart'; -export '../ProxyWidget/Expanded/node1_base.dart'; -export '../ProxyWidget/Positioned/node1_base.dart'; -export '../ProxyWidget/LayoutId/node1_base.dart'; -export '../ProxyWidget/ChipTheme/node1_base.dart' hide CustomFilterChip; -export '../ProxyWidget/ListTileTheme/node1_base.dart'; -export '../ProxyWidget/MaterialBannerTheme/node1_base.dart'; -export '../ProxyWidget/PopupMenuTheme/node1_base.dart'; -export '../ProxyWidget/ToggleButtonsTheme/node1_base.dart'; -export '../ProxyWidget/ButtonBarTheme/node1_base.dart'; -export '../ProxyWidget/TooltipTheme/node1_base.dart'; -export '../ProxyWidget/Directionality/node1_base.dart'; -export '../ProxyWidget/TableCell/node1_base.dart'; -export '../ProxyWidget/KeepAlive/node1_base.dart'; -export '../ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart'; -export '../ProxyWidget/InheritedTheme/node1_base.dart'; -export '../ProxyWidget/DefaultAssetBundle/node1_base.dart'; -export '../ProxyWidget/InheritedWidget/node1_base.dart'; -export '../ProxyWidget/ParentDataWidget/node1_base.dart'; -export '../ProxyWidget/PrimaryScrollController/node1_base.dart'; diff --git a/packages/widgets/lib/exp/render_object_unit.dart b/packages/widgets/lib/exp/render_object_unit.dart deleted file mode 100644 index 1128f417..00000000 --- a/packages/widgets/lib/exp/render_object_unit.dart +++ /dev/null @@ -1,100 +0,0 @@ -library render_object_widget; - - -export '../MultiChildRenderObjectWidget/Flex/node1_direction.dart'; -export '../MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart'; -export '../MultiChildRenderObjectWidget/Flex/node5_textDirection.dart'; - -export '../MultiChildRenderObjectWidget/Flow/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Flow/node2_anim.dart'; -export '../MultiChildRenderObjectWidget/RichText/node1_base.dart'; -export '../MultiChildRenderObjectWidget/RichText/node2_widget.dart'; -export '../MultiChildRenderObjectWidget/Stack/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Stack/node2_positioned.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node2_alignment.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart'; -export '../MultiChildRenderObjectWidget/Column/node1_base.dart'; -export '../MultiChildRenderObjectWidget/IndexedStack/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Row/node1_base.dart'; -export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Viewport/node1_base.dart'; -export '../MultiChildRenderObjectWidget/ListBody/node1_base.dart'; -export '../MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart'; -export '../MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart'; - -export '../SingleChildRenderObjectWidget/Align/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Align/node2_other.dart'; -export '../SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart'; -export '../SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart'; -export '../SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart'; -export '../SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart'; -export '../SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart'; -export '../SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart'; - -export '../SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart'; -export '../SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart'; -export '../SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ColoredBox/node1_base.dart'; - -export '../SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart'; -export '../SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Baseline/node1_base.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart'; -export '../SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart'; -export '../SingleChildRenderObjectWidget/FadeTransition/node1_base.dart'; -export '../SingleChildRenderObjectWidget/FittedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/LimiteBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/OffStage/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Opacity/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Padding/node1_all.dart'; -export '../SingleChildRenderObjectWidget/Padding/node2_only.dart'; -export '../SingleChildRenderObjectWidget/Padding/node3_symmetric.dart'; -export '../SingleChildRenderObjectWidget/RotatedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/SizedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Transform/node1_skew.dart'; -export '../SingleChildRenderObjectWidget/Transform/node2_translation.dart'; -export '../SingleChildRenderObjectWidget/Transform/node3_scale.dart'; -export '../SingleChildRenderObjectWidget/Transform/node4_rotate.dart'; -export '../SingleChildRenderObjectWidget/Transform/node5_perspective.dart'; -export '../SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart'; -export '../StatefulWidget/PositionedTransition/node1_base.dart'; -export '../StatefulWidget/RotationTransition/node1_base.dart'; -export '../StatefulWidget/ScaleTransition/node1_base.dart'; -export '../StatefulWidget/SizeTransition/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ClipOval/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ClipPath/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ClipRRect/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ClipRect/node1_base.dart'; -export '../SingleChildRenderObjectWidget/OverflowBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/AspectRatio/node1_base.dart'; -export '../SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Center/node1_base.dart'; -export '../SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart'; -export '../SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart'; -export '../SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart'; -export '../SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart'; -export '../SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart'; -export '../SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart'; -export '../SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart'; -export '../SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart'; -export '../SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart'; -export '../SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart'; -export '../SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart'; -export '../SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart'; -export '../SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart'; -export '../SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart'; -export '../SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart'; -export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; \ No newline at end of file diff --git a/packages/widgets/lib/exp/sliver_unit.dart b/packages/widgets/lib/exp/sliver_unit.dart deleted file mode 100644 index 290cb253..00000000 --- a/packages/widgets/lib/exp/sliver_unit.dart +++ /dev/null @@ -1,27 +0,0 @@ -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -library sliver_unit.dart; - -export '../Sliver/CustomScrollView/node1_base.dart'; -export '../Sliver/FlexibleSpaceBar/node1_base.dart'; -export '../Sliver/SliverAppBar/node1_base.dart'; -export '../Sliver/SliverFillViewport/node1_base.dart'; -export '../Sliver/SliverFixedExtentList/node1_base.dart'; -export '../Sliver/SliverGrid/node1_base.dart'; -export '../Sliver/SliverList/node1_base.dart'; -export '../Sliver/SliverOpacity/node1_base.dart'; -export '../Sliver/SliverPadding/node1_base.dart'; -export '../Sliver/SliverPersistentHeader/node1_base.dart'; -export '../Sliver/SliverToBoxAdapter/node1_base.dart'; -export '../Sliver/SliverOverlapAbsorber/node1_base.dart'; -export '../Sliver/SliverOverlapInjector/node1_base.dart'; -export '../Sliver/SliverPrototypeExtentList/node1_base.dart'; -export '../Sliver/CupertinoSliverNavigationBar/node1_base.dart'; -export '../Sliver/CupertinoSliverRefreshControl/node1_base.dart'; -export '../Sliver/SliverFillRemaining/node1_base.dart'; -export '../Sliver/SliverIgnorePointer/node1_base.dart'; -export '../Sliver/SliverAnimatedList/node1_base.dart'; -export '../Sliver/SliverLayoutBuilder/node1_base.dart'; -export '../Sliver/SliverWithKeepAliveWidget/node1_base.dart'; diff --git a/packages/widgets/lib/exp/stateful_unit.dart b/packages/widgets/lib/exp/stateful_unit.dart deleted file mode 100644 index aa7f8574..00000000 --- a/packages/widgets/lib/exp/stateful_unit.dart +++ /dev/null @@ -1,181 +0,0 @@ -library stateful_unit; - -export '../StatefulWidget/CupertinoButton/node1_base.dart'; -export '../StatefulWidget/CupertinoContextMenu/node1_base.dart'; -export '../StatefulWidget/CupertinoContextMenuAction/node1_base.dart'; -export '../StatefulWidget/DateRangePickerDialog/node1_base.dart'; -export '../StatefulWidget/DateRangePickerDialog/node2_diy.dart'; - -export '../StatefulWidget/CupertinoDatePicker/node1_base.dart'; -export '../StatefulWidget/CupertinoPicker/node1_base.dart'; -export '../StatefulWidget/CupertinoTimerPicker/node1_base.dart'; -export '../StatefulWidget/SlideTransition/node1_base.dart'; -export '../StatefulWidget/MonthPicker/node1_base.dart'; -export '../StatefulWidget/YearPicker/node1_base.dart'; -export '../StatefulWidget/WillPopScope/node1_base.dart'; -export '../StatefulWidget/NestedScrollView/node1_base.dart'; -export '../StatefulWidget/AppBar/node1_base.dart'; -export '../StatefulWidget/AppBar/node2_tab.dart'; -export '../StatefulWidget/BottomAppBar/node1_base.dart'; -export '../StatefulWidget/BottomNavigationBar/node1_base.dart'; -export '../StatefulWidget/BottomNavigationBar/node2_page.dart'; -export '../StatefulWidget/Checkbox/node1_base.dart'; -export '../StatefulWidget/Checkbox/node2_tristate.dart'; -export '../StatefulWidget/ExpandIcon/node1_base.dart'; -export '../StatefulWidget/ExpansionTile/node1_base.dart'; -export '../StatefulWidget/Radio/node1_base.dart'; -export '../StatefulWidget/Tooltip/node1_base.dart'; -export '../StatefulWidget/Tooltip/node2_decoration.dart'; -export '../StatefulWidget/CircularProgressIndicator/node1_base.dart'; -export '../StatefulWidget/CupertinoActivityIndicator/node1_base.dart'; -export '../StatefulWidget/CupertinoSlider/node1_base.dart'; -export '../StatefulWidget/CupertinoSwitch/node1_base.dart'; -export '../StatefulWidget/CupertinoSegmentedControl/node1_base.dart'; -export '../StatefulWidget/CupertinoSegmentedControl/node2_color.dart'; -export '../StatefulWidget/Navigator/node1_base.dart'; -export '../StatefulWidget/InteractiveViewer/node1_base.dart'; -export '../StatefulWidget/InteractiveViewer/node2_constrained.dart'; -export '../StatefulWidget/InteractiveViewer/node3_controller.dart'; - -export '../StatefulWidget/Image/node1_base.dart'; -export '../StatefulWidget/Image/node2_fit.dart'; -export '../StatefulWidget/Image/node3_alignment.dart'; -export '../StatefulWidget/Image/node4_colorBlendMode.dart'; -export '../StatefulWidget/Image/node5_repeat.dart'; -export '../StatefulWidget/Image/node6_centerSlice.dart'; -export '../StatefulWidget/Image/node6_centerSlice.dart'; - -export '../StatefulWidget/RangeSlider/node1_base.dart'; -export '../StatefulWidget/Slider/node1_base.dart'; -export '../StatefulWidget/Slider/node2_lable.dart'; -export '../StatefulWidget/Switch/node1_base.dart'; -export '../StatefulWidget/Switch/node2_image.dart'; -export '../StatefulWidget/StatefulBuilder/node1_base.dart'; -export '../StatefulWidget/TextField/node3_decoration.dart'; -export '../StatefulWidget/RefreshIndicator/node1_base.dart'; -export '../StatefulWidget/SelectableText/node1_base.dart'; -export '../StatefulWidget/SelectableText/node2_align.dart'; -export '../StatefulWidget/CupertinoNavigationBar/node1_base.dart'; -export '../StatefulWidget/CupertinoTabBar/node1_base.dart'; -export '../StatefulWidget/CupertinoTextField/node1_base.dart'; -export '../StatefulWidget/CupertinoTextField/node2_style.dart'; -export '../StatefulWidget/ValueListenableBuilder/node1_base.dart'; -export '../StatefulWidget/MouseRegion/node1_base.dart'; -export '../StatefulWidget/Scrollable/node1_base.dart'; - -export '../StatefulWidget/DropdownButton/node1_base.dart'; -export '../StatefulWidget/DropdownButton/node2_style.dart'; - -export '../StatefulWidget/AnimatedCrossFade/node1_base.dart'; -export '../StatefulWidget/AnimatedCrossFade/node2_curve.dart'; - -export '../StatefulWidget/AnimatedList/node1_base.dart'; -export '../StatefulWidget/AnimatedSwitcher/node1_base.dart'; -export '../StatefulWidget/AlignTransition/node1_base.dart'; -export '../StatefulWidget/DecoratedBoxTransition/node1_base.dart'; -export '../StatefulWidget/DefaultTextStyleTransition/node1_base.dart'; -export '../StatefulWidget/RelativePositionedTransition/node1_base.dart'; -export '../StatefulWidget/CupertinoScrollbar/node1_base.dart'; -export '../StatefulWidget/RawGestureDetector/node1_base.dart'; - -export '../StatefulWidget/Dismissible/node1_base.dart'; -export '../StatefulWidget/AutomaticKeepAlive/node1_base.dart'; -export '../StatefulWidget/AnimatedModalBarrier/node1_base.dart'; -export '../StatefulWidget/FormField/node1_base.dart'; -export '../StatefulWidget/AnimatedBuilder/node1_base.dart'; -export '../StatefulWidget/TweenAnimationBuilder/node1_base.dart'; -export '../StatefulWidget/PaginatedDataTable/node1_base.dart'; -export '../StatefulWidget/RawKeyboardListener/node1_base.dart'; -export '../StatefulWidget/Dismissible/node2_direction.dart'; - -export '../StatefulWidget/DragTarget/node1_base.dart'; -export '../StatefulWidget/Draggable/node1_base.dart'; -export '../StatefulWidget/Draggable/node2_data.dart'; -export '../StatefulWidget/Draggable/node3_use.dart'; - -export '../StatefulWidget/Form/node1_base.dart'; -export '../StatefulWidget/StatusTransitionWidget/node1_base.dart'; -export '../StatefulWidget/UniqueWidget/node1_base.dart'; -export '../StatefulWidget/FutureBuilder/node1_base.dart'; -export '../StatefulWidget/Hero/node1_base.dart'; -export '../StatefulWidget/AnimatedAlign/node1_base.dart'; -export '../StatefulWidget/AnimatedContainer/node1_base.dart'; -export '../StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart'; -export '../StatefulWidget/AnimatedOpacity/node1_base.dart'; -export '../StatefulWidget/AnimatedPadding/node1_base.dart'; -export '../StatefulWidget/AnimatedPositioned/node1_base.dart'; -export '../StatefulWidget/AnimatedPositionedDirectional/node1_base.dart'; - -export '../StatefulWidget/ExpansionPanelList/node1_base.dart'; -export '../StatefulWidget/DropdownButtonFormField/node1_base.dart'; - -export '../StatefulWidget/Ink/node1_base.dart'; -export '../StatefulWidget/Ink/node2_image.dart'; - -export '../StatefulWidget/InkResponse/node1_base.dart'; -export '../StatefulWidget/InkResponse/node2_color.dart'; - -export '../StatefulWidget/InkWell/node1_base.dart'; -export '../StatefulWidget/InkWell/node2_color.dart'; - -export '../StatefulWidget/LicensePage/node1_base.dart'; -export '../StatefulWidget/ListWheelScrollView/node1_base.dart'; -export '../StatefulWidget/LongPressDraggable/node1_base.dart'; -export '../StatefulWidget/Material/node1_base.dart'; -export '../StatefulWidget/Material/node2_shape.dart'; -export '../StatefulWidget/Overlay/node1_base.dart'; -export '../StatefulWidget/PageView/node1_base.dart'; -export '../StatefulWidget/PageView/node2_direction.dart'; -export '../StatefulWidget/PageView/node3_controller.dart'; -export '../StatefulWidget/PopupMenuButton/node1_base.dart'; -export '../StatefulWidget/PopupMenuDivider/node1_base.dart'; -export '../StatefulWidget/RawChip/node1_press.dart'; -export '../StatefulWidget/RawChip/node2_select.dart'; - -export '../StatefulWidget/RawMaterialButton/node1_base.dart'; -export '../StatefulWidget/RawMaterialButton/node2_shape.dart'; -export '../StatefulWidget/ReorderableListView/node1_base.dart'; -export '../StatefulWidget/ReorderableListView/node2_direction.dart'; -export '../StatefulWidget/Scrollbar/node1_base.dart'; -export '../StatefulWidget/Stepper/node1_base.dart'; -export '../StatefulWidget/Stepper/node2_type.dart'; -export '../StatefulWidget/StreamBuilder/node1_base.dart'; -export '../StatefulWidget/TableRowInkWell/node1_base.dart'; -export '../StatefulWidget/TextField/node1_base.dart'; -export '../StatefulWidget/TextField/node2_cursor.dart'; -export '../StatefulWidget/TextField/node3_decoration.dart'; - -export '../StatefulWidget/TextFormField/node1_base.dart'; -export '../StatefulWidget/LinearProgressIndicator/node1_base.dart'; -export '../StatefulWidget/CupertinoApp/node1_base.dart'; -export '../StatefulWidget/CupertinoPageScaffold/node1_base.dart'; -export '../StatefulWidget/CupertinoTabScaffold/node1_base.dart'; -export '../StatefulWidget/MaterialApp/node1_base.dart'; -export '../StatefulWidget/Scaffold/node1_base.dart'; -export '../StatefulWidget/TabBarView/node1_base.dart'; -export '../StatefulWidget/InputDecorator/node1_base.dart'; -export '../StatefulWidget/EditableText/node1_base.dart'; -export '../StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart'; -export '../StatefulWidget/WidgetsApp/node1_base.dart' hide HomePage; -export '../StatefulWidget/WidgetInspector/node1_base.dart' hide HomePage; -export '../StatefulWidget/AnimatedTheme/node1_base.dart'; -export '../StatefulWidget/AnimatedPhysicalModel/node1_base.dart'; -export '../StatefulWidget/DefaultTabController/node1_base.dart'; -export '../StatefulWidget/GlowingOverscrollIndicator/node1_base.dart'; -export '../StatefulWidget/DraggableScrollableSheet/node1_base.dart'; -export '../StatefulWidget/DrawerController/node1_base.dart'; -export '../StatefulWidget/MergeableMaterial/node1_base.dart'; -export '../StatefulWidget/CupertinoTabView/node1_base.dart'; - -export '../StatefulWidget/TextButton/node1_base.dart'; -export '../StatefulWidget/TextButton/node2_style.dart'; - -export '../StatefulWidget/ElevatedButton/node1_base.dart'; -export '../StatefulWidget/ElevatedButton/node2_style.dart'; - -export '../StatefulWidget/OutlinedButton//node1_base.dart'; -export '../StatefulWidget/OutlinedButton/node2_style.dart'; - -export '../StatefulWidget/NavigationRail/node1_base.dart'; -export '../StatefulWidget/NavigationRail/node2_extend.dart'; -export '../StatefulWidget/NavigationRail/node3_dark.dart'; \ No newline at end of file diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/packages/widgets/lib/exp/stateless_unit.dart deleted file mode 100644 index 0b1d2344..00000000 --- a/packages/widgets/lib/exp/stateless_unit.dart +++ /dev/null @@ -1,201 +0,0 @@ -library stateless_unit; - -export '../StatelessWidget/AboutDialog/node1_base.dart'; -export '../StatelessWidget/AboutListTile/node1_base.dart'; -export '../StatelessWidget/ActionChip/node1_base.dart'; -export '../StatelessWidget/AlertDialog/node1_base.dart'; -export '../StatelessWidget/AnimatedIcon/node1_base.dart'; -export '../StatelessWidget/CheckedModeBanner/node1_base.dart'; -export '../StatelessWidget/Card/node1_base.dart'; -export '../StatelessWidget/Card/node2_shape.dart'; -export '../StatelessWidget/PreferredSize/node1_base.dart'; -export '../StatelessWidget/PreferredSize/node2_adapter.dart'; -export '../StatelessWidget/Builder/node1_base.dart'; -export '../StatelessWidget/NavigationToolbar/node1_base.dart'; -export '../StatelessWidget/CupertinoDialogAction/node1_base.dart'; -export '../StatelessWidget/DraggableScrollableActuator/node1_base.dart'; - -export '../StatelessWidget/CheckboxListTile/node1_base.dart'; -export '../StatelessWidget/CheckboxListTile/node2_select.dart'; -export '../StatelessWidget/CheckboxListTile/node3_dense.dart'; - -export '../StatelessWidget/Chip/node1_base.dart'; -export '../StatelessWidget/Chip/node2_color.dart'; -export '../StatelessWidget/Chip/node3_delete.dart'; - -export '../StatelessWidget/Container/node1_base.dart'; -export '../StatelessWidget/Container/node2_child.dart'; -export '../StatelessWidget/Container/node3_alignment.dart'; -export '../StatelessWidget/Container/node4_decoration.dart'; -export '../StatelessWidget/Container/node5_transform.dart'; -export '../StatelessWidget/Container/node6_constraints.dart'; -export '../StatelessWidget/MaterialBanner/node1_one_btn.dart'; -export '../StatelessWidget/MaterialBanner/node2_two_btn.dart'; -export '../StatelessWidget/SafeArea/node1_base.dart'; -export '../StatelessWidget/Badge/node_1.dart'; -export '../StatelessWidget/Badge/node_2.dart'; - -export '../StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart'; -export '../StatelessWidget/CupertinoPageTransition/node1_base.dart'; -export '../StatelessWidget/HtmlElementView/node1_base.dart'; - -export '../StatelessWidget/DataTable/node1_base.dart'; -export '../StatelessWidget/DataTable/node2_operation.dart'; -export '../StatelessWidget/OrientationBuilder/node1_base.dart'; -export '../StatelessWidget/Title/node1_base.dart'; -export '../StatelessWidget/TabPageSelector/node1_base.dart'; -export '../StatelessWidget/TabPageSelectorIndicator/node1_base.dart'; -export '../StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart'; - -export '../StatelessWidget/CupertinoTheme/node1_base.dart'; -export '../StatelessWidget/CupertinoTheme/node2_use.dart'; - -export '../StatelessWidget/CupertinoPopupSurface/node1_base.dart'; -export '../StatelessWidget/Divider/node1_base.dart'; -export '../StatelessWidget/Divider/node2_height.dart'; - -export '../StatelessWidget/ScrollView/node1_base.dart'; -export '../StatelessWidget/ModalBarrier/node1_base.dart'; -export '../StatelessWidget/BoxScrollView/node1_base.dart'; -export '../StatelessWidget/FloatingActionButton/node1_base.dart'; -export '../StatelessWidget/FloatingActionButton/node2_mini.dart'; -export '../StatelessWidget/FloatingActionButton/node3_shape.dart'; -export '../StatelessWidget/GestureDetector/node1_base.dart'; -export '../StatelessWidget/GestureDetector/node2_tap.dart'; -export '../StatelessWidget/GestureDetector/node3_pan.dart'; - -export '../StatelessWidget/Banner/node1_base.dart'; -export '../StatelessWidget/ImageIcon/node1_base.dart'; -export '../StatelessWidget/FadeInImage/node1_base.dart'; -export '../StatelessWidget/CircleAvatar/node1_base.dart'; - - -export '../StatelessWidget/InputChip/node1_base.dart'; -export '../StatelessWidget/InputChip/node2_select.dart'; - - -export '../StatelessWidget/Visibility/node1_base.dart'; -export '../StatelessWidget/Visibility/node2_replacement.dart'; - -export '../StatelessWidget/ChoiceChip/node1_base.dart'; - -export '../StatelessWidget/FilterChip/node1_base.dart'; - - -export '../StatelessWidget/ListTile/node1_base.dart'; -export '../StatelessWidget/ListTile/node2_select.dart'; -export '../StatelessWidget/ListTile/node3_dense.dart'; - - -export '../StatelessWidget/ListView/node1_base.dart'; -export '../StatelessWidget/ListView/node2_direction.dart'; -export '../StatelessWidget/ListView/node3_builder.dart'; -export '../StatelessWidget/ListView/node4_separated.dart'; - -export '../StatelessWidget/MaterialButton/node1_base.dart'; -export '../StatelessWidget/MaterialButton/node2_onLongPress.dart'; -export '../StatelessWidget/MaterialButton/node3_shape.dart'; - -export '../StatelessWidget/GridTileBar/node1_base.dart'; -export '../StatelessWidget/GridTile/node1_base.dart'; - -export '../StatelessWidget/Icon/node1_base.dart'; -export '../StatelessWidget/Icon/node2_diy.dart'; - -export '../StatelessWidget/Placeholder/node1_base.dart'; -export '../StatelessWidget/Placeholder/node2_fallback.dart'; - -export '../StatelessWidget/RadioListTile/node1_base.dart'; -export '../StatelessWidget/RadioListTile/node2_dense.dart' show DenseRadioListTile; - -export '../StatelessWidget/SingleChildScrollView/node1_base.dart'; -export '../StatelessWidget/SingleChildScrollView/node2_direction.dart'; - -export '../StatelessWidget/TabBar/node1_base.dart'; -export '../StatelessWidget/TabBar/node2_noShadow.dart'; - - -export '../StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart'; -export '../StatelessWidget/VerticalDivider/node2_height.dart'; - -export '../StatelessWidget/BackButton/node1_base.dart'; -export '../StatelessWidget/ButtonBar/node1_base.dart'; -export '../StatelessWidget/ButtonBar/node2_padding.dart'; -export '../StatelessWidget/CloseButton/node1_base.dart'; - -export '../StatelessWidget/FlatButton/node1_base.dart'; - -export '../StatelessWidget/FlutterLogo/node1_base.dart'; -export '../StatelessWidget/FlutterLogo/node2_style.dart'; - -export '../StatelessWidget/IconButton/node1_base.dart'; -export '../StatelessWidget/OutlineButton/node1_base.dart'; -export '../StatelessWidget/RaisedButton/node1_base.dart'; - -export '../StatelessWidget/Drawer/node1_base.dart'; -export '../StatelessWidget/DrawerHeader/node1_base.dart'; - -export '../StatelessWidget/UserAccountsDrawerHeader/node1_base.dart'; -export '../StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart'; - - -export '../StatelessWidget/VerticalDivider/node1_base.dart'; -export '../StatelessWidget/VerticalDivider/node2_height.dart'; - - -export '../StatelessWidget/GirdView/node1_base.dart'; -export '../StatelessWidget/GirdView/node2_direction.dart'; -export '../StatelessWidget/GirdView/node3_extend.dart'; -export '../StatelessWidget/GirdView/node4_builder.dart'; - -export '../StatelessWidget/GridPager/node1_base.dart'; -export '../StatelessWidget/GridPager/node2_divisions.dart'; - -export '../StatelessWidget/Spacer/node1_base.dart'; -export '../StatelessWidget/Spacer/node2_flex.dart'; - -export '../StatelessWidget/SwitchListTile/node1_base.dart'; -export '../StatelessWidget/SwitchListTile/node2_select.dart'; -export '../StatelessWidget/SwitchListTile/node3_dense.dart'; - -export '../StatelessWidget/Listener/node1_base.dart'; -export '../StatelessWidget/PositionedDirectional/node1_base.dart'; - -export '../StatelessWidget/Tab/node1_base.dart'; -export '../StatelessWidget/Theme/node1_base.dart'; -export '../StatelessWidget/Theme/node2_use.dart'; - -export '../StatelessWidget/ToggleButtons/node1_single.dart'; -export '../StatelessWidget/ToggleButtons/node2_color.dart'; -export '../StatelessWidget/ToggleButtons/node3_multi.dart'; - - -export '../StatelessWidget/BottomSheet/node1_base.dart'; -export '../StatelessWidget/CupertinoActionSheet/node1_base.dart'; -export '../StatelessWidget/CupertinoActionSheetAction/node1_base.dart'; -export '../StatelessWidget/CupertinoAlertDialog/node1_base.dart'; - -export '../StatelessWidget/Text/node1_base.dart'; -export '../StatelessWidget/Text/node2_shadows.dart'; -export '../StatelessWidget/Text/node3_decoration.dart'; -export '../StatelessWidget/Text/node4_textAlign.dart'; -export '../StatelessWidget/Text/node5_textDirection.dart'; -export '../StatelessWidget/Text/node6_softWrap.dart'; - - -export '../StatelessWidget/DayPicker/node1_base.dart'; -export '../StatelessWidget/Dialog/node1_base.dart'; - -export '../StatelessWidget/SimpleDialog/node1_base.dart'; -export '../StatelessWidget/SimpleDialogOption/node1_base.dart'; -export '../StatelessWidget/SnackBar/node1_base.dart'; -export '../StatelessWidget/SnackBarAction/node1_base.dart'; - -export '../StatelessWidget/PageStorage/node1_base.dart'; -export '../StatelessWidget/NotificationListener/node1_base.dart'; -export '../StatelessWidget/NotificationListener/node2_update.dart'; - -export '../StatelessWidget/Autocomplete/node1_base.dart'; -export '../StatelessWidget/Autocomplete/node2_type.dart'; - - diff --git a/packages/widgets/lib/utils/color_utils.dart b/packages/widgets/lib/utils/color_utils.dart deleted file mode 100644 index 98b1151b..00000000 --- a/packages/widgets/lib/utils/color_utils.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -class RandomProvider{ - RandomProvider._();//私有化构造 - static final _random= Random(); - static Random get random =>_random; -} - -class ColorUtils { - static Color randomColor({ - int limitA = 120, - int limitR = 0, - int limitG = 0, - int limitB = 0, - }) { - Random random = RandomProvider.random; - int a = limitA + random.nextInt(256 - limitA); //透明度值 - int r = limitR + random.nextInt(256 - limitR); //红值 - int g = limitG + random.nextInt(256 - limitG); //绿值 - int b = limitB + random.nextInt(256 - limitB); //蓝值 - return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 - } - - - /// 使用方法: - /// var color1=ColorUtils.parse("#33428A43"); - /// var color2=ColorUtils.parse("33428A43"); - /// var color3=ColorUtils.parse("#428A43"); - ///var color4=ColorUtils.parse("428A43"); - /// - static Color parse(String code) { - Color result =Colors.red; - int value = 0 ; - if (code.contains("#")) { - try { - value = int.parse(code.substring(1), radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 1 + 6://6位 - result = Color(value + 0xFF000000); - break; - case 1 + 8://8位 - result = Color(value); - break; - default: - result =Colors.red; - } - }else { - try { - value = int.parse(code, radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 6: - result = Color(value + 0xFF000000); - break; - case 8: - result = Color(value); - break; - default: - result =Colors.red; - } - } - return result; - } - - static String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - diff --git a/packages/widgets/lib/utils/pather.dart b/packages/widgets/lib/utils/pather.dart deleted file mode 100644 index 6953fdf3..00000000 --- a/packages/widgets/lib/utils/pather.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; - -class Pather { - Pather._(); - - static Pather create = Pather._(); - - final 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/packages/widgets/lib/widgets.dart b/packages/widgets/lib/widgets.dart deleted file mode 100644 index 27ce957f..00000000 --- a/packages/widgets/lib/widgets.dart +++ /dev/null @@ -1,3 +0,0 @@ -library widgets; - -export 'widgets_map.dart'; \ No newline at end of file diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart deleted file mode 100644 index 77afdf1c..00000000 --- a/packages/widgets/lib/widgets_map.dart +++ /dev/null @@ -1,1408 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'exp/other_unit.dart'; -import 'exp/proxy_unit.dart'; -import 'exp/render_object_unit.dart'; -import 'exp/sliver_unit.dart'; -import 'exp/stateful_unit.dart'; -import 'exp/stateless_unit.dart'; - -/// AUTO CREATED BY [张风捷特烈] , DON'T MODIFY! - -class WidgetsMap { - static List map(String name) { - switch (name) { - case "Container": - return [ - const CustomContainer(), - const ContainerWithChild(), - const ContainerAlignment(), - ContainerDecoration(), - const ContainerTransform(), - const ContainerConstraints() - ]; - case "CupertinoSegmentedControl": - return [ - const CupertinoSegmentedControlDemo(), - const CupertinoSegmentedControlColor() - ]; - case "ImageFiltered": - return [ - const ImageFilteredBlur(), - const ImageFilteredColor(), - const ImageFilteredMatrix() - ]; - case "Autocomplete": - return [ - const AutocompleteDemo(), - const AutocompleteType() - ]; - case "Badge": - return [ - const BadgeDemo(), - const BadgeVisibleDemo(), - ]; - case "DateRangePickerDialog": - return [ - const DateRangePickerDialogDemo(), - const DiyDateRangePickerDialogDemo() - ]; - case "CompositedTransformTarget": - return [ - const CompositedTransformTargetDemo(), - ]; - case "CompositedTransformFollower": - return [ - const CompositedTransformFollowerDemo(), - ]; - case "PrimaryScrollController": - return [ - const PrimaryScrollControllerDemo(), - ]; - case "CupertinoFullscreenDialogTransition": - return [ - const CupertinoFullscreenDialogTransitionDemo(), - ]; - case "CupertinoPageTransition": - return [ - const CupertinoPageTransitionDemo(), - ]; - case "HtmlElementView": - return [ - const HtmlElementViewDemo(), - ]; - case "Text": - return [ - const CustomText(), - const ShadowText(), - const DecorationText(), - const TextAlignText(), - const TextDirectionText(), - const SoftWrapText() - ]; - case "Card": - return [ - const CustomCard(), - const ShapeCard(), - ]; - case "ElevatedButton": - return [ - const ElevatedButtonDemo(), - const ElevatedButtonStyleDemo(), - ]; - case "TextButton": - return [ - const TextButtonDemo(), - const TextButtonStyleDemo(), - ]; - case "OutlinedButton": - return [ - const OutlinedButtonDemo(), - const OutlinedButtonStyleDemo(), - ]; - case "FlutterLogo": - return [ - const CustomFlutterLogo(), - const FlutterLogoWithText(), - ]; - case "Banner": - return [ - CustomBanner(), - ]; - case "UniqueWidget": - return [ - const UniqueWidgetDemo(), - ]; - case "ShrinkWrappingViewport": - return [ - const ShrinkWrappingViewportDemo(), - ]; case "NestedScrollViewViewport": - return [ - const NestedScrollViewViewportDemo(), - ]; - case "ParentDataWidget": - return [ - const ParentDataWidgetDemo(), - ]; - case "AutomaticKeepAlive": - return [ - AutomaticKeepAliveDemo(), - ]; - case "StatusTransitionWidget": - return [ - const StatusTransitionWidgetDemo(), - ]; - case "KeepAlive": - return [ - KeepAliveDemo(), - ]; - case "ListWheelViewport": - return [ - ListWheelViewportDemo(), - ListWheelViewportDemo2(), - ListWheelViewportDemo3(), - ListWheelViewportDemo4(), - ]; - case "InheritedTheme": - return [ - const InheritedThemeDemo(), - ]; - case "ModalBarrier": - return [ - const ModalBarrierDemo(), - ]; - case "AnimatedModalBarrier": - return [ - const AnimatedModalBarrierDemo(), - ]; - case "DefaultAssetBundle": - return [ - const DefaultAssetBundleDemo(), - ]; - case "DropdownButtonFormField": - return [ - const DropdownButtonFormFieldDemo(), - ]; - case "FormField": - return [ - const FormFieldDemo(), - ]; - case "PaginatedDataTable": - return [ - const PaginatedDataTableDemo(), - ]; - case "InheritedWidget": - return [ - const InheritedWidgetDemo(), - ]; - case "ScrollView": - return [ - const ScrollViewDemo(), - ]; - case "SliverWithKeepAliveWidget": - return [ - const SliverWithKeepAliveWidgetDemo(), - ]; - case "BoxScrollView": - return [ - const BoxScrollViewDemo(), - ]; - case "CupertinoUserInterfaceLevel": - return [ - const CupertinoUserInterfaceLevelDemo(), - ]; - case "CupertinoSliverNavigationBar": - return [ - CupertinoSliverNavigationBarDemo(), - ]; - case "CupertinoSliverRefreshControl": - return [ - const CupertinoSliverRefreshControlDemo(), - ]; - case "SliverAnimatedList": - return [ - const SliverAnimatedListDemo(), - ]; - case "SliverFillRemaining": - return [ - const SliverFillRemainingDemo(), - ]; - case "SliverIgnorePointer": - return [ - const SliverIgnorePointerDemo(), - ]; - case "Viewport": - return [ - ViewportDemo(), - ]; - case "CupertinoPopupSurface": - return [ - CupertinoPopupSurfaceDemo(), - ]; - case "RenderObjectToWidgetAdapter": - return [ - const RenderObjectToWidgetAdapterDemo(), - ]; - case "SliverPrototypeExtentList": - return [ - const SliverPrototypeExtentListDemo(), - ]; - case "InputDecorator": - return [ - const InputDecoratorDemo(), - ]; - case "ColoredBox": - return [ - const ColoredBoxDemo(), - ]; - case "StatefulBuilder": - return [ - const StatefulBuilderDemo(), - ]; - case "RawKeyboardListener": - return [ - const RawKeyboardListenerDemo(), - ]; - case "RawGestureDetector": - return [ - const RawGestureDetectorDemo(), - ]; - case "SafeArea": - return [ - const SafeAreaDemo(), - ]; - case "AnimatedBuilder": - return [ - const AnimatedBuilderDemo(), - ]; - case "TweenAnimationBuilder": - return [ - const TweenAnimationBuilderDemo(), - ]; - case "WidgetInspector": - return [ - const WidgetInspectorDemo(), - ]; - case "PageStorage": - return [ - const PageStorageDemo(), - ]; - case "NotificationListener": - return [const NotificationListenerDemo(), const NotificationListenerUpdate()]; - - case "Scrollable": - return [ - ScrollableDemo(), - ]; - case "PhysicalModel": - return [ - const PhysicalModelDemo(), - ]; - case "Directionality": - return [ - const DirectionalityDemo(), - ]; - case "AnimatedTheme": - return [ - const AnimatedThemeDemo(), - ]; - case "CupertinoSlidingSegmentedControl": - return [ - const CupertinoSlidingSegmentedControlDemo(), - ]; - case "WidgetsApp": - return [ - const WidgetsAppDemo(), - ]; - case "TableCell": - return [ - const TableCellDemo(), - ]; - - case "EditableText": - return [ - const EditableTextDemo(), - ]; - case "PhysicalShape": - return [ - const PhysicalShapeDemo(), - ]; - case "ListBody": - return [ - const ListBodyDemo(), - ]; - case "FractionalTranslation": - return [ - const FractionalTranslationDemo(), - ]; - case "MouseRegion": - return [ - const MouseRegionDemo(), - ]; - case "TabPageSelector": - return [ - const TabPageSelectorDemo(), - ]; - case "CupertinoNavigationBarBackButton": - return [ - const CupertinoNavigationBarBackButtonDemo(), - ]; - case "TabPageSelectorIndicator": - return [ - const TabPageSelectorIndicatorDemo(), - ]; - case "Title": - return [ - const TitleDemo(), - ]; - case "ToggleButtonsTheme": - return [ - const ToggleButtonsThemeDemo(), - ]; - case "PerformanceOverlay": - return [ - const PerformanceOverlayDemo(), - ]; - case "NavigationToolbar": - return [ - const NavigationToolbarDemo(), - ]; - case "CupertinoDialogAction": - return [ - const CupertinoDialogActionDemo(), - ]; - case "ButtonBarTheme": - return [ - const ButtonBarThemeDemo(), - ]; - case "RawImage": - return [ - const RawImageDemo(), - ]; - case "TooltipTheme": - return [ - const TooltipThemeDemo(), - ]; - case "CupertinoTextField": - return [ - const CupertinoTextFieldDemo(), - const CupertinoTextFieldStyle(), - ]; - case "MaterialBanner": - return [ - const MaterialBannerDemo(), - const MaterialBannerDemoTwo(), - ]; - case "OrientationBuilder": - return [ - const OrientationBuilderDemo(), - ]; - case "Icon": - return [ - const CustomIcon(), - const MyIcon(), - ]; - case "ImageIcon": - return [ - const CustomImageIcon(), - ]; - case "FadeInImage": - return [ - const CustomFadeInImage(), - ]; - case "InteractiveViewer": - return [ - const InteractiveViewerDemo(), - const InteractiveViewerDemo2(), - const InteractiveViewerDemo3(), - ]; - case "CircleAvatar": - return [ - const CustomCircleAvatar(), - ]; - case "SliverLayoutBuilder": - return [ - const SliverLayoutBuilderDemo(), - ]; - case "Visibility": - return [ - const CustomVisibility(), - const ReplacementVisibility(), - ]; - case "RepaintBoundary": - return [ - const RepaintBoundaryDemo(), - RepaintBoundarySave(), - ]; - case "Chip": - return [ - const CustomChip(), - const ColorOfChip(), - const DeleteOfChip(), - ]; - case "ChoiceChip": - return [const CustomChoiceChip()]; - case "ListTileTheme": - return [const ListTileThemeDemo()]; - case "ValueListenableBuilder": - return [ValueListenableBuilderDemo()]; - case "ActionChip": - return [const CustomActionChip()]; - case "MaterialBannerTheme": - return [const MaterialBannerThemeDemo()]; - case "PopupMenuTheme": - return [const PopupMenuThemeDemo()]; - case "InputChip": - return [const PressInputChip(), const SelectInputChip()]; - case "FilterChip": - return [const CustomFilterChip()]; - case "IntrinsicHeight": - return [const IntrinsicHeightDemo()]; - case "IntrinsicWidth": - return [const IntrinsicWidthDemo()]; - case "ChipTheme": - return [const ChipThemeDemo()]; - case "ListTile": - return [const CustomListTile(), const SelectListTile(), const DenseListTile()]; - case "CheckboxListTile": - return [ - const CustomCheckBoxListTile(), - const SelectCheckBoxListTile(), - const DenseCheckBoxListTile() - ]; - case "SwitchListTile": - return [ - const CustomSwitchListTile(), - const SelectSwitchListTile(), - const DenseSwitchListTile() - ]; - - case "RadioListTile": - return [ - const CustomRadioListTile(), - const DenseRadioListTile(), - ]; - - case "GridTileBar": - return [ - const CustomGridTileBar(), - ]; - - case "GridTile": - return [ - const CustomGridTile(), - ]; - case "UserAccountsDrawerHeader": - return [ - const CustomUAGHP(), - const ProUAGHP(), - ]; - - case "MaterialButton": - return [ - const CustomMaterialButton(), - const LongPressMaterialButton(), - const ShapeMaterialButton(), - ]; - case "CupertinoButton": - return [CustomCupertinoButton()]; - case "FlatButton": - return [const CustomFlatButton()]; - case "RaisedButton": - return [const CustomRaisedButton()]; - case "OutlineButton": - return [const CustomOutlineButton()]; - case "FloatingActionButton": - return [const CustomFAB(), const MiniFAB(), const ShapeFAB()]; - - case "ButtonBar": - return [ - const CustomButtonBar(), - const PaddingButtonBar(), - ]; - - case "IconButton": - return [ - const CustomIconButton(), - ]; - case "BackButton": - return [ - CustomBackButton(), - ]; - - case "CloseButton": - return [ - const CustomCloseButton(), - ]; - case "ToggleButtons": - return [ - const CustomToggleButtons(), - const ColorToggleButtons(), - const ProToggleButtons(), - ]; - case "NestedScrollView": - return [ - const NestedScrollViewDemo(), - ]; - case "SliverOverlapAbsorber": - return [ - const SliverOverlapAbsorberDemo(), - ]; - case "SliverOverlapInjector": - return [ - const SliverOverlapInjectorDemo(), - ]; - case "Divider": - return [ - const CustomDivider(), - const HeightDivider(), - ]; - case "VerticalDivider": - return [ - const CustomVerticalDivider(), - const WidthVerticalDivider(), - ]; - case "Placeholder": - return [ - const CustomPlaceholder(), - const FallbackPlaceholder(), - ]; - case "GridPager": - return [ - const CustomGridPage(), - const DivisionsGridPage(), - ]; - case "Image": - return [ - const LoadImage(), - const FitImage(), - const AlignmentImage(), - const BlendModeImage(), - const RepeatImage(), - const CenterSliceImage(), - ]; - case "Checkbox": - return [ - const CustomCheckbox(), - const TristateCheckBok(), - ]; - case "Switch": - return [ - const CustomSwitch(), - const ImageSwitch(), - ]; - case "CupertinoSwitch": - return [ - const CustomCupertinoSwitch(), - ]; - case "Slider": - return [ - const CustomSlider(), - const DivisionsSlider(), - ]; - case "CupertinoSlider": - return [ - const CustomCupertinoSlider(), - ]; - case "RangeSlider": - return [ - const CustomRangeSlider(), - ]; - case "Radio": - return [ - const CustomRadio(), - ]; - case "CustomMultiChildLayout": - return [ - const CustomMultiChildLayoutDemo(), - ]; - case "LayoutId": - return [ - const LayoutIdDemo(), - ]; - case "CircularProgressIndicator": - return [ - const CustomCircularProgressIndicator(), - ]; - case "LinearProgressIndicator": - return [ - const CustomLinearProgressIndicator(), - ]; - case "CupertinoActivityIndicator": - return [ - const CustomCupertinoActivityIndicator(), - ]; - case "RefreshIndicator": - return [ - const CustomRefreshIndicator(), - ]; - case "Tooltip": - return [ - const CustomTooltip(), - const DecorationTooltip(), - ]; - case "ExpandIcon": - return [ - const CustomExpandIcon(), - ]; - case "ExpansionTile": - return [ - const CustomExpansionTile(), - ]; - - case "AnnotatedRegion": - return [ - const AnnotatedRegionDemo(), - ]; - case "CheckedModeBanner": - return [ - const CheckedModeBannerDemo(), - ]; - case "DefaultTabController": - return [ - const DefaultTabControllerDemo(), - ]; - case "CupertinoTabView": - return [ - const CupertinoTabViewDemo(), - ]; - case "CupertinoTextSelectionToolbar": - return [ - const CupertinoTextSelectionToolbarDemo(), - ]; - case "DraggableScrollableActuator": - return [ - const DraggableScrollableActuatorDemo(), - ]; - case "GlowingOverscrollIndicator": - return [ - GlowingOverscrollIndicatorDemo(), - ]; - case "DraggableScrollableSheet": - return [ - const DraggableScrollableSheetDemo(), - ]; - case "DrawerController": - return [ - const DrawerControllerDemo(), - ]; - case "MergeableMaterial": - return [ - const MergeableMaterialDemo(), - ]; - case "SizeChangedLayoutNotifier": - return [ - const SizeChangedLayoutNotifierDemo(), - ]; - case "SelectableText": - return [ - const CustomSelectableText(), - const AlignSelectableText(), - ]; - case "TextField": - return [ - const CustomTextField(), - const CursorTextField(), - const ComplexTextField(), - ]; - case "DropdownButton": - return [ - const CustomDropDownButton(), - const StyleDropDownButton(), - ]; - case "PopupMenuButton": - return [ - const CustomPopupMenuButton(), - ]; - case "AppBar": - return [ - const CustomAppBar(), - const TabAppBar(), - ]; - case "TabBar": - return [ - const CustomTabBar(), - const NoShadowTabBarDemo(), - ]; - case "TabBarView": - return [ - const CustomTabBarView(), - ]; - case "BottomNavigationBar": - return [ - const CustomBottomNavigationBar(), - const BottomNavigationBarWithPageView() - ]; - case "BottomAppBar": - return [ - const CustomBottomAppBar(), - ]; - case "CupertinoNavigationBar": - return [ - const CustomCupertinoNavigationBar(), - ]; - case "CupertinoTabBar": - return [ - const CustomCupertinoTabBar(), - ]; - case "Scaffold": - return [ - const CustomScaffold(), - ]; - case "MaterialApp": - return [ - const MaterialAppDemo(), - ]; - case "ClipOval": - return [ - const CustomClipOval(), - ]; - case "ClipRect": - return [ - const CustomClipRect(), - ]; - case "ClipRRect": - return [ - const CustomClipRRect(), - ]; - case "ClipPath": - return [ - const CustomClipPath(), - ]; - case "DecoratedBox": - return const [ - BoxDecorationDemo(), - ShapeImageDemo(), - BorderDemo(), - ShapeDecorationDemo(), - UnderlineTabIndicatorDemo(), - FlutterLogoDecorationDemo(), - ]; - case "Offstage": - return [ - const CustomOffstage(), - ]; - case "RotatedBox": - return [ - const CustomRotatedBox(), - ]; - case "Opacity": - return [ - const CustomOpacity(), - ]; - case "Padding": - return [ - const PaddingAll(), - const PaddingOnly(), - const PaddingSymmetric(), - ]; - case "Baseline": - return [ - const CustomBaseline(), - ]; - case "SizedBox": - return [ - const CustomSizedBox(), - ]; - case "AspectRatio": - return [ - const CustomAspectRatio(), - ]; - case "Transform": - return [ - const SkewTransform(), - const TranslationTransform(), - const ScaleTransform(), - const RotateTransform(), - const R3C2(), - ]; - case "LimitedBox": - return [ - const CustomLimitedBox(), - ]; - case "ConstrainedBox": - return [ - const CustomConstrainedBox(), - ]; - case "UnconstrainedBox": - return [ - const CustomUnConstrainedBox(), - ]; - case "FractionallySizedBox": - return [ - const CustomFractionallySizedBox(), - ]; - case "OverflowBox": - return [ - const CustomOverflowBox(), - ]; - case "SizedOverflowBox": - return [ - const CustomSizedOverflowBox(), - ]; - case "Align": - return [const CustomAlign(), const SinLayout()]; - case "Center": - return [ - const CustomCenter(), - ]; - case "FittedBox": - return [ - const CustomFittedBox(), - ]; - case "ColorFiltered": - return [ - const CustomColorFiltered(), - ]; - case "FadeTransition": - return [ - const CustomFadeTransition(), - ]; - case "RotationTransition": - return [ - const CustomRotationTransition(), - ]; - case "ScaleTransition": - return [ - const CustomScaleTransition(), - ]; - case "SizeTransition": - return [ - const CustomSizeTransition(), - ]; - case "PositionedTransition": - return [ - const CustomPositionedTransition(), - ]; - case "Flex": - return [ - DirectionFlex(), - MainAxisAlignmentFlex(), - CrossAxisAlignmentFlex(), - VerticalDirectionFlex(), - TextDirectionFlex(), - ]; - case "Row": - return [ - const CustomRow(), - ]; - case "Column": - return [ - const CustomColumn(), - ]; - case "Stack": - return [const CustomStack(), const PositionedStack()]; - case "Wrap": - return [ - DirectionWrap(), - WrapAlignmentWrap(), - CrossAxisAlignmentWrap(), - TextDirectionWrap(), - VerticalDirectionWrap(), - ]; - case "Flow": - return [ - CircleFlow(), - BurstFlow.show, - ]; - case "AnimatedCrossFade": - return [ - const CustomAnimatedCrossFade(), - const CurveAnimatedCrossFade(), - ]; - case "RichText": - return [ - const CustomRichText(), - const RichTextWithWidget(), - ]; - case "DataTable": - return [ - CustomDataTable(), - const SortDataTable(), - ]; - case "Draggable": - return [ - const CustomDraggable(), - const DraggablePage(), - const DeleteDraggable(), - ]; - case "DragTarget": - return [ - const CustomDragTarget(), - ]; - case "LongPressDraggable": - return [ - const CustomLongPressDraggable(), - ]; - case "Expanded": - return [ - const CustomExpended(), - ]; - case "Spacer": - return [ - const OneSpacer(), - const ManySpacer(), - ]; - case "Positioned": - return [ - const CustomPositioned(), - ]; - case "Flexible": - return [ - const CustomFlexible(), - ]; - case "Table": - return [ - const CustomTable(), - ]; - case "AlignTransition": - return [ - const CustomAlignTransition(), - ]; - case "SlideTransition": - return [ - const CustomSlideTransition(), - ]; - case "DecoratedBoxTransition": - return [ - const CustomDecoratedBoxTransition(), - ]; - case "DefaultTextStyleTransition": - return [ - const CustomDefaultTextStyleTransition(), - ]; - case "RelativePositionedTransition": - return [ - const CustomRelativePositionedTransition(), - ]; - case "AnimatedSwitcher": - return [ - const CustomAnimatedSwitcher(), - ]; - case "AnimatedList": - return [ - const CustomAnimatedList(), - ]; - case "AnimatedOpacity": - return [ - const CustomAnimatedOpacity(), - ]; - case "AnimatedPadding": - return [ - const CustomAnimatedPadding(), - ]; - case "AnimatedAlign": - return [ - const CustomAnimatedAlign(), - ]; - case "AnimatedPositioned": - return [ - const CustomAnimatedPositioned(), - ]; - case "AnimatedPositionedDirectional": - return [ - const CustomAnimatedPositionedDirectional(), - ]; - case "AnimatedContainer": - return [ - const CustomAnimatedContainer(), - ]; - case "AnimatedDefaultTextStyle": - return [ - const CustomAnimatedDefaultTextStyle(), - ]; - case "AnimatedIcon": - return [ - const CustomAnimatedIcon(), - ]; - case "Dialog": - return [ - const CustomDialog(), - ]; - case "AlertDialog": - return [ - const CustomAlertDialog(), - ]; - case "SimpleDialog": - return [ - const CustomSimpleDialog(), - ]; - case "CupertinoAlertDialog": - return [ - const CustomCupertinoAlertDialog(), - ]; - case "AboutDialog": - return [ - const CustomAboutDialog(), - ]; - case "CupertinoActionSheet": - return [ - const CustomCupertinoActionSheet(), - ]; - case "CupertinoActionSheetAction": - return [ - const CustomCupertinoActionSheetAction(), - ]; - case "SimpleDialogOption": - return [ - const CustomSimpleDialogOption(), - ]; - case "DayPicker": - return [ - const CustomDayPicker(), - ]; - case "MonthPicker": - return [ - const CustomMonthPicker(), - ]; - case "YearPicker": - return [ - const CustomYearPicker(), - ]; - case "CupertinoDatePicker": - return [ - const CustomCupertinoDatePicker(), - ]; - case "CupertinoTimerPicker": - return [ - const CustomCupertinoTimerPicker(), - ]; - case "CupertinoPicker": - return [ - const CustomCupertinoPicker(), - ]; - case "SnackBar": - return [ - const CustomSnackBar(), - ]; - case "SnackBarAction": - return [ - const CustomSnackBarAction(), - ]; - case "BottomSheet": - return [ - const CustomBottomSheet(), - ]; - case "CupertinoContextMenu": - return [ - const CustomCupertinoContextMenu(), - ]; - case "CupertinoContextMenuAction": - return [ - const CustomCupertinoContextMenuAction(), - ]; - case "LicensePage": - return [ - const CustomLicensePage(), - ]; - case "Builder": - return [ - const BuilderDemo(), - ]; - case "GestureDetector": - return [ - const CustomGestureDetector(), - const TapGestureDetector(), - const PanGestureDetector(), - ]; - case "Listener": - return [ - const CustomListener(), - ]; - case "Tab": - return [ - const CustomTab(), - ]; - case "PreferredSize": - return [ - const CustomPreferredSize(), - const AdapterPreferredSize(), - ]; - case "InkResponse": - return [ - const CustomInkResponse(), - const ColorInkResponse(), - ]; - case "InkWell": - return [ - const CustomInkWell(), - const ColorInkWell(), - ]; - case "TableRowInkWell": - return [ - const CustomTableRowInkWell(), - ]; - case "Ink": - return [ - const CustomInk(), - const InkImage(), - ]; - case "RawChip": - return [ - const PressRawChip(), - const SelectRawChip(), - ]; - case "Drawer": - return [ - const CustomDrawer(), - ]; - case "DrawerHeader": - return [ - const CustomDrawerHeader(), - ]; - case "CupertinoApp": - return [ - const CustomCupertinoApp(), - ]; - case "CupertinoPageScaffold": - return [ - const CustomCupertinoPageScaffold(), - ]; - case "CupertinoTabScaffold": - return [ - const CustomCupertinoTabScaffold(), - ]; - case "PositionedDirectional": - return [ - const CustomPositionedDirectional(), - ]; - case "Material": - return [ - const CustomMaterial(), - const ShapeMaterial(), - ]; - case "IndexedStack": - return [ - const CustomIndexedStack(), - ]; - case "ListView": - return [ - CustomListView(), - HorizontalListView(), - SeparatedListView(), - BuilderListView(), - ]; - case "GridView": - return [ - CustomGridView(), - HorizontalGridView(), - ExtentGridView(), - BuilderGridView() - ]; - case "SingleChildScrollView": - return [ - CustomSingleChildScrollView(), - DirectionSingleChildScrollView(), - ]; - case "PageView": - return [ - CustomPageView(), - DirectionPageView(), - const CtrlPageView(), - ]; - case "CustomPaint": - return [ - const ClockPage(), - const PlayBezier3Page(), - ]; - case "MediaQuery": - return [ - const CustomMediaQuery(), - ]; - case "Theme": - return [const TextThemeDemo(), const CustomTheme()]; - case "CupertinoTheme": - return [const TextCupertinoTheme(), const CustomCupertinoTheme()]; - case "WillPopScope": - return [ - const CustomWillPopScope(), - ]; - case "Hero": - return [ - const CustomHero(), - ]; - case "FutureBuilder": - return [ - const CustomFutureBuilder(), - ]; - case "StreamBuilder": - return [ - const CustomStreamBuilder(), - ]; - case "PopupMenuDivider": - return [ - const CustomPopupMenuDivider(), - ]; - case "RawMaterialButton": - return [ - const CustomRawMaterialButton(), - const ShapeRawMaterialButton(), - ]; - case "Dismissible": - return [ - const CustomDismissible(), - const DirectionDismissible(), - ]; - case "ReorderableListView": - return [ - const CustomReorderableListView(), - const DirectionReorderableListView(), - ]; - case "ExpansionPanelList": - return [ - const CustomExpansionPanelList(), - ]; - case "ListWheelScrollView": - return [ - const CustomListWheelScrollView(), - ]; - case "ScrollConfiguration": - return [ - CustomScrollConfiguration(), - ]; - case "DropdownButtonHideUnderline": - return [ - const CustomDropDownButtonHideUnderline(), - ]; - case "Overlay": - return [ - const CustomOverlay(), - ]; - case "CustomScrollView": - return [ - CustomScrollViewDemo(), - ]; - case "SliverAppBar": - return [ - const SliverAppBarDemo(), - ]; - case "SliverList": - return [ - SliverListDemo(), - ]; - case "SliverFixedExtentList": - return [ - const SliverFixedExtentListDemo(), - ]; - case "SliverFillViewport": - return [ - const SliverFillViewportDemo(), - ]; - case "SliverGird": - return [ - SliverGirdDemo(), - ]; - case "SliverToBoxAdapter": - return [ - SliverToBoxAdapterDemo(), - ]; - case "SliverPersistentHeader": - return [ - SliverPersistentHeaderDemo(), - ]; - case "SliverPadding": - return [ - SliverPaddingDemo(), - ]; - case "SliverOpacity": - return [ - SliverOpacityDemo(), - ]; - case "AboutListTile": - return [ - const AboutListTileDemo(), - ]; - case "Scrollbar": - return [ - CustomScrollbar(), - ]; - case "CupertinoScrollbar": - return [ - CustomCupertinoScrollbar(), - ]; - case "FlexibleSpaceBar": - return [ - FlexibleSpaceBarDemo(), - ]; - case "ErrorWidget": - return [ - const ErrorWidgetDemo(), - ]; - case "Form": - return [ - const CustomForm(), - ]; - case "TextFormField": - return [ - const CustomTextFormField(), - ]; - case "Stepper": - return [ - const StepperDemo(), - const VerticalStepper(), - ]; - case "AnimatedSize": - return [ - const CustomAnimatedSize(), - ]; - case "ShaderMask": - return [ - const RadialShaderMask(), - const LinearShaderMask(), - ]; - case "DefaultTextStyle": - return [ - const DefaultTextStyleDemo(), - ]; - case "IconTheme": - return [ - const IconThemeDemo(), - ]; - case "ButtonTheme": - return [ - const ButtonThemeDemo(), - ]; - case "DividerTheme": - return [ - const DividerThemeDemo(), - ]; - case "Navigator": - return [ - const NavigatorDemo(), - ]; - case "SliderTheme": - return [ - const SliderThemeDemo(), - const DIYSliderTheme(), - ]; - case "LayoutBuilder": - return [ - const CustomLayoutBuilder(), - const FitByLayoutBuilder(), - const SimpleExpandableText(), - ]; - case "IgnorePointer": - return [ - const CustomIgnorePointer(), - ]; - case "AbsorbPointer": - return [ - const CustomAbsorbPointer(), - ]; - case "BackdropFilter": - return [ - const CustomBackdropFilter(), - ]; - case "AnimatedPhysicalModel": - return [ - const AnimatedPhysicalModelDemo(), - ]; - case "CustomSingleChildLayout": - return [ - const CustomSingleChildLayoutDemo(), - const OffSetWidgetDemo(), - ]; - case "NavigationRail": - return [ - const AnotherPage(child: CustomNavigationRail()), - const AnotherPage(child: ExtendableNavigationRail()), - const AnotherPage(child: DarkNavigationRail()), - ]; - default: return []; - } - } -} - -class AnotherPage extends StatelessWidget { - final Widget child; - const AnotherPage({Key? key, required this.child}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ElevatedButton(onPressed: (){ - Navigator.of(context).push(MaterialPageRoute(builder: (_)=>Scaffold( - appBar: AppBar(leading: const BackButton(),), - body: child))); - }, child: Text('跳转到新界面查看效果')); - } -} diff --git a/packages/widgets/pubspec.yaml b/packages/widgets/pubspec.yaml deleted file mode 100644 index 6884d14b..00000000 --- a/packages/widgets/pubspec.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: widgets -description: A new Flutter package project. -version: 0.0.1 -homepage: - -environment: - sdk: '>=2.18.6 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - path_provider: ^2.0.11 # 路径 - intl: ^0.17.0 - app_config: - path: ../app_config - components: - path: ../components - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/pubspec.lock b/pubspec.lock index fda2f9b7..35cb81af 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,130 +1,126 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - app_config: - dependency: "direct main" - description: - path: "packages/app_config" - relative: true - source: path - version: "0.0.1" - app_update: - dependency: "direct main" - description: - path: "packages/app_update" - relative: true - source: path - version: "0.0.1" archive: dependency: "direct main" description: name: archive - sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.6" + version: "4.0.7" args: dependency: transitive description: name: args - sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.10.0" - authentication: - dependency: "direct main" - description: - path: "packages/authentication" - relative: true - source: path - version: "0.0.1" + version: "2.13.0" bloc: dependency: transitive description: name: bloc - sha256: bd4f8027bfa60d96c8046dec5ce74c463b2c918dce1b0d36593575995344534a + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.0" + version: "8.1.4" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.1" + version: "1.4.0" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.17.0" - components: - dependency: "direct main" - description: - path: "packages/components" - relative: true - source: path - version: "0.0.1" + version: "1.19.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.1.1" + version: "3.1.2" cross_file: dependency: transitive description: name: cross_file - sha256: f71079978789bc2fe78d79227f1f8cfe195b31bbd8db2399b0d15a4b96fb843b + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.3+2" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.2" + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.8" + dart_quill_delta: + dependency: transitive + description: + name: dart_quill_delta + sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.5" + version: "10.8.3" dash_painter: dependency: "direct main" description: @@ -133,61 +129,110 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" - db_storage: - dependency: "direct main" + dev_build: + dependency: transitive description: - path: "packages/db_storage" - relative: true - source: path - version: "0.0.1" + name: dev_build + sha256: fda8a54458b2a873a84e0cd1513f4323a1fb0599ed5455245359bc0398bad9ee + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.1.2+11" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.4.1" dio: dependency: "direct main" description: name: dio - sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.6" + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.1.1" equatable: dependency: "direct main" description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.5" + version: "2.0.7" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.3.1" + version: "1.3.3" ffi: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "2.1.4" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.4" + version: "7.0.1" file_picker: dependency: "direct main" description: name: file_picker - sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 + sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.2.5" + version: "10.1.9" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.9.3+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.9.3+4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -197,18 +242,66 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "890c51c8007f0182360e523518a0c732efb89876cb4669307af7efada5b55557" + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.flutter-io.cn/" + source: hosted + version: "8.1.6" + flutter_colorpicker: + dependency: transitive + description: + name: flutter_colorpicker + sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.1" + version: "1.1.0" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_temp_fork: + dependency: transitive + description: + name: flutter_keyboard_visibility_temp_fork + sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.1.5" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.4" + version: "4.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -218,26 +311,42 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "981442432b632237ffc1cf8092b4173b9e9f2278b5740637287c3069b51c8f09" + sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.13" + version: "0.7.7+1" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.0.28" + flutter_quill: + dependency: transitive + description: + name: flutter_quill + sha256: "7e60963632bbc8615627f0bae8e178515f69ecb378ad49fa68c43c2aabf33e21" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "11.4.1" + flutter_quill_delta_from_html: + dependency: transitive + description: + name: flutter_quill_delta_from_html + sha256: "4597bd0853a704696837aa6b05cffd851f587b176204c234edddfed1c1862a09" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.8" + version: "1.5.2" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8" + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.1.0" + version: "5.2.1" flutter_star: dependency: "direct main" description: @@ -250,10 +359,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: b9be7260c1fdbe0090a11d9d356fc2c88e14cf33407fc0c1829d76ab13808035 + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "2.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -264,46 +373,126 @@ packages: description: flutter source: sdk version: "0.0.0" + fx_boot_starter: + dependency: "direct main" + description: + name: fx_boot_starter + sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.1.1" + fx_dao: + dependency: "direct main" + description: + name: fx_dao + sha256: "253381288b921b9ad5e193d5e48531b71ad0c4511be66146603c65d36d2e995b" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3+4" + fx_dio: + dependency: "direct main" + description: + name: fx_dio + sha256: "395549518d055596d58ffcff59b4da0c147d855f6258f2769213c7230c090525" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.4+3" + fx_env: + dependency: transitive + description: + name: fx_env + sha256: c95836ab108c498d53f43c464e08a5ce64975efdf586fb46f1a4c37bb2c400bf + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" + fx_go_router_ext: + dependency: "direct main" + description: + name: fx_go_router_ext + sha256: dc65ac677f2058b8192ca50bdcd508a12ef4b6c150f64ca8d595b536ac6e5d1b + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.6+1" + fx_platform_adapter: + dependency: "direct main" + description: + name: fx_platform_adapter + sha256: e6d5ca554a1fd019a695a63bbb3e4eee6efe492b5d926542f22d6b64cea99415 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3" + fx_string: + dependency: transitive + description: + name: fx_string + sha256: "3350be2fa11cdb0d4107e4657431d05088a88795ef3145ad37902f6066a5b124" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" + fx_trace: + dependency: "direct main" + description: + name: fx_trace + sha256: a1fb64b1a6bfc53609fe55e6d56a9c00e76250818eb5a8cfac280a051e33911c + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.5+5" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "14.8.0" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.15.6" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.13.5" + version: "1.4.0" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.2" + version: "4.1.2" image: dependency: "direct main" description: name: image - sha256: f6ffe2895e3c86c6ad5a27e6302cf807403463e397cb2f0c580f619ac2fa588b + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.2.2" + version: "4.5.4" intl: - dependency: "direct main" + dependency: "direct overridden" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.17.0" - js: + version: "0.20.2" + json_annotation: dependency: transitive description: - name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.5" + version: "4.9.0" jwt_decoder: dependency: "direct main" description: @@ -312,54 +501,86 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.0.1" lints: dependency: transitive description: name: lints - sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "4.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.3.0" markdown: dependency: transitive description: name: markdown - sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2 + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.1" + version: "7.3.0" matcher: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.12.13" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.flutter-io.cn/" source: hosted - version: "1.8.0" + version: "1.16.0" mime: dependency: transitive description: name: mime - sha256: dab22e92b41aa1255ea90ddc4bc2feaf35544fd0728e209638cad041a6e3928a + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.2" + version: "2.0.0" nested: dependency: transitive description: @@ -368,378 +589,554 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" - old_fancy_mobile_ui: - dependency: "direct main" + open_file: + dependency: transitive description: - path: "packages/old_fancy_mobile_ui" - relative: true - source: path - version: "0.0.1" - package_info_plus: - dependency: "direct main" + name: open_file + sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.5.10" + open_file_android: + dependency: transitive description: - name: package_info_plus - sha256: f62d7253edc197fe3c88d7c2ddab82d68f555e778d55390ccc3537eca8e8d637 + name: open_file_android + sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.4.3+1" - package_info_plus_linux: + version: "1.0.6" + open_file_ios: dependency: transitive description: - name: package_info_plus_linux - sha256: "04b575f44233d30edbb80a94e57cad9107aada334fc02aabb42b6becd13c43fc" + name: open_file_ios + sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.5" - package_info_plus_macos: + version: "1.0.3" + open_file_linux: dependency: transitive description: - name: package_info_plus_macos - sha256: a2ad8b4acf4cd479d4a0afa5a74ea3f5b1c7563b77e52cc32b3ee6956d5482a6 + name: open_file_linux + sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.3.0" - package_info_plus_platform_interface: + version: "0.0.5" + open_file_mac: dependency: transitive description: - name: package_info_plus_platform_interface - sha256: f7a0c8f1e7e981bc65f8b64137a53fd3c195b18d429fba960babc59a5a1c7ae8 + name: open_file_mac + sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.2" - package_info_plus_web: + version: "1.0.3" + open_file_platform_interface: dependency: transitive description: - name: package_info_plus_web - sha256: f0829327eb534789e0a16ccac8936a80beed4e2401c4d3a74f3f39094a822d3b + name: open_file_platform_interface + sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.6" - package_info_plus_windows: + version: "1.0.3" + open_file_web: dependency: transitive description: - name: package_info_plus_windows - sha256: "79524f11c42dd9078b96d797b3cf79c0a2883a50c4920dc43da8562c115089bc" + name: open_file_web + sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.0" + version: "0.0.4" + open_file_windows: + dependency: transitive + description: + name: open_file_windows + sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "8.1.4" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.2.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.8.2" + version: "1.9.1" path_parsing: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: "050e8e85e4b7fecdf2bb3682c1c64c4887a183720c802d323de8a5fd76d372dd" + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.11" + version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.22" - path_provider_ios: + version: "2.2.17" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - sha256: "03d639406f5343478352433f00d3c4394d52dac8df3d847869c5e2333e0bbce8" + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.11" + version: "2.4.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - sha256: "2a97e7fbb7ae9dcd0dfc1220a78e9ec3e71da691912e617e8715ff2a13086ae8" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.6" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.5" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" + version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.1.0" + version: "6.1.0" platform: - dependency: "direct main" + dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.1.0" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" - pointycastle: + version: "1.5.1" + posix: dependency: transitive description: - name: pointycastle - sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.6.2" - process: + version: "6.0.2" + process_run: dependency: transitive description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + name: process_run + sha256: "6ec839cdd3e6de4685318e7686cd4abb523c3d3a55af0e8d32a12ae19bc66622" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.2.4" + version: "1.2.4" provider: dependency: transitive description: name: provider - sha256: e1e7413d70444ea3096815a60fe5da1b11bda8a9dc4769252cc82c53536f8bcc + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "6.1.5" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.2.0" + quill_native_bridge: + dependency: transitive + description: + name: quill_native_bridge + sha256: "00752aca7d67cbd3254709a47558be78427750cb81aa42cfbed354d4a079bcfa" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "11.0.1" + quill_native_bridge_android: + dependency: transitive + description: + name: quill_native_bridge_android + sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1+2" + quill_native_bridge_ios: + dependency: transitive + description: + name: quill_native_bridge_ios + sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" + quill_native_bridge_linux: + dependency: transitive + description: + name: quill_native_bridge_linux + sha256: "5fcc60cab2ab9079e0746941f05c5ca5fec85cc050b738c8c8b9da7c09da17eb" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" + quill_native_bridge_macos: + dependency: transitive + description: + name: quill_native_bridge_macos + sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.4" + version: "0.0.1" + quill_native_bridge_platform_interface: + dependency: transitive + description: + name: quill_native_bridge_platform_interface + sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2+1" + quill_native_bridge_web: + dependency: transitive + description: + name: quill_native_bridge_web + sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2" + quill_native_bridge_windows: + dependency: transitive + description: + name: quill_native_bridge_windows + sha256: "60e50d74238f22ceb43113d9a42b6627451dab9fc27f527b979a32051cf1da45" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.2.2" r_upgrade: + dependency: transitive + description: + path: "modules/ability/r_upgrade-0.4.2" + relative: true + source: path + version: "0.4.2" + refresh: dependency: "direct main" description: - name: r_upgrade - sha256: be460ed1d2bf3b444a731aa2eeb38751faaef91097fed4bf9d138d3214b98999 + name: refresh + sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.8+2" + version: "1.0.1" screen_retriever: dependency: transitive description: name: screen_retriever - sha256: "9c3839c4eb80807cd8210afa3c84a177ba00aef9f9b7b74ad92d3a0ab1d7e7ed" + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.1.5" + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.0" share_plus: dependency: "direct main" description: name: share_plus - sha256: "8c6892037b1824e2d7e8f59d54b3105932899008642e6372e5079c6939b4b625" + sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da url: "https://pub.flutter-io.cn/" source: hosted - version: "6.3.1" + version: "10.1.4" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b url: "https://pub.flutter-io.cn/" source: hosted - version: "3.2.0" + version: "5.0.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "76917b7d4b9526b2ba416808a7eb9fb2863c1a09cf63ec85f1453da240fa818a" + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.15" + version: "2.5.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8e251f3c986002b65fed6396bce81f379fb63c27317d49743cf289fd0fd1ab97" + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.14" - shared_preferences_ios: + version: "2.4.10" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - sha256: "585a14cefec7da8c9c2fb8cd283a3bb726b4155c0952afe6a0caaa7b2272de34" + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.5.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "28aefc1261746e7bad3d09799496054beb84e8c4ffcdfed7734e17b4ada459a5" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.1" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - sha256: fbb94bf296576f49be37a1496d5951796211a8db0aa22cc0d68c46440dad808c + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.4" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.0" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.4" + version: "2.4.3" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "97f7ab9a7da96d9cf19581f5de520ceb529548498bd6b5e0ccd02d68a0d15eba" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.4.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.9.1" + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "7.0.0" sqflite: - dependency: "direct main" + dependency: transitive description: name: sqflite - sha256: d21c022832f139b89922738e200c07387a49c549bf36c35654418e19ff76d161 + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0+3" + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.4.1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "0c21a187d645aa65da5be6997c0c713eed61e049158870ae2de157e6897067ab" + sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.0+2" + version: "2.5.5" sqflite_common_ffi: - dependency: "direct main" + dependency: transitive description: name: sqflite_common_ffi - sha256: "9c922744759dc8364ae724af2620acf25aba2e7756aae7844b98649e6fd29f11" + sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.3.5" + sqflite_common_ffi_web: + dependency: transitive + description: + name: sqflite_common_ffi_web + sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.4.5+4" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0+1" + version: "2.4.0" sqlite3: dependency: transitive description: name: sqlite3 - sha256: db6350456720a4088a364bbe02052d43056a5ffbd4816fe9d28310dcfbe0dc05 + sha256: c0503c69b44d5714e6abbf4c1f51a3c3cc42b75ce785f44404765e4635481d38 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.9.1" + version: "2.7.6" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.11.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.1.4" stream_transform: - dependency: "direct main" + dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.0" + version: "1.4.1" synchronized: dependency: transitive description: name: synchronized - sha256: "7b530acd9cb7c71b0019a1e7fa22c4105e675557a4400b6a401c71c5e0ade1ac" + sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.0+3" + version: "3.3.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.flutter-io.cn/" source: hosted - version: "0.4.16" + version: "0.7.4" toggle_rotate: dependency: "direct main" description: @@ -748,117 +1145,174 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" + tolyui: + dependency: "direct main" + description: + name: tolyui + sha256: "800e95b470fd013adb1d8f84944b5498cbca59307cd50ff2b3affc98c57af51e" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.4+10" + tolyui_color: + dependency: transitive + description: + name: tolyui_color + sha256: e79eed0a525a584dc51df9ee5445bee190d9a9b5f14690038800c4983b2c744a + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2" + tolyui_feedback: + dependency: transitive + description: + name: tolyui_feedback + sha256: b6d67fd448a8d39762fd14266c706fc8da7671eaaaeb81f42a12e467ff4dfbf7 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.3.6+6" + tolyui_message: + dependency: transitive + description: + name: tolyui_message + sha256: "3811b9666d90d0088c35cacfe77ef990ed6019f801000d0e39ed8f500817b3bf" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.6+1" + tolyui_meta: + dependency: transitive + description: + name: tolyui_meta + sha256: "449bca06271d6c5d2a6b49192fd9176fa14b86fcd57c7317c4466a9d0b334674" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2+1" + tolyui_navigation: + dependency: transitive + description: + name: tolyui_navigation + sha256: "9fe5eddb1b8f9c178f81a507937815e9e7e7b4872ac70dd567428cd41c84e2e1" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.0+3" + tolyui_rx_layout: + dependency: transitive + description: + name: tolyui_rx_layout + sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0" + two_dimensional_scrollables: + dependency: transitive + description: + name: two_dimensional_scrollables + sha256: "1b0b29095d86df509d115ac668f85c3fcb0bd1554ccf89c289ca4769bead49db" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.3.4" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.3.1" + version: "1.4.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.9" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "6f91d30ce9060c204b2dbe728adb300750fa4b228e8f7ed1b961aa1ceb728799" + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.22" + version: "6.3.16" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "6ba7dddee26c9fae27c9203c424631109d73c8fa26cfa7bc3e35e751cb87f62e" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.17" + version: "6.3.3" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "360fa359ab06bcb4f7c5cd3123a2a9a4d3364d4575d27c4b33468bd4497dd094" + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: a9b3ea9043eabfaadfa3fb89de67a11210d85569086d22b3854484beab8b3978 + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "5669882643b96bb6d5786637cac727c6e918a790053b09245fd4513b8a07df2a" + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.13" + version: "2.4.1" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: e3c3b16d3104260c10eea3b0e34272aaa57921f83148b0619f74c2eced9b7ef1 + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" - utils: - dependency: "direct main" - description: - path: "packages/utils" - relative: true - source: path - version: "0.0.1" + version: "3.1.4" uuid: - dependency: transitive + dependency: "direct main" description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.7" + version: "4.5.1" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "09562ef5f47aa84f6567495adb6b9cb2a3192b82c352623b8bd00b300d62603b" + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.18" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "886e57742644ebed024dc3ade29712e37eea1b03d294fb314c0a3386243fe5a6" + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.13" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "5d9010c4a292766c55395b2288532579a85673f8148460d1e233d98ffe10d24e" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.17" vector_math: dependency: transitive description: @@ -867,24 +1321,58 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" - widget_module: - dependency: "direct main" + vm_service: + dependency: transitive description: - path: "packages/widget_module" - relative: true - source: path - version: "0.0.1" - widget_repository: - dependency: "direct main" + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "15.0.0" + web: + dependency: "direct overridden" description: - path: "packages/widget_repository" - relative: true - source: path - version: "0.0.1" - widgets: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.1.1" + webview_flutter: dependency: "direct main" description: - path: "packages/widgets" + name: webview_flutter + sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba + url: "https://pub.flutter-io.cn/" + source: hosted + version: "4.13.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "4.7.0" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.13.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.22.0" + widget_repository: + dependency: transitive + description: + path: "modules/widget_system/widget_repository" relative: true source: path version: "0.0.1" @@ -892,18 +1380,18 @@ packages: dependency: transitive description: name: win32 - sha256: ca121dbbadb3e43b449053feab0cdf3f2bff93b107cacf0290e3d29f717374b6 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.1.2" + version: "5.13.0" window_manager: - dependency: "direct main" + dependency: transitive description: name: window_manager - sha256: d812d3189d23465d2e94baa2505a4462b46dde4939012ff370711c6897d747ae + sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.9" + version: "0.4.3" wrapper: dependency: "direct main" description: @@ -916,34 +1404,26 @@ packages: dependency: transitive description: name: xdg_directories - sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f" + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.0+2" + version: "1.1.0" xml: dependency: transitive description: name: xml - sha256: ac0e3f4bf00ba2708c33fbabbbe766300e509f8c82dbd4ab6525039813f7e2fb + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.0" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.1.1" - yaml_modify: - dependency: "direct main" - description: - name: yaml_modify - sha256: "0c67ba263546f44b738c9ae14bd602bb1ef75c74a61a25b9111708a7a7e9af94" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "3.1.3" sdks: - dart: ">=2.19.0-0 <=3.0.0" - flutter: ">=3.7.0-0" + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index ddc348d0..80339e0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,13 +1,34 @@ name: flutter_unit -description: A new Flutter application. +description: All Platform Flutter Experience App. publish_to: none -version: 2.8.0 +version: 3.1.0+2002 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts - environment: - sdk: ">=2.17.1 <=3.0.0" + sdk: ">=3.5.0 <4.0.0" +workspace: + - modules/basic_system/app + - modules/basic_system/app_update + - modules/basic_system/authentication + - modules/basic_system/components + - modules/basic_system/l10n + - modules/basic_system/storage + - modules/basic_system/toly_ui + - modules/basic_system/utils + + - modules/knowledge_system/algorithm + - modules/knowledge_system/artifact + - modules/knowledge_system/awesome + - modules/knowledge_system/layout + + - modules/painting_system/draw_system + + - modules/tools_system/treasure_tools + + - modules/widget_system/widget_module + - modules/widget_system/widgets + - modules/knowledge_system/note dependencies: flutter: @@ -16,68 +37,64 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.4 - flutter_bloc: ^8.0.1 # 状态管理 - stream_transform: ^2.0.0 - equatable: ^2.0.3 # 相等辅助 - archive: ^3.3.6 # 解压 - package_info_plus: ^1.3.0 # 应用包信息 - r_upgrade: ^0.3.8+2 # 应用升级 - - sqflite: ^2.0.2+1 # 数据库 - sqflite_common_ffi: ^2.1.1 # 数据库 - shared_preferences: ^2.0.13 # xml 固化 - path_provider: ^2.0.11 # 路径 - - dio: ^4.0.4 # 网络请求 + # 路由与状态管理 + go_router: ^14.2.0 # 路由管理 + flutter_bloc: ^8.1.6 # 状态管理 + + ## fx 架构 + fx_platform_adapter: 0.0.3 # 平台适配器 + fx_go_router_ext: 0.0.6+1 # 路由 + fx_dao: 0.0.3+4 + fx_dio: 0.0.4+3 + fx_boot_starter: 0.1.1 # app 启动器 + fx_trace: 0.0.5+5 # 异常追踪/监听 + + # 数据与持久化 + dio: ^5.4.3+1 # 网络请求 + shared_preferences: ^2.5.3 # xml 固化 jwt_decoder: ^2.0.1 # jwt 解析 - - toggle_rotate: ^1.0.1 + path_provider: ^2.1.5 # 路径 + + # 平台功能 +# connectivity_plus: ^6.1.4 # 网络状态 + url_launcher: ^6.3.1 # url + archive: ^4.0.6 # 解压 + file_picker: ^10.1.9 # 文件选择器 + share_plus: ^10.1.4 # 文字分享 + package_info_plus: 8.1.4 + + # 视图展示 + tolyui: 0.0.4+10 # tolyui + refresh: ^1.0.1 # 下拉刷新 + dash_painter: ^1.0.2 # 虚线 flutter_star: ^1.0.2 # 星星组件 - dash_painter: ^1.0.2 - wrapper: ^1.0.2 - yaml_modify: ^1.0.1 - url_launcher: ^6.1.9 # url - share_plus: ^6.3.1 # 文字分享 - flutter_svg: ^2.0.1 - intl: ^0.17.0 - platform: ^3.1.0 - image: ^3.1.0 - flutter_spinkit: ^5.1.0 # loading - flutter_markdown: ^0.6.4 # markdown -# file_selector: ^0.9.2+2 - file_picker: ^5.2.5 - window_manager: ^0.2.8 #桌面尺寸 - widget_repository: - path: packages/widget_repository - utils: - path: packages/utils - db_storage: - path: packages/db_storage - widgets: - path: packages/widgets - authentication: - path: packages/authentication - app_config: - path: packages/app_config - app_update: - path: packages/app_update - components: - path: packages/components - widget_module: - path: packages/widget_module - old_fancy_mobile_ui: - path: packages/old_fancy_mobile_ui - + flutter_spinkit: ^5.2.0 # loading + toggle_rotate: ^1.0.1 # 点击旋转 + wrapper: ^1.0.2 # 气泡包裹 + webview_flutter: ^4.2.4 # webview + flutter_markdown: ^0.7.2+1 # markdown + flutter_svg: ^2.0.17 # svg 展示 + + # 逻辑处理 + image: ^4.0.17 # 图像处理 + equatable: ^2.0.5 # 相等辅助 + uuid: ^4.5.1 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^4.0.0 + +dependency_overrides: + web: ^1.0.0 + intl: 0.20.2 flutter: + generate: true uses-material-design: true assets: - assets/images/ - assets/data/ +# - assets/data/web/ - assets/images/head_icon/ - assets/images/widgets/ - assets/flutter.db @@ -86,7 +103,7 @@ flutter: fonts: # 配置字体,可配置多个,支持ttf和otf,ttc等字体资源 - family: TolyIcon fonts: - - asset: assets/iconfont/iconfont.ttf + - asset: assets/iconfont/toly_icon.ttf - family: IndieFlower #字体名 fonts: - asset: assets/fonts/IndieFlower-Regular.ttf @@ -104,9 +121,13 @@ flutter: - asset: assets/fonts/ComicNeue-Regular.ttf - family: CHOPS fonts: - - asset: assets/fonts/CHOPS.TTF - + - asset: assets/fonts/CHOPS.ttf +toly: + icon: + src_zip: '' + assets_dir: 'assets/iconfont' + file_dist: 'packages/app/lib/app/res/toly_icon.dart' diff --git a/test/app_update_test.dart b/test/app_update_test.dart new file mode 100644 index 00000000..235abe89 --- /dev/null +++ b/test/app_update_test.dart @@ -0,0 +1,11 @@ +import 'package:app/app.dart'; +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void main() async { + FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); + + UpgradeApi api = UnitUpgradeApi(); + ApiRet info = await api.fetch(1,'zh'); + print(info.data); +} diff --git a/test/size.dart b/test/size.dart new file mode 100644 index 00000000..d942eabe --- /dev/null +++ b/test/size.dart @@ -0,0 +1,14 @@ +import 'dart:io'; +import 'package:path/path.dart' as p; +void main() async{ + Directory directory=Directory(r'D:\Projects\Flutter\Github\FlutterUnit\build_tools\output'); + List files = directory.listSync(); + Map map = {}; + for(FileSystemEntity file in files){ + if(file is File){ + map[p.basename(file.path)] = file.statSync().size; + } + } + + print(map); +} diff --git a/test/yaml_parser_test.dart b/test/yaml_parser_test.dart deleted file mode 100644 index 727198b3..00000000 --- a/test/yaml_parser_test.dart +++ /dev/null @@ -1,52 +0,0 @@ - -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; -// import 'package:yaml/yaml.dart'; -import 'package:yaml_modify/yaml_modify.dart'; - -void main(){ - final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; - File pubspecFile = File(filePath); - final String pubspec = pubspecFile.readAsStringSync(); - print(pubspec); - - // YamlEditor doc = YamlEditor(pubspec); - // print(doc); - final doc = loadYaml(pubspec); - print(doc); - - YamlList fontsList = doc['flutter']['fonts'] as YamlList; - - final modifiableDoc = getModifiableNode(doc); - final modifiableList = getModifiableNode(fontsList); - modifiableList.removeWhere((e) => e['family'] == 'TolyIcon'); - modifiableList.add( - YamlMap.wrap({ - 'family': 'TolyIcon3', - 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) - }) - ); - modifiableDoc['flutter']['fonts'] = modifiableList; - final strYaml = toYamlString(modifiableDoc); - print(modifiableList); - - // // YamlMap flutterNode = doc[]; - // doc.update('flutter', (value) { - // // YamlList fontsNode = value as YamlList; - // // List filter = fontsNode.where((e) => e['family']!='TolyIcon').toList(); - // - // return YamlMap.wrap({ - // 'family': 'TolyIcon3', - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) - // }); - // }); - - // YamlList fontsList = doc['flutter']['fonts'] as YamlList; - // - - // // doc. - print(doc); - -} \ No newline at end of file diff --git a/test/yaml_parser_test2.dart b/test/yaml_parser_test2.dart deleted file mode 100644 index da19f887..00000000 --- a/test/yaml_parser_test2.dart +++ /dev/null @@ -1,65 +0,0 @@ - -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; -// import 'package:yaml/yaml.dart'; -import 'package:yaml_modify/yaml_modify.dart'; - -void main(){ - String familyName = 'TolyIcon'; - String fontAssetsDist = 'assets/iconfont/iconfont.ttf'; - - // final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; - final String filePath = r'E:\Projects\Flutter\Work\toly_image_edit\pubspec.yaml'; - File pubspecFile = File(filePath); - - List lines = pubspecFile.readAsLinesSync(); - - RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); - bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); - - if(!hasFonts){ - // 当前没有 fonts 节点,需要添加到 flutter 节点下 - int index = lines.indexWhere((e) => e.startsWith('flutter:')); - - List fonts = [ - ' fonts:', - ' - family: TolyIcon', - ' fonts:', - ' - asset: assets/iconfont/iconfont.ttf', - ]; - - lines.insertAll(index+1, fonts); - print(lines); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - // 存在 fonts 节点,查询 family ,有没有当前字体图标 - bool hasTargetFamily = false; - RegExp regExp = RegExp(r'^ +- family: +(\w+)'); - - for(int i=0;i e.startsWith(fontsRegex)); - List fonts = [ - ' - family: TolyIcon', - ' fonts:', - ' - asset: $fontAssetsDist', - ]; - lines.insertAll(index+1, fonts); - print(lines); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - -} \ No newline at end of file diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 00000000..8aaa46ac Binary files /dev/null and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 00000000..b749bfef Binary files /dev/null and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 00000000..88cfd48d Binary files /dev/null and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 00000000..eb9b4d76 Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 00000000..d69c5669 Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 00000000..437e36b3 --- /dev/null +++ b/web/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + flutter_unit + + + + + +
+
+
+ +
Flutter Unit Loading...
+
+
+
+ + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 00000000..04dec196 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutter_unit", + "short_name": "flutter_unit", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/web/splash.gif b/web/splash.gif new file mode 100644 index 00000000..36293e6b Binary files /dev/null and b/web/splash.gif differ diff --git a/web/splash.js b/web/splash.js new file mode 100644 index 00000000..84030388 --- /dev/null +++ b/web/splash.js @@ -0,0 +1,16 @@ +window.addEventListener('load', function(ev) { + // Download main.dart.js + _flutter.loader.load({ + {{flutter_js}} + {{flutter_build_config}} + serviceWorker: { + serviceWorkerVersion: {{flutter_service_worker_version}}, + }, + onEntrypointLoaded: function(engineInitializer) { + engineInitializer.initializeEngine().then(function(appRunner) { + document.getElementById("app_splash")?.remove(); + appRunner.runApp(); + }); + } +}); +}) \ No newline at end of file diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 115100c0..d05a061a 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -99,3 +99,6 @@ install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" CONFIGURATIONS Profile;Release COMPONENT Runtime) + +# add libs dll to release +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/libs/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/runner/Release) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 930d2071..903f4899 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -92,7 +97,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 02e0e713..a6068005 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,14 +6,17 @@ #include "generated_plugin_registrant.h" -#include +#include +#include #include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { - ScreenRetrieverPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index ce565c40..7bf92b33 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,7 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST - screen_retriever + file_selector_windows + screen_retriever_windows share_plus url_launcher_windows window_manager diff --git a/sqlite3.dll b/windows/libs/sqlite3.dll similarity index 100% rename from sqlite3.dll rename to windows/libs/sqlite3.dll diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index b9e550fb..17411a8a 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -20,6 +20,13 @@ add_executable(${BINARY_NAME} WIN32 # that need different build settings. apply_standard_settings(${BINARY_NAME}) +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + # Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 4dfd8f4c..adc0b5bc 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -60,14 +60,14 @@ IDI_APP_ICON ICON "resources\\app_icon.ico" // Version // -#ifdef FLUTTER_BUILD_NUMBER -#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD #else -#define VERSION_AS_NUMBER 1,0,0 +#define VERSION_AS_NUMBER 1,0,0,0 #endif -#ifdef FLUTTER_BUILD_NAME -#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION #else #define VERSION_AS_STRING "1.0.0" #endif